从 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-llm
mesh-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.toml):
name = "my-first-plugin" version = "0.1.0"五、让插件长出界面:Web UI 投影进阶
如果你觉得纯命令行工具不过瘾,mesh-llm 还支持给插件加一个 Web UI。宿主会在控制台里为你的插件生成一个导航入口,让你的页面直接嵌入 mesh-llm 控制台。清单里用web_ui区块声明(参考示例docs/plugins/exemplars/web-ui/manifest.rs):
web_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_DIR=target/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_DIR=target/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_ENDPOINT(IPC 端点)、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),仅供参考