数据截至 (上游 commit 8d6cbee1b527)
插件化内核:通道、模型商、工具都是扩展
30 秒导读: OpenClaw 把「接哪个 IM」「用哪个模型商」「有哪些工具」全部外包给插件。内核自己只做四件事——扫出候选、读清单、按需导入、把注册结果记进一张表。这一章讲清楚:为什么仓库里躺着 149 个插件,而网关启动时可能一个都不导入。
本章不覆盖:通道运行时的消息语义(见 03-inbound-and-sessions)、工具执行与沙箱策略(见 06-tools-skills-sandbox)。网关进程形态见 01-gateway-control-plane。
1. 这是什么(零基础也能懂)
一句话定义: OpenClaw 的插件内核是一套「先读元数据、后导入代码」的扩展 装载机制,让通道(Telegram/Discord/…)、模型商(Anthropic/OpenAI/…)、工具、命令、HTTP 路由都以同一种方式接进来。
先看规模
克隆里 extensions/ 下的实际情况:
| 项目 | 数量 | 说明 |
|---|---|---|
| 子目录总数 | 151 | find extensions -maxdepth 1 -type d |
带 openclaw.plugin.json 的插件 | 149 | 其余是共享辅助包 |
| Plugin SDK 对外子路径 | 312 | package.json 的 exports 共 314 条,其中 312 条是 ./plugin-sdk* |
这个数量级的扩展如果全部在启动时导入,进程会被拖垮。内核的全部设计张力就在这里。
解决什么问题
假设你要让一个 AI agent 同时接 Telegram、Discord、飞书,还要能在 Anthropic 和 OpenAI 之间切换,再挂几个自定义工具。最笨的做法是把这些代码全写进主程序,于是主程序里到处是 if (channel === "telegram")。
OpenClaw 的做法是反过来:主程序不知道 "telegram" 这个词。它只知道「有一个插件声明自己拥有 channels: ["telegram"]」,并在真的需要 telegram 通道时,才去把那个插件的代码导进来。