プロバイダープラグインの構築
このガイドでは、OpenClawにモデルプロバイダー (LLM)を追加するプロバイダープラグインの構築方法を説明します。最後には、モデルカタログ、 APIキー認証、および動的モデル解決を備えたプロバイダーが完成します。まだOpenClawプラグインを一度も作成したことがない場合は、まず
基本的なパッケージ構造とmanifest設定について はじめに を読んでください。
手順
パッケージとmanifest
providerAuthEnvVars を宣言し、OpenClawが
プラグインランタイムを読み込まずに認証情報を検出できるようにします。modelSupport は任意で、
acme-large のような短縮モデルIDから、ランタイムフックが存在する前でも
OpenClawがプロバイダープラグインを自動読み込みできるようにします。プロバイダーを
ClawHubで公開する場合は、package.json 内の
openclaw.compat と openclaw.build フィールドが必須です。プロバイダーを登録する
最小限のプロバイダーに必要なのは、これで動作するプロバイダーになります。ユーザーは
認証フローで、オンボーディング中に
id、label、auth、catalog です:index.ts
openclaw onboard --acme-ai-api-key <key> を実行して、
acme-ai/acme-large をモデルとして選択できるようになります。APIキー認証を持つ1つのテキストプロバイダーと、単一のcatalogベースランタイムだけを登録するバンドル済みプロバイダーでは、
より狭い defineSingleProviderPluginEntry(...) ヘルパーを優先してください:models.providers.*、エイリアス、および
エージェントのデフォルトモデルも書き換える必要がある場合は、
openclaw/plugin-sdk/provider-onboard のpresetヘルパーを使ってください。最も狭いヘルパーは
createDefaultModelPresetAppliers(...)、
createDefaultModelsPresetAppliers(...)、および
createModelCatalogPresetAppliers(...) です。プロバイダーのネイティブエンドポイントが通常の
openai-completions トランスポート上でstreamed usageブロックをサポートする場合、
プロバイダーIDチェックをハードコードする代わりに
openclaw/plugin-sdk/provider-catalog-shared の共有catalogヘルパーを優先してください。
supportsNativeStreamingUsageCompat(...) と
applyProviderNativeStreamingUsageCompat(...) は
エンドポイントcapabilityマップからサポートを検出するため、カスタムプロバイダーIDを使うプラグインでも
ネイティブMoonshot/DashScope系エンドポイントをopt inできます。動的モデル解決を追加する
プロバイダーが任意のモデルID(プロキシやルーターのようなもの)を受け付ける場合は、
解決にネットワーク呼び出しが必要な場合は、非同期ウォームアップに
resolveDynamicModel を追加します:prepareDynamicModel を使ってください。resolveDynamicModel は完了後に再度実行されます。ランタイムフックを追加する(必要に応じて)
ほとんどのプロバイダーに必要なのは 現在利用可能なreplayファミリー:
実際のバンドル済み例:
実際のバンドル済み例:
catalog + resolveDynamicModel だけです。必要に応じて
フックを段階的に追加してください。共有ヘルパービルダーは、現在最も一般的なreplay/tool-compat
ファミリーをカバーしているため、プラグインは通常、各フックを1つずつ手作業で配線する必要がありません:| Family | 配線される内容 |
|---|---|
openai-compatible | OpenAI互換トランスポート向けの共有OpenAIスタイルreplayポリシー。tool-call-idサニタイズ、assistant-first順序修正、およびトランスポートが必要とする場合の汎用Geminiターン検証を含む |
anthropic-by-model | modelId によって選ばれるClaude対応replayポリシー。これによりAnthropic-messageトランスポートは、解決済みモデルが実際にClaude IDである場合にのみClaude固有のthinking-blockクリーンアップを受けます |
google-gemini | ネイティブGemini replayポリシーに加え、bootstrap replayサニタイズとタグ付きreasoning-output mode |
passthrough-gemini | OpenAI互換プロキシトランスポート経由で動作するGeminiモデル向けのGemini thought-signatureサニタイズ。ネイティブGemini replay検証やbootstrap rewriteは有効にしません |
hybrid-anthropic-openai | 1つのプラグイン内でAnthropic-messageとOpenAI互換モデル画面を混在させるプロバイダー向けのハイブリッドポリシー。任意のClaude専用thinking-block除去はAnthropic側に限定されます |
googleとgoogle-gemini-cli:google-geminiopenrouter、kilocode、opencode、opencode-go:passthrough-geminiamazon-bedrockとanthropic-vertex:anthropic-by-modelminimax:hybrid-anthropic-openaimoonshot、ollama、xai、zai:openai-compatible
| Family | 配線される内容 |
|---|---|
google-thinking | 共有stream経路上のGemini thinkingペイロード正規化 |
kilocode-thinking | 共有proxy stream経路上のKilo reasoningラッパー。kilo/auto と未サポートのproxy reasoning IDではthinking注入をスキップ |
moonshot-thinking | 設定 + /think レベルからのMoonshot binary native-thinkingペイロードマッピング |
minimax-fast-mode | 共有stream経路上のMiniMax fast-modeモデル書き換え |
openai-responses-defaults | 共有ネイティブOpenAI/Codex Responsesラッパー: attribution header、/fast/serviceTier、text verbosity、ネイティブCodex web search、reasoning-compatペイロード整形、およびResponsesコンテキスト管理 |
openrouter-thinking | proxyルート向けOpenRouter reasoningラッパー。未サポートモデル/auto のスキップを中央で処理 |
tool-stream-default-on | Z.AIのように、明示的に無効化されない限りtool streamingを有効にしたいプロバイダー向けのデフォルトオン tool_stream ラッパー |
googleとgoogle-gemini-cli:google-thinkingkilocode:kilocode-thinkingmoonshot:moonshot-thinkingminimaxとminimax-portal:minimax-fast-modeopenaiとopenai-codex:openai-responses-defaultsopenrouter:openrouter-thinkingzai:tool-stream-default-on
openclaw/plugin-sdk/provider-model-shared は、replay-family
enumと、それらのファミリーが構築に使用する共有ヘルパーもエクスポートします。一般的な公開
エクスポートには次が含まれます:ProviderReplayFamilybuildProviderReplayFamilyHooks(...)buildOpenAICompatibleReplayPolicy(...)、buildAnthropicReplayPolicyForModel(...)、buildGoogleGeminiReplayPolicy(...)、およびbuildHybridAnthropicOrOpenAIReplayPolicy(...)などの共有replayビルダーsanitizeGoogleGeminiReplayHistory(...)とresolveTaggedReasoningOutputMode()などのGemini replayヘルパーresolveProviderEndpoint(...)、normalizeProviderId(...)、normalizeGooglePreviewModelId(...)、およびnormalizeNativeXaiModelId(...)などのendpoint/modelヘルパー
openclaw/plugin-sdk/provider-stream は、family builderと、
それらのファミリーが再利用する公開ラッパーヘルパーの両方を公開します。一般的な公開
エクスポートには次が含まれます:ProviderStreamFamilybuildProviderStreamFamilyHooks(...)composeProviderStreamWrappers(...)createOpenAIAttributionHeadersWrapper(...)、createOpenAIFastModeWrapper(...)、createOpenAIServiceTierWrapper(...)、createOpenAIResponsesContextManagementWrapper(...)、およびcreateCodexNativeWebSearchWrapper(...)などの共有OpenAI/CodexラッパーcreateOpenRouterWrapper(...)、createToolStreamWrapper(...)、およびcreateMinimaxFastModeWrapper(...)などの共有proxy/providerラッパー
@openclaw/anthropic-provider は
wrapAnthropicProviderStream、resolveAnthropicBetas、
resolveAnthropicFastMode、resolveAnthropicServiceTier、および
低レベルのAnthropicラッパービルダーを、公開 api.ts /
contract-api.ts シームからエクスポートします。これらのヘルパーは、
Claude OAuth beta処理や context1m ゲーティングもエンコードするため、Anthropic固有のままです。ほかのバンドル済みプロバイダーも、その動作がファミリー間で
きれいに共有できない場合には、トランスポート固有ラッパーをローカルに保っています。現在の
例: バンドル済みxAIプラグインは、ネイティブxAI Responses整形を自身の
wrapStreamFn 内に保持しており、/fast エイリアス書き換え、デフォルト tool_stream、
未サポートstrict-toolクリーンアップ、およびxAI固有のreasoning-payload
除去を含みます。openclaw/plugin-sdk/provider-tools は現在、1つの共有
tool-schemaファミリーに加え、共有schema/compatヘルパーを公開しています:ProviderToolCompatFamilyは、現時点の共有ファミリー一覧を文書化します。buildProviderToolCompatFamilyHooks("gemini")は、Gemini安全なtool schemaを必要とするプロバイダー向けにGemini schema クリーンアップ + 診断を配線します。normalizeGeminiToolSchemas(...)とinspectGeminiToolSchemas(...)は、基礎となる公開Gemini schemaヘルパーです。resolveXaiModelCompatPatch()は、バンドル済みxAI compat patchを返します:toolSchemaProfile: "xai"、未サポートschemaキーワード、ネイティブweb_searchサポート、およびHTML entityなtool-call引数デコード。applyXaiModelCompat(model)は、同じxAI compat patchを runnerに到達する前の解決済みモデルへ適用します。
normalizeResolvedModel と
contributeResolvedModelCompat を使用します。同じpackage-rootパターンは、ほかのバンドル済みプロバイダーでも使われています:@openclaw/openai-provider:api.tsがプロバイダービルダー、 default-modelヘルパー、およびrealtime provider builderをエクスポート@openclaw/openrouter-provider:api.tsがprovider builder に加え、onboarding/configヘルパーをエクスポート
- トークン交換
- カスタムヘッダー
- ネイティブトランスポートID
- 使用量と課金
各推論呼び出し前にトークン交換が必要なプロバイダー向け:
利用可能なすべてのプロバイダーフック
利用可能なすべてのプロバイダーフック
OpenClawは次の順序でフックを呼び出します。ほとんどのプロバイダーが使うのは2〜3個だけです:
ランタイムフォールバックの注記:
| # | Hook | 使用する場面 |
|---|---|---|
| 1 | catalog | モデルカタログまたはbase URLデフォルト |
| 2 | applyConfigDefaults | 設定具現化中のプロバイダー所有グローバルデフォルト |
| 3 | normalizeModelId | ルックアップ前のレガシー/プレビューモデルIDエイリアスクリーンアップ |
| 4 | normalizeTransport | 汎用モデル組み立て前のプロバイダーファミリー api / baseUrl クリーンアップ |
| 5 | normalizeConfig | models.providers.<id> 設定を正規化 |
| 6 | applyNativeStreamingUsageCompat | 設定済みプロバイダー向けネイティブstreaming-usage compat書き換え |
| 7 | resolveConfigApiKey | プロバイダー所有のenv-marker認証解決 |
| 8 | resolveSyntheticAuth | local/self-hostedまたは設定ベースのsynthetic認証 |
| 9 | shouldDeferSyntheticProfileAuth | 保存済みsynthetic profile placeholderをenv/config認証より下位にする |
| 10 | resolveDynamicModel | 任意のupstream model IDを受け付ける |
| 11 | prepareDynamicModel | 解決前の非同期メタデータ取得 |
| 12 | normalizeResolvedModel | runner前のトランスポート書き換え |
-
normalizeConfigは、まず一致したプロバイダーを確認し、その後 実際に設定を変更するまでほかのhook対応プロバイダープラグインを順に確認します。 対応するGoogleファミリー設定エントリーを書き換えるプロバイダーフックがない場合、 バンドル済みGoogle設定正規化が引き続き適用されます。 -
resolveConfigApiKeyは、公開されている場合にプロバイダーフックを使います。バンドル済みamazon-bedrock経路は、Bedrockランタイム認証自体はAWS SDKデフォルト チェーンを使うにもかかわらず、ここにも組み込みAWS env-markerリゾルバーを持ちます。 | 13 |contributeResolvedModelCompat| 別の互換トランスポート背後にあるベンダーモデル向けcompatフラグ | | 14 |capabilities| レガシー静的capability bag。互換性専用 | | 15 |normalizeToolSchemas| 登録前のプロバイダー所有tool-schemaクリーンアップ | | 16 |inspectToolSchemas| プロバイダー所有tool-schema診断 | | 17 |resolveReasoningOutputMode| タグ付きまたはネイティブreasoning-output契約 | | 18 |prepareExtraParams| デフォルトリクエストパラメーター | | 19 |createStreamFn| 完全カスタムのStreamFnトランスポート | | 20 |wrapStreamFn| 通常stream経路上のカスタムヘッダー/本文ラッパー | | 21 |resolveTransportTurnState| ネイティブなターンごとのヘッダー/メタデータ | | 22 |resolveWebSocketSessionPolicy| ネイティブWSセッションヘッダー/クールダウン | | 23 |formatApiKey| カスタムランタイムトークン形式 | | 24 |refreshOAuth| カスタムOAuth更新 | | 25 |buildAuthDoctorHint| 認証修復ガイダンス | | 26 |matchesContextOverflowError| プロバイダー所有overflow検出 | | 27 |classifyFailoverReason| プロバイダー所有rate-limit/overload分類 | | 28 |isCacheTtlEligible| prompt cache TTLゲーティング | | 29 |buildMissingAuthMessage| カスタムmissing-authヒント | | 30 |suppressBuiltInModel| 古いupstream行を隠す | | 31 |augmentModelCatalog| synthetic forward-compat行 | | 32 |isBinaryThinking| 二値thinkingオン/オフ | | 33 |supportsXHighThinking|xhighreasoningサポート | | 34 |resolveDefaultThinkingLevel| デフォルト/thinkポリシー | | 35 |isModernModelRef| live/smokeモデル一致 | | 36 |prepareRuntimeAuth| 推論前のトークン交換 | | 37 |resolveUsageAuth| カスタムusage認証情報解析 | | 38 |fetchUsageSnapshot| カスタムusage endpoint | | 39 |createEmbeddingProvider| メモリ/検索向けのプロバイダー所有embedding adapter | | 40 |buildReplayPolicy| カスタムtranscript replay/compactionポリシー | | 41 |sanitizeReplayHistory| 汎用クリーンアップ後のプロバイダー固有replay書き換え | | 42 |validateReplayTurns| 埋め込みrunner前の厳密なreplay-turn検証 | | 43 |onModelSelected| 選択後コールバック(例: telemetry) | 詳細な説明と実例については、 Internals: Provider Runtime Hooks を参照してください。
追加capabilityを追加する(任意)
プロバイダープラグインは、テキスト推論に加えて、speech、realtime transcription、realtime
voice、media understanding、image generation、video generation、web fetch、
およびweb searchを登録できます:OpenClawはこれを hybrid-capability プラグインとして分類します。これは
企業向けプラグイン(ベンダーごとに1プラグイン)に推奨されるパターンです。詳細は
Internals: Capability Ownership を参照してください。
ClawHubに公開する
プロバイダープラグインは、ほかの外部コードプラグインと同じ方法で公開します:clawhub package publish を使用する必要があります。
ファイル構造
catalog順序リファレンス
catalog.order は、組み込み
プロバイダーに対してあなたのcatalogがいつマージされるかを制御します:
| Order | タイミング | 用途 |
|---|---|---|
simple | 第1パス | 単純なAPIキープロバイダー |
profile | simpleの後 | auth profileで制御されるプロバイダー |
paired | profileの後 | 複数の関連エントリーを合成する |
late | 最終パス | 既存プロバイダーを上書きする(衝突時に勝つ) |
次のステップ
- Channel Plugins — プラグインがchannelも提供する場合
- SDK Runtime —
api.runtimeヘルパー(TTS、search、subagent) - SDK Overview — 完全なsubpath importリファレンス
- Plugin Internals — フック詳細とバンドル済み例