插件(扩展)
快速开始(刚接触插件?)
插件可以是以下两种之一:
- 原生 OpenClaw 插件(
openclaw.plugin.json+ 运行时模块),或 - 兼容的 bundle(
.codex-plugin/plugin.json或.claude-plugin/plugin.json)
两者都会显示在 openclaw plugins 下,但只有原生 OpenClaw 插件会在进程内执行运行时代码。
大多数情况下,当你想要某项核心 OpenClaw 尚未内置的功能时,就会使用插件(或者你希望将可选功能保留在主安装之外)。
快捷路径:
- 查看当前已加载的内容:
openclaw plugins list
- 安装官方插件(示例:Voice Call):
openclaw plugins install @openclaw/voice-call
Npm 规格仅支持 registry-only(包名 + 可选的 精确版本 或 dist-tag)。
Git/URL/file 规格和 semver 范围都会被拒绝。
裸规格和 @latest 会停留在稳定通道。如果 npm 将其中任一解析为预发布版本,OpenClaw 会停止并要求你通过预发布标签(例如 @beta/@rc)或精确的预发布版本显式选择加入。
- 重启 Gateway 网关,然后在
plugins.entries.<id>.config下进行配置。
查看 Voice Call 获取一个具体的插件示例。 想找第三方列表?请查看 Community plugins。 需要了解 bundle 兼容性细节?请查看 Plugin bundles。
对于兼容的 bundle,可从本地目录或归档文件安装:
openclaw plugins install ./my-bundle
openclaw plugins install ./my-bundle.tgz
架构
OpenClaw 的插件系统有四层:
- 清单 + 发现
OpenClaw 会从已配置路径、工作区根目录、全局扩展根目录以及随附扩展中查找候选插件。发现过程会先读取原生
openclaw.plugin.json清单以及受支持的 bundle 清单。 - 启用 + 验证 核心会决定某个已发现插件是启用、禁用、阻止,还是被选用于某个独占插槽(例如内存)。
- 运行时加载 原生 OpenClaw 插件通过 jiti 在进程内加载,并将功能注册到一个中央注册表中。兼容的 bundle 会被规范化为注册表记录,而不会导入运行时代码。
- 表面消费 OpenClaw 的其余部分会读取注册表,以公开工具、渠道、提供商设置、hooks、HTTP 路由、CLI 命令和服务。
重要的设计边界:
- 发现 + 配置验证应基于 manifest/schema 元数据 运行,而不执行插件代码
- 原生运行时行为来自插件模块的
register(api)路径
这种拆分让 OpenClaw 能够在完整运行时激活之前,就验证配置、解释缺失/被禁用的插件,并构建 UI/schema 提示。
兼容的 bundle
OpenClaw 还识别两种兼容的外部 bundle 布局:
- Codex 风格 bundle:
.codex-plugin/plugin.json - Claude 风格 bundle:
.claude-plugin/plugin.json,或者没有清单的默认 Claude 组件布局 - Cursor 风格 bundle:
.cursor-plugin/plugin.json
它们会在插件列表中显示为 format=bundle,并在详细/info 输出中显示 codex 或 claude 子类型。
有关精确的检测规则、映射行为和当前支持矩阵,请参阅 Plugin bundles。
目前,OpenClaw 将这些内容视为 能力包,而不是原生运行时插件:
- 当前支持:捆绑的
skills - 当前支持:Claude
commands/markdown 根目录,映射到常规 OpenClaw 技能加载器 - 当前支持:Claude bundle
settings.json默认值,用于嵌入式 Pi 智能体设置(会清理 shell override 键) - 当前支持:Cursor
.cursor/commands/*.md根目录,映射到常规 OpenClaw 技能加载器 - 当前支持:使用 OpenClaw hook-pack 布局的 Codex bundle hook 目录(
HOOK.md+handler.ts/handler.js) - 已检测但尚未接线:其他已声明的 bundle 能力,例如 agents、Claude hook 自动化、Cursor rules/hooks/MCP 元数据、MCP/app/LSP 元数据、输出样式
这意味着 bundle 的安装/发现/列表/info/启用都可正常工作,并且当 bundle 被启用时,bundle skills、Claude command-skills、Claude bundle settings 默认值以及兼容的 Codex hook 目录都会被加载,但 bundle 运行时代码不会在进程内执行。
Bundle hook 支持仅限于常规 OpenClaw hook 目录格式(在声明的 hook 根目录下使用 HOOK.md 加上 handler.ts/handler.js)。
供应商特定的 shell/JSON hook 运行时,包括 Claude hooks.json,当前仅会被检测,不会被直接执行。
执行模型
原生 OpenClaw 插件与 Gateway 网关 在同一进程内 运行。它们不会进行沙箱隔离。已加载的原生插件与核心代码处于相同的进程级信任边界。
这意味着:
- 原生插件可以注册工具、网络处理器、hooks 和服务
- 原生插件中的 bug 可能导致 gateway 崩溃或不稳定
- 恶意原生插件等同于在 OpenClaw 进程内部执行任意代码
兼容的 bundle 默认更安全,因为 OpenClaw 目前将它们视为元数据/内容包。在当前版本中,这主要意味着捆绑的技能。
对于非捆绑插件,请使用 allowlist 和显式安装/加载路径。将工作区插件视为开发期代码,而不是生产默认项。
重要信任说明:
plugins.allow信任的是 plugin id,而不是来源出处。- 如果某个工作区插件与某个捆绑插件具有相同 id,那么启用/加入 allowlist 后,工作区插件会有意覆盖捆绑副本。
- 这是一种正常且有用的行为,适合本地开发、补丁测试和热修复。
可用插件(官方)
- Microsoft Teams 自
2026.1.15起仅以插件形式提供;如果你使用 Teams,请安装@openclaw/msteams。 - Memory(Core)— 捆绑的内存搜索插件(默认通过
plugins.slots.memory启用) - Memory(LanceDB)— 捆绑的长期记忆插件(自动召回/捕获;设置
plugins.slots.memory = "memory-lancedb") - Voice Call —
@openclaw/voice-call - Zalo Personal —
@openclaw/zalouser - Matrix —
@openclaw/matrix - Nostr —
@openclaw/nostr - Zalo —
@openclaw/zalo - Microsoft Teams —
@openclaw/msteams - Anthropic provider 运行时 — 以
anthropic形式捆绑(默认启用) - BytePlus provider catalog — 以
byteplus形式捆绑(默认启用) - Cloudflare AI Gateway provider catalog — 以
cloudflare-ai-gateway形式捆绑(默认启用) - Google 网络搜索 + Gemini CLI OAuth — 以
google形式捆绑(网页搜索会自动加载;provider 身份验证仍需选择启用) - GitHub Copilot provider 运行时 — 以
github-copilot形式捆绑(默认启用) - Hugging Face provider catalog — 以
huggingface形式捆绑(默认启用) - Kilo Gateway provider 运行时 — 以
kilocode形式捆绑(默认启用) - Kimi Coding provider catalog — 以
kimi-coding形式捆绑(默认启用) - MiniMax provider catalog + usage + OAuth — 以
minimax形式捆绑(默认启用;拥有minimax和minimax-portal) - Mistral provider 能力 — 以
mistral形式捆绑(默认启用) - Model Studio provider catalog — 以
modelstudio形式捆绑(默认启用) - Moonshot provider 运行时 — 以
moonshot形式捆绑(默认启用) - NVIDIA provider catalog — 以
nvidia形式捆绑(默认启用) - OpenAI provider 运行时 — 以
openai形式捆绑(默认启用;同时拥有openai和openai-codex) - OpenCode Go provider 能力 — 以
opencode-go形式捆绑(默认启用) - OpenCode Zen provider 能力 — 以
opencode形式捆绑(默认启用) - OpenRouter provider 运行时 — 以
openrouter形式捆绑(默认启用) - Qianfan provider catalog — 以
qianfan形式捆绑(默认启用) - Qwen OAuth(provider 身份验证 + catalog)— 以
qwen-portal-auth形式捆绑(默认启用) - Synthetic provider catalog — 以
synthetic形式捆绑(默认启用) - Together provider catalog — 以
together形式捆绑(默认启用) - Venice provider catalog — 以
venice形式捆绑(默认启用) - Vercel AI Gateway provider catalog — 以
vercel-ai-gateway形式捆绑(默认启用) - Volcengine provider catalog — 以
volcengine形式捆绑(默认启用) - Xiaomi provider catalog + usage — 以
xiaomi形式捆绑(默认启用) - Z.AI provider 运行时 — 以
zai形式捆绑(默认启用) - Copilot Proxy(provider 身份验证)— 本地 VS Code Copilot Proxy 桥接;不同于内置的
github-copilot设备登录(已捆绑,默认禁用)
原生 OpenClaw 插件是通过 jiti 在运行时加载的 TypeScript 模块。 配置验证不会执行插件代码;它使用的是插件 manifest 和 JSON Schema。请参阅 Plugin manifest。
原生 OpenClaw 插件可以注册:
- Gateway RPC 方法
- Gateway HTTP 路由
- 智能体工具
- CLI 命令
- 后台服务
- 上下文引擎
- provider 身份验证流程和模型目录
- 用于动态模型 id、传输规范化、能力元数据、流包装、缓存 TTL 策略、缺失身份验证提示、内置模型抑制、目录增强、运行时身份验证交换以及 usage/billing 身份验证 + 快照解析的 provider 运行时 hooks
- 可选配置验证
- Skills(通过在插件 manifest 中列出
skills目录) - 自动回复命令(无需调用 AI 智能体即可执行)
原生 OpenClaw 插件与 Gateway 网关 在同一进程内 运行,因此应将其视为受信任代码。 工具编写指南:Plugin agent tools。
Provider 运行时 hooks
Provider 插件现在有两层:
- manifest 元数据:
providerAuthEnvVars,用于在运行时加载前进行低成本的环境身份验证查找 - 配置时 hooks:
catalog/ 旧版discovery - 运行时 hooks:
resolveDynamicModel、prepareDynamicModel、normalizeResolvedModel、capabilities、prepareExtraParams、wrapStreamFn、formatApiKey、refreshOAuth、buildAuthDoctorHint、isCacheTtlEligible、buildMissingAuthMessage、suppressBuiltInModel、augmentModelCatalog、isBinaryThinking、supportsXHighThinking、resolveDefaultThinkingLevel、isModernModelRef、prepareRuntimeAuth、resolveUsageAuth、fetchUsageSnapshot
OpenClaw 仍然负责通用的智能体循环、故障切换、转录处理和工具策略。这些 hooks 是 provider 特定行为的接缝,而无需整个自定义推理传输层。
当 provider 具有基于环境变量的凭据,并且你希望通用 auth/status/model-picker 路径在不加载插件运行时的情况下就能看到这些凭据时,请使用 manifest providerAuthEnvVars。
保留 provider 运行时 envVars 用于面向操作员的提示,例如新手引导标签或 OAuth client-id/client-secret 设置环境变量。
Hook 顺序
对于 model/provider 插件,OpenClaw 大致按以下顺序使用 hooks:
catalog在生成models.json期间,将 provider 配置发布到models.providers中。- 内置/已发现模型查找 OpenClaw 会先尝试常规注册表/目录路径。
resolveDynamicModel对于本地注册表中尚不存在的 provider 自有 model id,进行同步后备解析。prepareDynamicModel仅在异步模型解析路径上执行异步预热,然后再次运行resolveDynamicModel。normalizeResolvedModel在嵌入式运行器使用已解析模型之前进行最终重写。capabilities由共享核心逻辑使用的 provider 自有转录/工具元数据。prepareExtraParams在通用流选项包装器之前执行 provider 自有请求参数规范化。wrapStreamFn在应用通用包装器之后执行 provider 自有流包装器。formatApiKey当存储的 auth profile 需要转换为运行时apiKey字符串时,使用 provider 自有身份验证配置器。refreshOAuth对自定义刷新端点或刷新失败策略执行 provider 自有 OAuth 刷新覆盖。buildAuthDoctorHint当 OAuth 刷新失败时,追加 provider 自有修复提示。isCacheTtlEligible为代理/backhaul provider 提供 provider 自有提示词缓存策略。buildMissingAuthMessage用 provider 自有内容替换通用的缺失身份验证恢复消息。suppressBuiltInModel执行 provider 自有的过时上游模型抑制,并可返回面向用户的错误提示。augmentModelCatalog在发现后附加 provider 自有的合成/最终目录行。isBinaryThinking为二元 thinking provider 提供 provider 自有的开/关推理切换。supportsXHighThinking为选定模型提供 provider 自有的xhigh推理支持。resolveDefaultThinkingLevel为特定模型家族提供 provider 自有的默认/think级别。isModernModelRef提供 provider 自有的现代模型匹配器,用于 live profile 过滤器和 smoke 选择。prepareRuntimeAuth在推理前将已配置的凭据交换为实际的运行时令牌/密钥。resolveUsageAuth为/usage及相关状态表面解析 usage/billing 凭据。fetchUsageSnapshot在身份验证解析完成后,抓取并规范化 provider 特定的 usage/quota 快照。
应该使用哪个 hook
catalog:将 provider 配置和模型目录发布到models.providersresolveDynamicModel:处理本地注册表中尚未存在的透传或前向兼容 model idprepareDynamicModel:在重试动态解析之前执行异步预热(例如刷新 provider 元数据缓存)normalizeResolvedModel:在推理前重写已解析模型的传输/base URL/兼容性capabilities:发布 provider 家族和转录/工具差异,而不在核心中硬编码 provider idprepareExtraParams:在通用流包装之前设置 provider 默认值或规范化 provider 特定的每模型参数wrapStreamFn:在仍使用常规pi-ai执行路径时,添加 provider 特定的 header/payload/model 兼容补丁formatApiKey:将存储的 auth profile 转换为运行时apiKey字符串,而不在核心中硬编码 provider 令牌 blobrefreshOAuth:为不适配共享pi-ai刷新器的 provider 自主管理 OAuth 刷新buildAuthDoctorHint:在刷新失败时追加 provider 自有的身份验证修复指导isCacheTtlEligible:决定 provider/模型组合是否应使用 cache TTL 元数据buildMissingAuthMessage:用 provider 特定恢复提示替换通用 auth-store 错误suppressBuiltInModel:隐藏过时上游条目,并可在直接解析失败时返回 provider 自有错误augmentModelCatalog:在发现和配置合并后附加合成/最终目录行isBinaryThinking:在/think中公开二元开/关推理 UX,而不硬编码 provider idsupportsXHighThinking:让特定模型启用xhigh推理级别resolveDefaultThinkingLevel:将 provider/模型默认推理策略移出核心isModernModelRef:将 live/smoke 模型家族包含规则保留在 provider 中prepareRuntimeAuth:将已配置凭据交换为请求所用的实际短期运行时令牌/密钥resolveUsageAuth:为 usage/billing 端点解析 provider 自有凭据,而不在核心中硬编码令 牌解析fetchUsageSnapshot:由 provider 自主管理 usage 端点抓取/解析,而核心继续负责摘要扇出和格式化
经验法则:
- provider 拥有目录或 base URL 默认值:使用
catalog - provider 接受任意上游 model id:使用
resolveDynamicModel - provider 在解析未知 id 前需要网络元数据:添加
prepareDynamicModel - provider 需要传输重写但仍使用核心传输:使用
normalizeResolvedModel - provider 需要转录/provider 家族差异:使用
capabilities - provider 需要默认请求参数或按 provider 清理参数:使用
prepareExtraParams - provider 需要请求 header/body/model 兼容包装而不使用自定义传输:使用
wrapStreamFn - provider 在 auth profile 中存储额外元数据并需要自定义运行时令牌格式:使用
formatApiKey - provider 需要自定义 OAuth 刷新端点或刷新失败策略:使用
refreshOAuth - provider 在刷新失败后需要 provider 自有身份验证修复指导:使用
buildAuthDoctorHint - provider 需要特定于代理的 cache TTL 门控:使用
isCacheTtlEligible - provider 需要 provider 特定的缺失身份验证恢复提示:使用
buildMissingAuthMessage - provider 需要隐藏过时上游条目或用厂商提示替换它们:使用
suppressBuiltInModel - provider 需要在
models list和选择器中添加合成的前向兼容条目:使用augmentModelCatalog - provider 仅提供二元 thinking 开/关:使用
isBinaryThinking - provider 只希望部分模型启用
xhigh:使用supportsXHighThinking - provider 拥有某个模型家族默认
/think策略:使用resolveDefaultThinkingLevel - provider 拥有 live/smoke 首选模型匹配:使用
isModernModelRef - provider 需要令牌交换或短期请求凭据:使用
prepareRuntimeAuth - provider 需要自定义 usage/quota 令牌解析或不同的 usage 凭据:使用
resolveUsageAuth - provider 需要 provider 特定的 usage 端点或负载解析器:使用
fetchUsageSnapshot
如果 provider 需要完全自定义的线协议或自定义请求执行器,那属于另一类扩展。这些 hooks 适用于仍运行在 OpenClaw 常规推理循环上的 provider 行为。
Provider 示例
api.registerProvider({
id: "example-proxy",
label: "Example Proxy",
auth: [],
catalog: {
order: "simple",
run: async (ctx) => {
const apiKey = ctx.resolveProviderApiKey("example-proxy").apiKey;
if (!apiKey) {
return null;
}
return {
provider: {
baseUrl: "https://proxy.example.com/v1",
apiKey,
api: "openai-completions",
models: [{ id: "auto", name: "Auto" }],
},
};
},
},
resolveDynamicModel: (ctx) => ({
id: ctx.modelId,
name: ctx.modelId,
provider: "example-proxy",
api: "openai-completions",
baseUrl: "https://proxy.example.com/v1",
reasoning: false,
input: ["text"],
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: 128000,
maxTokens: 8192,
}),
prepareRuntimeAuth: async (ctx) => {
const exchanged = await exchangeToken(ctx.apiKey);
return {
apiKey: exchanged.token,
baseUrl: exchanged.baseUrl,
expiresAt: exchanged.expiresAt,
};
},
resolveUsageAuth: async (ctx) => {
const auth = await ctx.resolveOAuthToken();
return auth ? { token: auth.token } : null;
},
fetchUsageSnapshot: async (ctx) => {
return await fetchExampleProxyUsage(ctx.token, ctx.timeoutMs, ctx.fetchFn);
},
});
内置示例
- Anthropic 使用
resolveDynamicModel、capabilities、buildAuthDoctorHint、resolveUsageAuth、fetchUsageSnapshot、isCacheTtlEligible、resolveDefaultThinkingLevel和isModernModelRef,因为它拥有 Claude 4.6 前向兼容、provider 家族提示、身份验证修复指导、usage 端点集成、提示词缓存资格以及 Claude 默认/自适应 thinking 策略。 - OpenAI 使用
resolveDynamicModel、normalizeResolvedModel和capabilities,以及buildMissingAuthMessage、suppressBuiltInModel、augmentModelCatalog、supportsXHighThinking和isModernModelRef,因为它拥有 GPT-5.4 前向兼容、直接 OpenAIopenai-completions->openai-responses规范化、支持 Codex 的身份验证提示、Spark 抑制、合成 OpenAI 列表行以及 GPT-5 thinking / live-model 策略。 - OpenRouter 使用
catalog以及resolveDynamicModel和prepareDynamicModel,因为该 provider 是透传型的,可能会在 OpenClaw 静态目录更新之前暴露新的 model id。 - GitHub Copilot 使用
catalog、auth、resolveDynamicModel和capabilities,以及prepareRuntimeAuth和fetchUsageSnapshot,因为它需要 provider 自有设备登录、模型回退行为、Claude 转录差异、GitHub token -> Copilot token 交换,以及 provider 自有 usage 端点。 - OpenAI Codex 使用
catalog、resolveDynamicModel、normalizeResolvedModel、refreshOAuth和augmentModelCatalog,以及prepareExtraParams、resolveUsageAuth和fetchUsageSnapshot,因为它仍运行在核心 OpenAI 传输之上,但拥有自己的传输/base URL 规范化、OAuth 刷新后备策略、默认传输选择、合成 Codex 目录行以及 ChatGPT usage 端点集成。 - Google AI Studio 和 Gemini CLI OAuth 使用
resolveDynamicModel和isModernModelRef,因为它们拥有 Gemini 3.1 前向兼容后备和现代模型匹配;Gemini CLI OAuth 还使用formatApiKey、resolveUsageAuth和fetchUsageSnapshot来处理令牌格式化、令牌解析和 quota 端点接线。 - OpenRouter 使用
capabilities、wrapStreamFn和isCacheTtlEligible,以便将 provider 特定的请求头、路由元数据、reasoning 补丁和提示词缓存策略从核心中移出。 - Moonshot 使用
catalog和wrapStreamFn,因为它仍使用共享 OpenAI 传输,但需要 provider 自有 thinking 负载规范化。 - Kilocode 使用
catalog、capabilities、wrapStreamFn和isCacheTtlEligible,因为它需要 provider 自有请求头、reasoning 负载规范化、Gemini 转录提示和 Anthropic cache-TTL 门控。 - Z.AI 使用
resolveDynamicModel、prepareExtraParams、wrapStreamFn、isCacheTtlEligible、isBinaryThinking、isModernModelRef、resolveUsageAuth和fetchUsageSnapshot,因为它拥有 GLM-5 后备、tool_stream默认值、二元 thinking UX、现代模型匹配,以及 usage 身份验证 + quota 抓取。 - Mistral、OpenCode Zen 和 OpenCode Go 仅使用
capabilities,以便将转录/工具差异移出核心。 - 仅目录型的捆绑 provider,例如
byteplus、cloudflare-ai-gateway、huggingface、kimi-coding、modelstudio、nvidia、qianfan、synthetic、together、venice、vercel-ai-gateway和volcengine,仅使用catalog。 - Qwen portal 使用
catalog、auth和refreshOAuth。 - MiniMax 和 Xiaomi 使用
catalog加 usage hooks,因为尽管推理仍通过共享传输运行,但它们的/usage行为由插件拥有。
加载流水线
启动时,OpenClaw 大致会执行以下步骤:
- 发现候选插件根目录
- 读取原生或兼容 bundle 的 manifest 和包元数据
- 拒绝不安全的候选项
- 规范化插件配置(
plugins.enabled、allow、deny、entries、slots、load.paths) - 决定每个候选项的启用状态
- 通过 jiti 加载已启用的原生模块
- 调用原生
register(api)hooks,并将注册内容收集到插件注册表中 - 将注册表暴露给命令/运 行时表面
安全门会在运行时执行 之前 发生。 当条目逃逸出插件根目录、路径对所有人可写,或对于非捆绑插件来说路径所有权看起来可疑时,候选项会被阻止。
清单优先行为
Manifest 是控制面的事实来源。OpenClaw 用它来:
- 识别插件
- 发现声明的渠道/skills/配置 schema 或 bundle 能力
- 验证
plugins.entries.<id>.config - 增强 Control UI 标签/占位符
- 显示安装/目录元数据
对于原生插件,运行时模块是数据面部分。它注册实际行为,例如 hooks、工具、命令或 provider 流程。
加载器缓存了什么
OpenClaw 会保留短期进程内缓存,用于:
- 发现结果
- manifest 注册表数据
- 已加载的插件注册表
这些缓存可以减少突发启动和重复命令开销。你可以将它们理解为短生命周期的性能缓存,而不是持久化存储。
运行时辅助工具
插件可以通过 api.runtime 访问部分核心辅助工具。对于电话 TTS:
const result = await api.runtime.tts.textToSpeechTelephony({
text: "Hello from OpenClaw",
cfg: api.config,
});
说明:
- 使用核心
messages.tts配置(OpenAI 或 ElevenLabs)。 - 返回 PCM 音频缓冲区 + 采样率。插件必须为 provider 重新采样/编码。
- Edge TTS 不支持电话场景。
对于 STT/转录,插件可以调用:
const { text } = await api.runtime.stt.transcribeAudioFile({
filePath: "/tmp/inbound-audio.ogg",
cfg: api.config,
// 当无法可靠推断 MIME 时可选:
mime: "audio/ogg",
});
说明:
- 使用核心媒体理解音频配置(
tools.media.audio)和 provider 后备顺序。 - 当没有生成转录输出时(例如输入被跳过/不受支持),返回
{ text: undefined }。
Gateway HTTP 路由
插件可以使用 api.registerHttpRoute(...) 公开 HTTP 端点。
api.registerHttpRoute({
path: "/acme/webhook",
auth: "plugin",
match: "exact",
handler: async (_req, res) => {
res.statusCode = 200;
res.end("ok");
return true;
},
});
路由字段:
path:Gateway 网关 HTTP 服务器下的路由路径。auth:必填。使用"gateway"以要求常规 gateway 身份验证,或使用"plugin"以进行插件管理的身份验证/webhook 验证。match:可选。"exact"(默认)或"prefix"。replaceExisting:可选。允许同一插件替换自身现有的路由注册。handler:当路由处理了请求时返回true。
说明:
api.registerHttpHandler(...)已过时。请使用api.registerHttpRoute(...)。- 插件路由必须显式声明
auth。 - 除非设置
replaceExisting: true,否则精确path + match冲突会被拒绝,而且一个插件不能替换另一个插件的路由。 - 具有不同
auth级别的重叠路由会被拒绝。请仅在相同 auth 级别上保留exact/prefix贯穿链。
Plugin SDK 导入路径
编写插件时,请使用 SDK 子路径,而不是单体式 openclaw/plugin-sdk 导入:
openclaw/plugin-sdk/core用于通用插件 API、provider 身份验证类型和共享辅助工具。openclaw/plugin-sdk/compat用于比core需要更广泛共享运行时辅助工具的捆绑/内部插件代码。openclaw/plugin-sdk/telegram用于 Telegram 渠道插件。openclaw/plugin-sdk/discord用于 Discord 渠道插件。openclaw/plugin-sdk/slack用于 Slack 渠道插件。openclaw/plugin-sdk/signal用于 Signal 渠道插件。openclaw/plugin-sdk/imessage用于 iMessage 渠道插件。openclaw/plugin-sdk/whatsapp用于 WhatsApp 渠道插件。openclaw/plugin-sdk/line用于 LINE 渠道插件。openclaw/plugin-sdk/msteams用于捆绑的 Microsoft Teams 插件表面。- 也提供捆绑扩展专用子路径:
openclaw/plugin-sdk/acpx、openclaw/plugin-sdk/bluebubbles、openclaw/plugin-sdk/copilot-proxy、openclaw/plugin-sdk/device-pair、openclaw/plugin-sdk/diagnostics-otel、openclaw/plugin-sdk/diffs、openclaw/plugin-sdk/feishu、openclaw/plugin-sdk/googlechat、openclaw/plugin-sdk/irc、openclaw/plugin-sdk/llm-task、openclaw/plugin-sdk/lobster、openclaw/plugin-sdk/matrix、openclaw/plugin-sdk/mattermost、openclaw/plugin-sdk/memory-core、openclaw/plugin-sdk/memory-lancedb、openclaw/plugin-sdk/minimax-portal-auth、openclaw/plugin-sdk/nextcloud-talk、openclaw/plugin-sdk/nostr、openclaw/plugin-sdk/open-prose、openclaw/plugin-sdk/phone-control、openclaw/plugin-sdk/qwen-portal-auth、openclaw/plugin-sdk/synology-chat、openclaw/plugin-sdk/talk-voice、openclaw/plugin-sdk/test-utils、openclaw/plugin-sdk/thread-ownership、openclaw/plugin-sdk/tlon、openclaw/plugin-sdk/twitch、openclaw/plugin-sdk/voice-call、openclaw/plugin-sdk/zalo和openclaw/plugin-sdk/zalouser。
Provider 目录
Provider 插件可以使用
registerProvider({ catalog: { run(...) { ... } } })
定义用于推理的模型目录。
catalog.run(...) 返回与 OpenClaw 写入
models.providers 相同的结构:
{ provider }表示一个 provider 条目{ providers }表示多个 provider 条目
当插件拥有 provider 特定的 model id、base URL 默认值或由身份验证控制的模型元数据时,请使用 catalog。
catalog.order 控制插件目录相对于 OpenClaw 内置隐式 provider 的合并时机:
simple:纯 API 密钥或环境变量驱动的 providerprofile:当存在 auth profile 时出现的 providerpaired:会合成多个相关 provider 条目的 providerlate:最后一轮, 在其他隐式 provider 之后
后出现的 provider 会在键冲突时胜出,因此插件可以有意用相同 provider id 覆盖内置 provider 条目。
兼容性:
discovery仍可作为旧版别名使用- 如果同时注册了
catalog和discovery,OpenClaw 会使用catalog
兼容性说明:
openclaw/plugin-sdk仍支持现有外部插件。- 新的和已迁移的捆绑插件应使用渠道或扩展专用子路径;通用表面使用
core,只有在确实需要更广泛共享辅助工具时才使用compat。
只读渠道检查
如果你的插件注册了一个渠道,建议与 resolveAccount(...) 一起实现
plugin.config.inspectAccount(cfg, accountId)。
原因:
resolveAccount(...)是运行时路径。它可以假定凭据已完全实体化,并在缺少所需 secret 时快速失败。- 只读命令路径,例如
openclaw status、openclaw status --all、openclaw channels status、openclaw channels resolve以及 Doctor/配置修复流程,不应仅为了描述配置就必须实体化运行时凭据。
推荐的 inspectAccount(...) 行为:
- 仅返回描述性的账户状态。
- 保留
enabled和configured。 - 在相关时包含凭据来源/状态字段,例如:
tokenSource、tokenStatusbotTokenSource、botTokenStatusappTokenSource、appTokenStatussigningSecretSource、signingSecretStatus
- 你无需为了报告只读可用性而返回原始令牌值。返回
tokenStatus: "available"(以及匹配的 source 字段)就足够支持状态类命令。 - 当凭据通过 SecretRef 配置,但在当前命令路径中不可用时,请使用
configured_unavailable。
这使得只读命令可以报告“已配置,但在此命令路径中不可用”,而不是崩溃或错误地将账户报告为未配置。
性能说明:
- 插件发现和 manifest 元数据使用短期进程内缓存,以减少突发启动/重载工作。
- 设置
OPENCLAW_DISABLE_PLUGIN_DISCOVERY_CACHE=1或OPENCLAW_DISABLE_PLUGIN_MANIFEST_CACHE=1可禁用这些缓存。 - 使用
OPENCLAW_PLUGIN_DISCOVERY_CACHE_MS和OPENCLAW_PLUGIN_MANIFEST_CACHE_MS调整缓存窗口。
设备发现 + 传输协议优先级
OpenClaw 按以下顺序扫描:
- 配置路径
plugins.load.paths(文件或目录)
- 工作区扩展
<workspace>/.openclaw/extensions/*.ts<workspace>/.openclaw/extensions/*/index.ts
- 全局扩展
~/.openclaw/extensions/*.ts~/.openclaw/extensions/*/index.ts
- 捆绑扩展(随 OpenClaw 一起提供;默认开启/关闭混合)
<openclaw>/extensions/*
许多捆绑的 provider 插件默认启用,这样模型目录/运行时 hooks 无需额外设置即可使用。其他插件仍需要通过 plugins.entries.<id>.enabled 或
openclaw plugins enable <id> 显式启用。
默认开启的捆绑插件示例:
bytepluscloudflare-ai-gatewaydevice-pairgithub-copilothuggingfacekilocodekimi-codingminimaxminimaxmodelstudiomoonshotnvidiaollamaopenaiopenrouterphone-controlqianfanqwen-portal-authsglangsynthetictalk-voicetogethervenicevercel-ai-gatewayvllmvolcenginexiaomi- 活跃的 memory 插槽插件(默认插槽:
memory-core)
已安装的插件默认启用,但也可以用同样方式禁用。
工作区插件 默认禁用,除非你显式启用它们或将其加入 allowlist。这是有意设计的:已检出的仓库不应悄悄变成生产 gateway 代码。
加固 说明:
- 如果
plugins.allow为空且可发现非捆绑插件,OpenClaw 会在启动时记录一条警告,其中包含 plugin id 和来源。 - 候选路径在被接受进入发现流程前会经过安全检查。当出现以下情况时,OpenClaw 会阻止候选项:
- 扩展条目解析到插件根目录之外(包括符号链接/路径遍历逃逸),
- 插件根目录/来源路径对所有人可写,
- 对于非捆绑插件来说,路径所有权可疑(POSIX owner 既不是当前 uid 也不是 root)。
- 对于缺少安装/加载路径来源信息的已加载非捆绑插件,会发出警告,以便你固定信任(
plugins.allow)或安装跟踪(plugins.installs)。
每个原生 OpenClaw 插件都必须在其根目录中包含一个 openclaw.plugin.json 文件。
如果某条路径指向一个文件,则插件根目录是该文件所在目录,并且该目录必须包含该 manifest。
兼容的 bundle 可以改为提供以下之一:
.codex-plugin/plugin.json.claude-plugin/plugin.json
Bundle 目录会从与原生插件相同的根目录中被发现。
如果多个插件解析为同一个 id,则以上顺序中的第一个匹配项胜出,优先级更低的副本会被忽略。
这意味着:
- 工作区插件会有意覆盖具有相同 id 的捆绑插件
plugins.allow: ["foo"]按 id 授权活动的foo插件,即使活动副本来自工作区而非捆绑扩展根目录- 如果你需要更严格的来源控制,请使用显式安装/加载路径,并在启用前检查解析后的插件来源