本指南逐步說明如何建置 Provider Plugin,將模型供應商 (LLM) 加入 OpenClaw。完成後,你會擁有一個具備模型目錄、 API 金鑰驗證,以及動態模型解析的供應商。Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
如果你之前沒有建置過任何 OpenClaw Plugin,請先閱讀
開始使用,了解基本套件
結構與 manifest 設定。
逐步解說
Package and manifest
步驟 1:套件與 manifest
providerAuthEnvVars,讓 OpenClaw 無需載入你的 Plugin runtime
就能偵測憑證。當某個供應商變體應重用另一個供應商 ID 的驗證時,請加入 providerAuthAliases。
modelSupport 是選用的,可讓 OpenClaw 在 runtime hook 存在之前,
從像 acme-large 這樣的簡寫模型 ID 自動載入你的 Provider Plugin。
如果你在 ClawHub 發布該供應商,package.json 中必須包含那些
openclaw.compat 和 openclaw.build 欄位。Register the provider
最小供應商需要 這就是一個可運作的供應商。使用者現在可以
id、label、auth 和 catalog:index.ts
openclaw onboard --acme-ai-api-key <key>,並選擇
acme-ai/acme-large 作為他們的模型。如果上游供應商使用的控制 token 與 OpenClaw 不同,請加入一個
小型雙向文字轉換,而不是取代串流路徑:input 會在傳輸前改寫最終系統提示詞和文字訊息內容。
output 會在 OpenClaw 解析自己的控制標記或通道傳遞之前,
改寫助理文字 delta 與最終文字。對於只註冊一個採用 API 金鑰驗證、且有單一目錄支援 runtime 的文字供應商的內建供應商,
請優先使用較窄的
defineSingleProviderPluginEntry(...) helper:buildProvider 是 OpenClaw 能解析真實供應商驗證時使用的即時目錄路徑。
它可以執行供應商專屬的探索。只有在驗證設定之前即可安全顯示的離線列,
才使用 buildStaticProvider;它不得需要憑證或發出網路請求。
OpenClaw 的 models list --all 顯示目前只會對內建 Provider Plugin 執行靜態目錄,
並使用空設定、空環境,且不提供代理程式/工作區路徑。如果你的驗證流程也需要在 onboarding 期間修補 models.providers.*、別名,
以及代理程式預設模型,請使用
openclaw/plugin-sdk/provider-onboard 中的 preset helper。最窄的 helper 是
createDefaultModelPresetAppliers(...)、
createDefaultModelsPresetAppliers(...) 和
createModelCatalogPresetAppliers(...)。當供應商的原生端點在一般 openai-completions 傳輸上支援串流 usage block 時,
請優先使用
openclaw/plugin-sdk/provider-catalog-shared 中的共用目錄 helper,
而不是硬編碼供應商 ID 檢查。supportsNativeStreamingUsageCompat(...) 和
applyProviderNativeStreamingUsageCompat(...) 會從
端點能力 map 偵測支援,因此原生 Moonshot/DashScope 風格端點即使在 Plugin 使用自訂供應商 ID 時,
仍會選擇啟用。Add dynamic model resolution
如果你的供應商接受任意模型 ID(例如 proxy 或 router),
請加入 如果解析需要網路呼叫,請使用
resolveDynamicModel:prepareDynamicModel 進行非同步
預熱 - resolveDynamicModel 會在完成後再次執行。Add runtime hooks (as needed)
大多數供應商只需要 目前可用的 replay 系列:
Available stream families today:
catalog + resolveDynamicModel。請依供應商需求
逐步加入 hook。共用 helper builder 現在涵蓋最常見的 replay/tool-compat
系列,因此 Plugin 通常不需要逐一手動接線每個 hook:| 系列 | 接入內容 | 內建範例 |
|---|---|---|
openai-compatible | OpenAI 相容傳輸的共用 OpenAI 風格 replay 政策,包括工具呼叫 ID 清理、助理優先順序修正,以及傳輸需要時的通用 Gemini-turn 驗證 | moonshot, ollama, xai, zai |
anthropic-by-model | 依 modelId 選擇的 Claude 感知 replay 政策,因此 Anthropic-message 傳輸只會在解析後的模型實際上是 Claude ID 時,取得 Claude 專屬的 thinking-block 清理 | amazon-bedrock, anthropic-vertex |
google-gemini | 原生 Gemini replay 政策,加上 bootstrap replay 清理與帶標記的推理輸出模式 | google, google-gemini-cli |
passthrough-gemini | 透過 OpenAI 相容 proxy 傳輸執行的 Gemini 模型適用的 Gemini thought-signature 清理;不會啟用原生 Gemini replay 驗證或 bootstrap 改寫 | openrouter, kilocode, opencode, opencode-go |
hybrid-anthropic-openai | 適用於在一個 Plugin 中混合 Anthropic-message 與 OpenAI 相容模型介面的供應商的混合政策;選用的 Claude-only thinking-block 移除會限制在 Anthropic 端 | minimax |
| Family | What it wires in | Bundled examples |
|---|---|---|
google-thinking | Gemini thinking payload normalization on the shared stream path | google, google-gemini-cli |
kilocode-thinking | Kilo reasoning wrapper on the shared proxy stream path, with kilo/auto and unsupported proxy reasoning ids skipping injected thinking | kilocode |
moonshot-thinking | Moonshot binary native-thinking payload mapping from config + /think level | moonshot |
minimax-fast-mode | MiniMax fast-mode model rewrite on the shared stream path | minimax, minimax-portal |
openai-responses-defaults | Shared native OpenAI/Codex Responses wrappers: attribution headers, /fast/serviceTier, text verbosity, native Codex web search, reasoning-compat payload shaping, and Responses context management | openai, openai-codex |
openrouter-thinking | OpenRouter reasoning wrapper for proxy routes, with unsupported-model/auto skips handled centrally | openrouter |
tool-stream-default-on | Default-on tool_stream wrapper for providers like Z.AI that want tool streaming unless explicitly disabled | zai |
SDK seams powering the family builders
SDK seams powering the family builders
Each family builder is composed from lower-level public helpers exported from the same package, which you can reach for when a provider needs to go off the common pattern:
openclaw/plugin-sdk/provider-model-shared-ProviderReplayFamily,buildProviderReplayFamilyHooks(...), and the raw replay builders (buildOpenAICompatibleReplayPolicy,buildAnthropicReplayPolicyForModel,buildGoogleGeminiReplayPolicy,buildHybridAnthropicOrOpenAIReplayPolicy). Also exports Gemini replay helpers (sanitizeGoogleGeminiReplayHistory,resolveTaggedReasoningOutputMode) and endpoint/model helpers (resolveProviderEndpoint,normalizeProviderId,normalizeGooglePreviewModelId,normalizeNativeXaiModelId).openclaw/plugin-sdk/provider-stream-ProviderStreamFamily,buildProviderStreamFamilyHooks(...),composeProviderStreamWrappers(...), plus the shared OpenAI/Codex wrappers (createOpenAIAttributionHeadersWrapper,createOpenAIFastModeWrapper,createOpenAIServiceTierWrapper,createOpenAIResponsesContextManagementWrapper,createCodexNativeWebSearchWrapper), DeepSeek V4 OpenAI-compatible wrapper (createDeepSeekV4OpenAICompatibleThinkingWrapper), Anthropic Messages thinking prefill cleanup (createAnthropicThinkingPrefillPayloadWrapper), and shared proxy/provider wrappers (createOpenRouterWrapper,createToolStreamWrapper,createMinimaxFastModeWrapper).openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily,buildProviderToolCompatFamilyHooks("gemini"), underlying Gemini schema helpers (normalizeGeminiToolSchemas,inspectGeminiToolSchemas), and xAI compat helpers (resolveXaiModelCompatPatch(),applyXaiModelCompat(model)). The bundled xAI plugin usesnormalizeResolvedModel+contributeResolvedModelCompatwith these to keep xAI rules owned by the provider.
@openclaw/anthropic-provider keeps wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier, and the lower-level Anthropic wrapper builders in its own public api.ts / contract-api.ts seam because they encode Claude OAuth beta handling and context1m gating. The xAI plugin similarly keeps native xAI Responses shaping in its own wrapStreamFn (/fast aliases, default tool_stream, unsupported strict-tool cleanup, xAI-specific reasoning-payload removal).The same package-root pattern also backs @openclaw/openai-provider (provider builders, default-model helpers, realtime provider builders) and @openclaw/openrouter-provider (provider builder plus onboarding/config helpers).- Token exchange
- Custom headers
- Native transport identity
- Usage and billing
For providers that need a token exchange before each inference call:
All available provider hooks
All available provider hooks
OpenClaw calls hooks in this order. Most providers only use 2-3:
Compatibility-only provider fields that OpenClaw no longer calls, such as
Runtime fallback notes:
ProviderPlugin.capabilities and suppressBuiltInModel, are not listed
here.| # | Hook | When to use |
|---|---|---|
| 1 | catalog | Model catalog or base URL defaults |
| 2 | applyConfigDefaults | Provider-owned global defaults during config materialization |
| 3 | normalizeModelId | Legacy/preview model-id alias cleanup before lookup |
| 4 | normalizeTransport | Provider-family api / baseUrl cleanup before generic model assembly |
| 5 | normalizeConfig | Normalize models.providers.<id> config |
| 6 | applyNativeStreamingUsageCompat | Native streaming-usage compat rewrites for config providers |
| 7 | resolveConfigApiKey | Provider-owned env-marker auth resolution |
| 8 | resolveSyntheticAuth | Local/self-hosted or config-backed synthetic auth |
| 9 | shouldDeferSyntheticProfileAuth | Lower synthetic stored-profile placeholders behind env/config auth |
| 10 | resolveDynamicModel | Accept arbitrary upstream model IDs |
| 11 | prepareDynamicModel | Async metadata fetch before resolving |
| 12 | normalizeResolvedModel | Transport rewrites before the runner |
| 13 | contributeResolvedModelCompat | Compat flags for vendor models behind another compatible transport |
| 14 | normalizeToolSchemas | Provider-owned tool-schema cleanup before registration |
| 15 | inspectToolSchemas | Provider-owned tool-schema diagnostics |
| 16 | resolveReasoningOutputMode | Tagged vs native reasoning-output contract |
| 17 | prepareExtraParams | Default request params |
| 18 | createStreamFn | Fully custom StreamFn transport |
| 19 | wrapStreamFn | Custom headers/body wrappers on the normal stream path |
| 20 | resolveTransportTurnState | Native per-turn headers/metadata |
| 21 | resolveWebSocketSessionPolicy | Native WS session headers/cool-down |
| 22 | formatApiKey | Custom runtime token shape |
| 23 | refreshOAuth | Custom OAuth refresh |
| 24 | buildAuthDoctorHint | Auth repair guidance |
| 25 | matchesContextOverflowError | Provider-owned overflow detection |
| 26 | classifyFailoverReason | Provider-owned rate-limit/overload classification |
| 27 | isCacheTtlEligible | Prompt cache TTL gating |
| 28 | buildMissingAuthMessage | Custom missing-auth hint |
| 29 | augmentModelCatalog | Synthetic forward-compat rows |
| 30 | resolveThinkingProfile | Model-specific /think option set |
| 31 | isBinaryThinking | Binary thinking on/off compatibility |
| 32 | supportsXHighThinking | xhigh reasoning support compatibility |
| 33 | resolveDefaultThinkingLevel | Default /think policy compatibility |
| 34 | isModernModelRef | Live/smoke model matching |
| 35 | prepareRuntimeAuth | Token exchange before inference |
| 36 | resolveUsageAuth | Custom usage credential parsing |
| 37 | fetchUsageSnapshot | Custom usage endpoint |
| 38 | createEmbeddingProvider | Provider-owned embedding adapter for memory/search |
| 39 | buildReplayPolicy | Custom transcript replay/compaction policy |
| 40 | sanitizeReplayHistory | Provider-specific replay rewrites after generic cleanup |
| 41 | validateReplayTurns | Strict replay-turn validation before the embedded runner |
| 42 | onModelSelected | Post-selection callback (e.g. telemetry) |
normalizeConfigchecks the matched provider first, then other hook-capable provider plugins until one actually changes the config. If no provider hook rewrites a supported Google-family config entry, the bundled Google config normalizer still applies.resolveConfigApiKeyuses the provider hook when exposed. The bundledamazon-bedrockpath also has a built-in AWS env-marker resolver here, even though Bedrock runtime auth itself still uses the AWS SDK default chain.resolveSystemPromptContributionlets a provider inject cache-aware system-prompt guidance for a model family. Prefer it overbefore_prompt_buildwhen the behavior belongs to one provider/model family and should preserve the stable/dynamic cache split.
Add extra capabilities (optional)
Step 5: Add extra capabilities
A provider plugin can register speech, realtime transcription, realtime voice, media understanding, image generation, video generation, web fetch, and web search alongside text inference. OpenClaw classifies this as a hybrid-capability plugin - the recommended pattern for company plugins (one plugin per vendor). See Internals: Capability Ownership.Register each capability insideregister(api) alongside your existing
api.registerProvider(...) call. Pick only the tabs you need:- 語音 (TTS)
- 即時轉錄
- 即時語音
- 媒體理解
- 圖像與影片生成
- 網頁擷取與搜尋
assertOkOrThrowProviderError(...),讓
plugins 共用有上限的錯誤本文讀取、JSON 錯誤剖析,以及
request-id 後綴。測試
步驟 6:測試
src/provider.test.ts
發布到 ClawHub
Provider plugins 的發布方式與任何其他外部程式碼 plugin 相同:clawhub package publish。
檔案結構
目錄順序參考
catalog.order 控制你的目錄相對於內建提供者的合併時機:
| 順序 | 時機 | 使用情境 |
|---|---|---|
simple | 第一輪 | 一般 API key 提供者 |
profile | simple 之後 | 受 auth profiles 控制的提供者 |
paired | profile 之後 | 合成多個相關項目 |
late | 最後一輪 | 覆寫既有提供者(衝突時勝出) |
後續步驟
- Channel Plugins - 如果你的 plugin 也提供頻道
- SDK Runtime -
api.runtimehelpers(TTS、搜尋、subagent) - SDK Overview - 完整 subpath import 參考
- Plugin Internals - hook 詳細資料與內建範例