刚接触 OpenClaw 插件?请先阅读入门指南,
了解软件包结构和清单设置。
演练
Package and manifest
步骤 1:软件包和清单
setup.providers[].envVars 让 OpenClaw 无需加载你的插件运行时即可
检测凭据。当某个提供商变体应复用另一个提供商 id 的认证时,请添加
providerAuthAliases。modelSupport 是可选项,它允许 OpenClaw 在运行时
钩子存在之前,根据 acme-large 这样的简写模型 id 自动加载你的提供商插件。
package.json 中的 openclaw.compat
和 openclaw.build 是发布到 ClawHub
所必需的(openclaw.compat.pluginApi 和 openclaw.build.openclawVersion
是两个必填字段;省略 minGatewayVersion 时会回退到
openclaw.install.minHostVersion)。Register the provider
一个最小文本提供商需要 当提供商 API 返回更丰富的元数据,并且插件需要自行将行投影为
OpenClaw 模型定义时,使用
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 作为他们的模型。实时模型发现
如果你的提供商暴露/models 风格的 API,请将提供商特定的
端点和行投影保留在你的插件中,并使用
openclaw/plugin-sdk/provider-catalog-live-runtime 处理共享的抓取
生命周期。该辅助工具提供受保护的 HTTP 抓取、提供商认证标头、
结构化 HTTP 错误、TTL 缓存和静态回退行为,而无需把
提供商策略放进 OpenClaw 核心。当实时 API 只告诉你哪些由提供商拥有的静态目录行当前可用时,
使用 buildLiveModelProviderConfig:index.ts
getCachedLiveProviderModelRows:index.ts
run 应保持由认证把关,并在没有可用凭据时返回 null。
保留离线 staticRun 或静态回退,使设置、文档、
测试和选择器表面不依赖实时网络访问。使用适合模型列表新鲜度的 TTL,
避免请求时文件系统轮询;仅当上游响应不是 OpenAI 兼容的
{ data: [{ id, object }] } 形状时,才传入提供商特定的
readRows / readModelId。如果上游提供商使用的控制标记与 OpenClaw 不同,请添加一个
小型双向文本转换,而不是替换流路径:input 会在传输前重写最终系统提示和文本消息内容。
output 会在 OpenClaw 解析自己的控制标记或渠道投递之前,
重写助手文本增量和最终文本。对于只注册一个带 API key 认证以及单个目录支持运行时的文本提供商的
内置提供商,优先使用范围更窄的
defineSingleProviderPluginEntry(...) 辅助工具:buildProvider 是实时目录路径,在 OpenClaw 可以解析真实
提供商凭证时使用。它可以执行提供商特定的发现。只有在配置凭证前
可以安全展示的离线行中才使用 buildStaticProvider;它不得需要凭据或发起网络请求。
OpenClaw 的 models list --all 显示目前只会以空配置、空环境变量且无
智能体/工作区路径的方式执行内置提供商插件的静态目录。如果你的凭证流程还需要在新手引导期间修补 models.providers.*、别名以及
智能体默认模型,请使用来自
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 不访问网络,以便生成离线目录。Add dynamic model resolution
如果你的提供商接受任意模型 ID(例如代理或路由器),
请添加 如果解析需要网络调用,请使用
resolveDynamicModel:prepareDynamicModel 进行异步预热 -
它完成后会再次运行 resolveDynamicModel。Add runtime hooks (as needed)
大多数提供商只需要 当前可用的重放系列:
当前可用的流系列:
catalog + resolveDynamicModel。请随着提供商需求逐步添加钩子。共享辅助构建器现在覆盖最常见的重放/工具兼容系列,
因此插件通常不需要逐个手动接线每个钩子:| 系列 | 接入内容 | 内置示例 |
|---|---|---|
openai-compatible | 面向 OpenAI 兼容传输的共享 OpenAI 风格重放策略,包括工具调用 ID 清理、assistant 优先顺序修复,以及传输需要时的通用 Gemini 轮次验证 | moonshot, ollama, xai, zai |
anthropic-by-model | 由 modelId 选择的 Claude 感知重放策略,因此 Anthropic 消息传输只有在解析出的模型确实是 Claude ID 时才获得 Claude 特定的 thinking 块清理 | amazon-bedrock |
native-anthropic-by-model | 与 anthropic-by-model 相同的按模型选择 Claude 策略,外加工具调用 ID 清理,以及面向必须保留供应商原生 ID 的传输的原生 Anthropic 工具使用 ID 保留 | anthropic-vertex, clawrouter |
google-gemini | 原生 Gemini 重放策略以及引导重放清理。共享系列让文本输出 Gemini CLI 保持标记式推理;直接的 google 提供商会将 resolveReasoningOutputMode 覆盖为 native,因为 Gemini API thinking 会作为原生 thought parts 到达。 | google, google-gemini-cli |
passthrough-gemini | 面向通过 OpenAI 兼容代理传输运行的 Gemini 模型的 Gemini 思维签名清理;不会启用原生 Gemini 重放验证或引导重写 | openrouter, kilocode, opencode, opencode-go |
hybrid-anthropic-openai | 面向在一个插件中混合 Anthropic 消息和 OpenAI 兼容模型表面的提供商的混合策略;可选的仅 Claude thinking 块丢弃仍限定在 Anthropic 侧 | minimax |
| 系列 | 接入内容 | 内置示例 |
|---|---|---|
google-thinking | 共享流路径上的 Gemini thinking 负载规范化 | google, google-gemini-cli |
kilocode-thinking | 共享代理流路径上的 Kilo 推理包装器,其中 kilo/auto 和不受支持的代理推理 ID 会跳过注入的 thinking | kilocode |
moonshot-thinking | 从配置 + /think 级别映射 Moonshot 二进制原生 thinking 负载 | moonshot |
minimax-fast-mode | 共享流路径上的 MiniMax 快速模式模型重写 | minimax, minimax-portal |
openai-responses-defaults | 共享原生 OpenAI/Codex Responses 包装器:归因标头、/fast/serviceTier、文本详细程度、原生 Codex Web 搜索、推理兼容负载整形,以及 Responses 上下文管理 | openai |
openrouter-thinking | 面向代理路由的 OpenRouter 推理包装器,其中不受支持模型/auto 跳过会集中处理 | openrouter |
tool-stream-default-on | 面向 Z.AI 这类希望默认启用工具流式传输、除非明确禁用的提供商的默认启用 tool_stream 包装器 | zai |
SDK seams powering the family builders
SDK seams powering the family builders
每个系列构建器都由同一包导出的较低层公共辅助函数组成,当某个提供商需要偏离常见模式时,你可以使用它们:
openclaw/plugin-sdk/provider-model-shared-ProviderReplayFamily、buildProviderReplayFamilyHooks(...),以及原始重放构建器(buildOpenAICompatibleReplayPolicy、buildAnthropicReplayPolicyForModel、buildGoogleGeminiReplayPolicy、buildHybridAnthropicOrOpenAIReplayPolicy)。还导出 Gemini 重放辅助函数(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 预填充清理(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
推理输出,让 OpenClaw 消费原生 thought parts,而无需添加
<think> / <final> prompt 指令。仅文本的 Gemini CLI 风格
后端如果解析最终 JSON/文本响应,可以保留共享的
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、不受支持的严格工具清理、xAI 特定的推理负载移除)。同样的包根模式也支撑 @openclaw/openai-provider(提供商构建器、默认模型辅助函数、实时提供商构建器)和 @openclaw/openrouter-provider(提供商构建器以及新手引导/配置辅助函数)。- Token exchange
- Custom headers
- Native transport identity
- 用量和计费
对于每次推理调用前都需要令牌交换的提供商:
常见提供商钩子
常见提供商钩子
对于模型/提供商插件,OpenClaw 大致按此顺序调用钩子。大多数提供商只使用 2-3 个。这不是完整的
运行时回退说明:
ProviderPlugin 契约;请参阅 内部机制:提供商运行时钩子,获取完整且当前准确的钩子列表和回退说明。仅为兼容而保留、OpenClaw 不再调用的提供商字段不会在此列出,例如 ProviderPlugin.capabilities 和 suppressBuiltInModel。| 钩子 | 使用时机 |
|---|---|
catalog | 模型目录或基础 URL 默认值 |
applyConfigDefaults | 配置物化期间由提供商拥有的全局默认值 |
normalizeModelId | 查找前清理旧版/预览模型 ID 别名 |
normalizeTransport | 通用模型组装前清理提供商族的 api / baseUrl |
normalizeConfig | 规范化 models.providers.<id> 配置 |
applyNativeStreamingUsageCompat | 面向配置提供商的原生流式用量兼容重写 |
resolveConfigApiKey | 提供商拥有的环境标记认证解析 |
resolveSyntheticAuth | 本地/自托管或配置支持的合成认证 |
resolveExternalAuthProfiles | 为 CLI/应用管理的凭证叠加提供商拥有的外部认证配置档案 |
shouldDeferSyntheticProfileAuth | 将合成的已存储配置档案占位符置于环境/配置认证之后 |
resolveDynamicModel | 接受任意上游模型 ID |
prepareDynamicModel | 解析前异步获取元数据 |
normalizeResolvedModel | 运行器前的传输重写 |
normalizeToolSchemas | 注册前由提供商拥有的工具 schema 清理 |
inspectToolSchemas | 提供商拥有的工具 schema 诊断 |
resolveReasoningOutputMode | 带标签与原生推理输出契约 |
prepareExtraParams | 默认请求参数 |
createStreamFn | 完全自定义的 StreamFn 传输 |
wrapStreamFn | 常规流路径上的自定义标头/正文包装器 |
resolveTransportTurnState | 原生逐轮标头/元数据 |
resolveWebSocketSessionPolicy | 原生 WS 会话标头/冷却时间 |
formatApiKey | 自定义运行时令牌结构 |
refreshOAuth | 自定义 OAuth 刷新 |
buildAuthDoctorHint | 认证修复指引 |
matchesContextOverflowError | 提供商拥有的溢出检测 |
classifyFailoverReason | 提供商拥有的速率限制/过载分类 |
isCacheTtlEligible | 提示缓存 TTL 门控 |
buildMissingAuthMessage | 自定义缺失认证提示 |
augmentModelCatalog | 合成前向兼容行(已弃用,请优先使用 registerModelCatalogProvider) |
resolveThinkingProfile | 模型特定的 /think 选项集 |
isBinaryThinking | 二元思考开/关兼容性(已弃用,请优先使用 resolveThinkingProfile) |
supportsXHighThinking | xhigh 推理支持兼容性(已弃用,请优先使用 resolveThinkingProfile) |
resolveDefaultThinkingLevel | 默认 /think 策略兼容性(已弃用,请优先使用 resolveThinkingProfile) |
isModernModelRef | 实时/冒烟模型匹配 |
prepareRuntimeAuth | 推理前的令牌交换 |
resolveUsageAuth | 自定义用量凭证解析 |
fetchUsageSnapshot | 自定义用量端点 |
createEmbeddingProvider | 提供商拥有的、用于记忆/搜索的嵌入适配器 |
buildReplayPolicy | 自定义转录回放/压缩策略 |
sanitizeReplayHistory | 通用清理后的提供商特定回放重写 |
validateReplayTurns | 嵌入式运行器前的严格回放轮次验证 |
onModelSelected | 选择后的回调(例如遥测) |
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选择该提供商的思考 UI/配置档案。resolveSystemPromptContribution允许提供商为某个模型族注入缓存感知的系统提示指引。当行为属于单个提供商/模型族并且应保留稳定/动态缓存拆分时,优先使用它,而不是旧版插件范围的before_prompt_build钩子。
添加额外能力(可选)
步骤 5:添加额外能力
提供商插件可以在文本推理之外注册嵌入、语音、实时转录、实时语音、媒体理解、图像生成、视频生成、Web 获取和 Web 搜索。OpenClaw 将其归类为混合能力插件,这是公司插件的推荐模式(每个厂商一个插件)。请参阅内部机制:能力所有权。在register(api) 中注册每项能力,并与你现有的 api.registerProvider(...) 调用放在一起。只选择你需要的标签页:- 语音(TTS)
- 实时转录
- Realtime voice
- Media understanding
- Embeddings
- Image and video generation
- Web fetch and search
assertOkOrThrowProviderError(...),这样插件就能共享受限的错误正文读取、JSON 错误解析和请求 ID 后缀。Test
步骤 6:测试
src/provider.test.ts
发布到 ClawHub
提供商插件的发布方式与任何其他外部代码插件相同:clawhub skill publish <path> 是用于发布技能文件夹的另一个命令,
不是插件包,请不要在这里使用它。
文件结构
目录顺序参考
catalog.order 控制你的目录相对于内置提供商何时合并:
| 顺序 | 时机 | 使用场景 |
|---|---|---|
simple | 第一轮 | 普通 API key 提供商 |
profile | simple 之后 | 受凭证配置文件门控的提供商 |
paired | profile 之后 | 合成多个相关条目 |
late | 最后一轮 | 覆盖现有提供商(冲突时胜出) |
后续步骤
- 渠道插件 - 如果你的插件也提供渠道
- SDK Runtime -
api.runtime辅助函数(TTS、搜索、子智能体) - SDK 概览 - 完整子路径导入参考
- 插件内部机制 - 钩子详情和内置示例