从 0 到 1 开发 mesh-llm 插件手把手编写你的第一个插件【免费下载链接】mesh-llmDistributed AI/LLM for the people. Share compute privately or publicly to power your agents and chat.项目地址: https://gitcode.com/gh_mirrors/me/mesh-llmmesh-llm 是一个面向大众的分布式 AI/LLM 项目它把多台电脑的计算力汇聚成一个网格Mesh让你可以私有或公开地共享算力为你的 Agent 和聊天应用提供动力。而插件Plugin正是 mesh-llm 生态里最灵活的扩展方式你想给 mesh-llm 加什么能力都可以通过编写一个 mesh-llm 插件来实现。本文将用最通俗的方式带你从 0 到 1 完成第一个 mesh-llm 插件的开发、打包、安装与验证全流程全程手把手无需深厚的 Rust 功底也能跟上。一、什么是 mesh-llm 插件先搞懂它的工作方式在动手写代码之前先建立整体认知。mesh-llm 的插件本质上是一个由 mesh-llm 启动的本地服务进程。它和你运行的其他独立程序类似但多了一份插件清单manifest清单里声明了插件能提供什么能力。整个插件系统有三个核心部件一条长连接控制通道每个插件进程与宿主host之间只有一条长期存活的控制连接用来做初始化、健康检查、注册清单、收发小请求。若干条短连接数据流遇到大文件上传、下载或流式响应时宿主和插件会临时协商一条独立的侧流通道避免大流量堵住控制通道防止队头阻塞。一份声明式插件清单宿主根据清单把插件能力嫁接stapling到 MCP、HTTP 等对外协议上。这里有一个关键概念值得新手注意MCP 和 HTTP 都是宿主投影Host Projection。也就是说你的插件不需要自己实现 MCP JSON-RPC 服务器也不需要自己跑 HTTP 服务——你只需要在清单里声明我要提供这个工具 / 这个路由宿主会自动帮你把这些能力暴露出去。这正是 mesh-llm 插件样板代码极少的根本原因。二、准备工作获取源码与了解目录结构开发 mesh-llm 插件前先获取项目源码并确认 Rust 工具链可用git clone https://gitcode.com/gh_mirrors/me/mesh-llm cd mesh-llm cargo --version项目里和插件开发直接相关的目录有三个建议先花几分钟浏览crates/mesh-llm-plugin/插件开发的核心 crate提供plugin!宏、运行时和协议帮助函数。crates/mesh-llm-commands/src/plugin.rs宿主侧的插件管理命令实现安装、启用、禁用等。docs/plugins/插件架构设计文档其中docs/plugins/README.md是必读的架构参考。docs/plugins/exemplars/web-ui/官方维护的完整示例插件含 Web UI也是我们这次主要参考的活教材。架构细节可以读docs/plugins/README.md它详细描述了控制会话、数据流、manifest 契约和作者体验设计。三、认识插件清单Manifest插件的身份证插件启动后第一件事就是向宿主返回一份清单manifest声明自己提供什么。清单大致包含插件身份与版本号提供的能力capabilities配置项的 JSON Schema可被宿主投影的 Web UI 页面与配置分区MCP 贡献工具、资源、提示词HTTP 贡献路由推理inference贡献需要的 mesh 通道与事件订阅声明在设计上mesh-llm 采用面向表面surface-first的 DSL插件作者思考的是我为宿主的哪个表面做贡献而不是我内部怎么实现。四、编写你的第一个插件核心清单代码我们直接对照官方示例docs/plugins/exemplars/web-ui/manifest.rs来写。先创建一个插件 crate把mesh-llm-plugin加入依赖示例见docs/plugins/exemplars/web-ui/Cargo.toml[dependencies] anyhow 1 mesh-llm-plugin { path crates/mesh-llm-plugin } serde_json 1 tokio { version 1, features [macros, rt-multi-thread] }然后编写插件的核心声明。注意plugin!宏是有顺序要求的先metadata再依次是startup_policy、provides、config、web_ui、mesh、events、mcp、http、inference最后才是生命周期钩子。省略不用的部分不需要占位use mesh_llm_plugin::{ PluginMetadata, SimplePlugin, capability, mcp, plugin, plugin_server_info, }; pub fn my_plugin() - SimplePlugin { plugin! { metadata: PluginMetadata::new( my-first-plugin, 0.1.0, plugin_server_info( my-first-plugin, 0.1.0, My First Plugin, A beginner mesh-llm plugin example, None::String, ), ), provides: [capability(hello.v1)], mcp: [ mcp::tool(greet) .description(Say hello from the plugin) .handle(|_args, _context| Box::pin(async { Ok(serde_json::json!({ message: Hello from mesh-llm plugin! })) })), ], } }这段代码做了什么它声明了一个叫my-first-plugin的插件提供了一个名为hello.v1的能力并向 MCP 暴露了一个名为greet的工具。宿主会自动为你生成tools/list、tools/call等 MCP 方法——你完全不需要自己实现 MCP 协议这就是 mesh-llm 插件开发最省心的地方。入口文件参考docs/plugins/exemplars/web-ui/src/main.rs也很简单#[tokio::main] async fn main() - anyhow::Result() { let plugin my_plugin(); PluginRuntime::run(plugin).await }再补上一个安装器要求的plugin.toml标记文件参考示例docs/plugins/exemplars/web-ui/plugin.tomlname my-first-plugin version 0.1.0五、让插件长出界面Web UI 投影进阶如果你觉得纯命令行工具不过瘾mesh-llm 还支持给插件加一个 Web UI。宿主会在控制台里为你的插件生成一个导航入口让你的页面直接嵌入 mesh-llm 控制台。清单里用web_ui区块声明参考示例docs/plugins/exemplars/web-ui/manifest.rsweb_ui_bundle(...)声明本地前端资源包根目录v1 只允许一个 bundle 根。web_ui_page(...)声明页面route值必须是 slug如overview不能是路径或 URL。web_ui_config_section(...)声明配置分区父标签页parent_tab目前只支持integrations。前端 bundle 需要导出一个registerMeshPluginUi(host)函数参考docs/plugins/exemplars/web-ui/bundle/register-mesh-plugin-ui.js它返回页面的挂载处理器。每个处理器都要返回一个带unmount()的对象用于卸载 DOM 和取消订阅。宿主只加载浏览器可直接运行的 JavaScript——它不会帮你转译 TypeScript、JSX 或 CommonJS所以发布时请打包成标准 ES Module。六、打包与本地安装最快验证方法代码写完后怎么让 mesh-llm 认识它官方示例给出了本地安装的完整命令流程见docs/plugins/exemplars/web-ui/README.md核心思路是编译出可执行文件把它和plugin.toml、bundle 资源一起打进 tar.gz然后用plugins install --archive安装到临时插件目录cargo build --release --manifest-path docs/plugins/exemplars/web-ui/Cargo.toml # 组装包结构可执行文件 plugin.toml bundle 资源 生成的 manifest mkdir -p target/package/web-ui-exemplar cp target/release/web-ui-exemplar target/package/web-ui-exemplar/ cp docs/plugins/exemplars/web-ui/plugin.toml target/package/web-ui-exemplar/ cp -R docs/plugins/exemplars/web-ui/bundle target/package/web-ui-exemplar/bundle target/release/web-ui-exemplar --print-package-manifest \ target/package/web-ui-exemplar/plugin-manifest.json tar -C target/package -czf web-ui-exemplar-0.1.0-local.tar.gz web-ui-exemplar # 安装到临时插件目录并查看信息 MESH_LLM_PLUGIN_DIRtarget/plugin-store mesh-llm plugins install \ --archive web-ui-exemplar-0.1.0-local.tar.gz --name web-ui-exemplar --version 0.1.0 MESH_LLM_PLUGIN_DIRtarget/plugin-store mesh-llm plugins info web-ui-exemplar安装成功后就进入验证环节。先初始化一个本地开发身份配置保存需要身份mesh-llm auth init --no-passphrase然后启动一个客户端节点不需要 GPU 或模型也能验证插件再用 curl 检查插件接口、资源文件和配置接口是否正常返回。验证通过后打开控制台首页你应该能看到插件页面出现在导航里。七、插件的日常管理命令mesh-llm 为插件提供了完整的生命周期管理命令全部以mesh-llm plugins开头mesh-llm plugins install 引用安装插件。支持 GitHub 仓库引用也支持本地--archive归档仅.tar.gz和.zip。mesh-llm plugins enable 插件名标记插件可被宿主加载。mesh-llm plugins disable 插件名保持已安装但禁止宿主启动它。mesh-llm plugins update 插件名解析源仓库有更新版本时才替换。mesh-llm plugins delete 插件名删除安装的归档与元数据。mesh-llm plugins info 插件名查看已安装插件的详细信息。新手常踩的坑有三个提前帮你避开插件启动依赖环境变量宿主启动外部插件时会注入MESH_LLM_PLUGIN_ENDPOINTIPC 端点、MESH_LLM_PLUGIN_TRANSPORT传输类型、MESH_LLM_PLUGIN_NAME等变量插件靠它们连接宿主不要自己硬编码。Web UI 资源路径必须是包内相对路径清单里的 bundle 路径不能是空路径、.、绝对路径、远程 URL 或含..穿越的路径。web_ui_enabled与插件进程的enabled相互独立关掉 Web UI 投影不会停掉插件进程的非界面能力比如 MCP 工具依然可用这是设计好的兼容性保证。八、总结从入门到上手的行动清单回顾一下开发一个 mesh-llm 插件只需要五步通读docs/plugins/README.md理解架构与清单契约。复制docs/plugins/exemplars/web-ui/作为起点修改元数据与能力声明。用plugin!宏声明provides、mcp、http、config等区块让宿主替你处理协议细节。编译、打 tar.gz 归档用plugins install --archive做本地安装验证。启动客户端节点用 curl 与控制台检查插件页面与工具是否生效。mesh-llm 插件开发的核心哲学是声明能力而非实现协议宿主负责 MCP、HTTP、生命周期、IPC 与能力路由你只需要专注于插件自己的业务逻辑。理解了这一点你就能把 mesh-llm 扩展成任何你想要的形态——无论是接入外部推理服务、提供团队协作工具还是给控制台加一个可视化面板。从今天开始写下你的第一个插件吧【免费下载链接】mesh-llmDistributed AI/LLM for the people. Share compute privately or publicly to power your agents and chat.项目地址: https://gitcode.com/gh_mirrors/me/mesh-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考