刚接触 OpenClaw 插件?请先阅读入门指南,
了解软件包结构和清单设置。
操作流程
1
Package 和 manifest
第 1 步:Package 和 manifest
setup.providers[].envVars 允许 OpenClaw 在不加载你的插件运行时的情况下检测凭据。当某个提供方变体应复用另一个提供方 id 的认证时,添加 providerAuthAliases。modelSupport 是可选的,允许 OpenClaw 在运行时钩子存在之前,根据 acme-large 之类的简写模型 id 自动加载你的提供方插件。对于在 ClawHub 上发布,package.json 中的 openclaw.compat 和 openclaw.build 是必需的(openclaw.compat.pluginApi 和 openclaw.build.openclawVersion 是两个必需字段;如果省略 minGatewayVersion,则会回退到 openclaw.install.minHostVersion)。2
注册提供方
一个最小的文本提供方需要 不要将
id、label、auth 和 catalog。
catalog 是提供方拥有的运行时/配置钩子;它可以调用实时
厂商 API,并返回 models.providers 条目。index.ts
registerModelCatalogProvider 是较新的控制平面目录接口,用于列表、帮助和选择器 UI,涵盖 text、voice、image_generation、video_generation 和 music_generation 行。将厂商端点调用和响应映射保留在插件中;OpenClaw 负责共享的行结构、来源标签和帮助渲染。这是一个可运行的提供方。现在,用户可以运行
openclaw onboard --acme-ai-api-key <key>,并选择
acme-ai/acme-large 作为模型。实时模型发现
如果你的提供方公开了兼容 OpenAI 的/models API,可以选择让单提供方辅助函数接入共享发现功能:liveModelDiscovery: true 是公共 Plugin SDK 契约,行为如下:对于非 Bearer 或非标准的列表端点,请传入选项,而不是
true:endpointUrl 用作无条件的备用主机。对于模型列表主机与推理主机不同的提供方,其 requireBaseUrl 检查是凭据隔离边界。如果提供方需要的模型语义超出了保守的兼容 OpenAI 投影,请仅在插件中保留该投影。将其作为 projectRows 传入;共享运行时仍负责受保护的 Fetch、提供方认证请求头、缓存接纳和静态回退。当 live API 仅告知你提供方拥有的静态目录行当前可用时,请使用 buildLiveModelProviderConfig:index.ts
run 应保持认证门控,并在没有可用凭据时返回 null。保留离线 staticRun 或静态回退,以便设置、文档、测试和选择器界面不依赖实时网络访问。使用适合模型列表新鲜度的 TTL,避免在请求时轮询文件系统;只有当上游响应不是兼容 OpenAI 的 { data: [{ id, object }] } 结构时,才传入特定于提供方的 readRows/readModelId。如果上游提供方使用的控制标记与 OpenClaw 不同,请添加一个小型的双向文本变换,而不是替换流路径:input 会在传输前重写最终的系统提示词和文本消息内容。output 会在 OpenClaw 解析
自己的控制标记或通道投递之前,重写助手文本增量和最终文本。对于只注册一个文本提供方、使用 API 密钥认证并且只有一个基于目录的运行时的打包提供方,
优先使用更窄的 defineSingleProviderPluginEntry(...) 辅助函数:buildProvider 是动态目录路径,在 OpenClaw 能解析真实提供方认证时使用。它可以执行提供方特定的发现逻辑。buildStaticProvider 仅用于离线行,这些内容在认证配置完成之前也应是安全可展示的;它不能依赖凭据,也不能发起网络请求。OpenClaw 的 models list --all 当前只会为打包的提供方插件执行静态目录,并且配置为空、环境变量为空,也没有 agent/workspace 路径。如果你的认证流程还需要在 onboarding 期间修补 models.providers.*、别名和 agent 默认模型,请使用 openclaw/plugin-sdk/provider-onboard 中的预设辅助函数。最小粒度的辅助函数有 createDefaultModelPresetAppliers(...)、createDefaultModelsPresetAppliers(...) 和 createModelCatalogPresetAppliers(...)。当某个提供方的原生端点在常规 openai-completions 传输上支持流式 usage 块时,应优先使用 openclaw/plugin-sdk/provider-catalog-shared 中共享的目录辅助函数,而不是硬编码提供方 id 判断。supportsNativeStreamingUsageCompat(...) 和 applyProviderNativeStreamingUsageCompat(...) 会根据端点能力映射检测支持情况,因此即使插件使用了自定义提供方 id,原生 Moonshot/DashScope 风格端点也仍然可以接入。上面的实时发现示例涵盖了 /models 风格的提供方 API。请将该发现逻辑保留在 catalog.run 中,并基于可用认证进行门控,同时让 staticRun 保持不依赖网络,以便离线生成目录。3
添加动态模型解析
如果你的提供方接受任意模型 ID(例如代理或路由器),请添加
如果解析需要网络调用,请使用
resolveDynamicModel:prepareDynamicModel 进行异步
预热——完成后 resolveDynamicModel 会再次运行。4
添加运行时钩子(按需)
大多数提供方只需要 当前可用的 replay 家族:
catalog + resolveDynamicModel。随着你的提供方需要,再逐步添加钩子。现在共享辅助构建器已经覆盖了最常见的 replay/tool-compat 家族,因此插件通常不需要逐个手工连接每个钩子:当前可用的 stream 家族:
驱动这些家族构建器的 SDK 接口
驱动这些家族构建器的 SDK 接口
每个家族构建器都由同一软件包导出的更底层公共辅助函数组合而成;当某个提供方需要脱离通用模式时,
你可以直接使用这些函数:
openclaw/plugin-sdk/provider-model-shared-ProviderReplayFamily、buildProviderReplayFamilyHooks(...),以及原始 replay 构建器(buildOpenAICompatibleReplayPolicy、buildAnthropicReplayPolicyForModel、buildGoogleGeminiReplayPolicy、buildHybridAnthropicOrOpenAIReplayPolicy)。还导出 Gemini replay 辅助函数(sanitizeGoogleGeminiReplayHistory、resolveTaggedReasoningOutputMode)以及端点/模型辅助函数(resolveProviderEndpoint、normalizeProviderId、normalizeGooglePreviewModelId)。openclaw/plugin-sdk/provider-stream-ProviderStreamFamily、buildProviderStreamFamilyHooks(...)、composeProviderStreamWrappers(...),以及共享的 OpenAI/Codex 包装器(createOpenAIAttributionHeadersWrapper、createOpenAIFastModeWrapper、createOpenAIServiceTierWrapper、createOpenAIResponsesContextManagementWrapper、createCodexNativeWebSearchWrapper)、DeepSeek V4 兼容 OpenAI 包装器(createDeepSeekV4OpenAICompatibleThinkingWrapper)、Anthropic Messages thinking prefill 清理(createAnthropicThinkingPrefillPayloadWrapper)、纯文本工具调用兼容(createPlainTextToolCallCompatWrapper),以及共享的代理/提供方包装器(createOpenRouterWrapper、createToolStreamWrapper、createMinimaxFastModeWrapper)。openclaw/plugin-sdk/provider-stream-shared- 面向高频提供方路径的轻量负载和事件包装器,包括createOpenAICompatibleCompletionsThinkingOffWrapper、createPayloadPatchStreamWrapper、createPlainTextToolCallCompatWrapper、normalizeOpenAICompatibleReasoningPayload(...)和setQwenChatTemplateThinking(...)。openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily、buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai")以及底层提供方 schema 辅助函数。
native reasoning output,这样 OpenClaw 就会消费原生 thought parts,而不会额外加入 <think> / <final> 提示指令。
解析最终 JSON/text 响应的仅文本 Gemini CLI 风格后端则可以保留共享的 google-gemini 标记契约。某些流式辅助函数有意保持为提供方本地。@openclaw/anthropic-provider 将 wrapAnthropicProviderStream、resolveAnthropicBetas、resolveAnthropicFastMode、resolveAnthropicServiceTier 以及更底层的 Anthropic 包装器构建器保留在其自己的公开 api.ts / contract-api.ts 接口中,因为它们编码了 Claude OAuth beta 处理和 context1m 门控。xAI 插件也将原生 xAI Responses 形态保留在自己的 wrapStreamFn 中(/fast 别名、默认 tool_stream、不支持的 strict-tool 清理、xAI 特定的 reasoning-payload 移除)。同样的软件包根模式也支撑着 @openclaw/openai-provider(提供方构建器、默认模型辅助函数、realtime 提供方构建器)以及 @openclaw/openrouter-provider(提供方构建器加 onboarding/config 辅助函数)。- Token 交换
- 自定义请求头
- 原生传输身份
- 用量和计费
对于需要在每次推理调用前进行 token 交换的提供方:
常见提供方钩子
常见提供方钩子
OpenClaw 大致会按以下顺序调用模型/提供方插件的钩子。
大多数提供方只使用其中 2~3 个。这不是完整的
ProviderPlugin
契约——完整且当前准确的钩子列表以及回退说明,请参阅内部机制:提供方运行时钩子。
此处未列出 OpenClaw 不再调用的、仅用于兼容性的提供方字段,例如
ProviderPlugin.capabilities 和 suppressBuiltInModel。运行时回退说明:
normalizeConfig会为每个提供方 id 解析一个所属插件(先匹配打包提供方,再匹配运行时插件),并且只调用该钩子——不会扫描其他提供方。Google 自己的normalizeConfig钩子负责规范化google/google-vertex/google-antigravity配置条目;它不是独立的核心回退。resolveConfigApiKey会在提供方暴露该钩子时使用它。Amazon Bedrock 在其提供方插件中保留 AWS 环境标记解析;运行时认证本身在配置为auth: "aws-sdk"时仍使用 AWS SDK 默认链。resolveThinkingProfile(ctx)会接收选定的provider、modelId、可选的合并后reasoning目录提示,以及可选的合并后模型compat事实。仅使用compat来选择提供方的 thinking UI/配置文件。resolveSystemPromptContribution允许提供方为某个模型家族注入感知缓存的系统提示词指导。当行为属于某个提供方/模型家族且应保留稳定/动态缓存分离时,优先使用它,而不是旧版的全插件before_prompt_build钩子。
5
添加额外能力(可选)
第 5 步:添加额外能力
提供方插件可以在文本推理之外同时注册 embeddings、语音、实时转写、 实时语音、媒体理解、图像生成、视频生成、网页抓取和网页搜索。OpenClaw 将这类插件归类为 hybrid-capability 插件——这是公司级插件的推荐模式 (每个厂商一个插件)。参见 内部机制:能力所有权。在register(api) 中与你现有的
api.registerProvider(...) 调用并列注册每种能力。只选择你需要的选项卡:- 语音(TTS)
- 实时转写
- 实时语音
- 媒体理解
- Embeddings
- 图像和视频生成
- 网页抓取与搜索
assertOkOrThrowProviderError(...),这样插件可以共享
有上限的错误正文读取、JSON 错误解析和 request-id 后缀。6
测试
第 6 步:测试
src/provider.test.ts
发布到 ClawHub
提供方插件与其他外部代码插件的发布方式相同:clawhub skill publish <path> 是用于发布 skill
文件夹的不同命令,而不是用于发布插件包的命令——不要在此处使用它。
文件结构
目录顺序参考
catalog.order 控制你的目录与内置提供者合并的相对时机:
下一步
- Channel Plugins - 如果你的插件还提供一个 channel
- SDK Runtime -
api.runtime辅助函数(TTS、搜索、subagent) - SDK Overview - 完整的子路径导入参考
- Plugin Internals - hook 详情和捆绑示例。