Building Provider Plugins
Panduan ini memandu Anda membangun plugin provider yang menambahkan provider model (LLM) ke OpenClaw. Pada akhirnya Anda akan memiliki provider dengan katalog model, autentikasi API key, dan resolusi model dinamis.Jika Anda belum pernah membangun plugin OpenClaw sebelumnya, baca
Getting Started terlebih dahulu untuk struktur
package dan penyiapan manifest dasar.
Panduan langkah demi langkah
Package dan manifest
providerAuthEnvVars agar OpenClaw dapat mendeteksi
kredensial tanpa memuat runtime plugin Anda. modelSupport bersifat opsional
dan memungkinkan OpenClaw memuat otomatis plugin provider Anda dari ID model singkat
seperti acme-large sebelum hook runtime ada. Jika Anda memublikasikan
provider di ClawHub, field openclaw.compat dan openclaw.build tersebut
wajib ada di package.json.Daftarkan provider
Provider minimal memerlukan Itu adalah provider yang berfungsi. Pengguna sekarang dapat
Jika alur autentikasi Anda juga perlu mem-patch
id, label, auth, dan catalog:index.ts
openclaw onboard --acme-ai-api-key <key> dan memilih
acme-ai/acme-large sebagai model mereka.Untuk provider bawaan yang hanya mendaftarkan satu provider teks dengan autentikasi
API key plus satu runtime berbasis katalog, gunakan helper yang lebih sempit
defineSingleProviderPluginEntry(...):models.providers.*, alias, dan
model default agen selama onboarding, gunakan helper preset dari
openclaw/plugin-sdk/provider-onboard. Helper yang paling sempit adalah
createDefaultModelPresetAppliers(...),
createDefaultModelsPresetAppliers(...), dan
createModelCatalogPresetAppliers(...).Saat endpoint native provider mendukung blok penggunaan streaming pada
transport openai-completions normal, utamakan helper katalog bersama di
openclaw/plugin-sdk/provider-catalog-shared alih-alih meng-hardcode
pemeriksaan provider-id. supportsNativeStreamingUsageCompat(...) dan
applyProviderNativeStreamingUsageCompat(...) mendeteksi dukungan dari
peta kapabilitas endpoint, sehingga endpoint native gaya Moonshot/DashScope tetap
ikut serta bahkan saat plugin menggunakan provider id kustom.Tambahkan resolusi model dinamis
Jika provider Anda menerima ID model arbitrer (seperti proxy atau router),
tambahkan Jika resolusi memerlukan panggilan jaringan, gunakan
resolveDynamicModel:prepareDynamicModel untuk
warm-up async — resolveDynamicModel dijalankan lagi setelah itu selesai.Tambahkan hook runtime (sesuai kebutuhan)
Sebagian besar provider hanya memerlukan Keluarga replay yang tersedia saat ini:
Contoh bawaan nyata:
Contoh bawaan nyata:
catalog + resolveDynamicModel. Tambahkan hook
secara bertahap sesuai kebutuhan provider Anda.Builder helper bersama kini mencakup keluarga replay/tool-compat yang paling umum,
jadi plugin biasanya tidak perlu merangkai tiap hook satu per satu secara manual:| Family | Yang dirangkai |
|---|---|
openai-compatible | Kebijakan replay bergaya OpenAI bersama untuk transport yang kompatibel dengan OpenAI, termasuk sanitasi tool-call-id, perbaikan urutan assistant-first, dan validasi turn Gemini generik saat transport membutuhkannya |
anthropic-by-model | Kebijakan replay yang sadar Claude dipilih berdasarkan modelId, sehingga transport pesan Anthropic hanya mendapatkan pembersihan thinking-block khusus Claude saat model yang di-resolve benar-benar ID Claude |
google-gemini | Kebijakan replay Gemini native plus sanitasi replay bootstrap dan mode output reasoning bertag |
passthrough-gemini | Sanitasi thought-signature Gemini untuk model Gemini yang berjalan melalui transport proxy yang kompatibel dengan OpenAI; tidak mengaktifkan validasi replay Gemini native atau penulisan ulang bootstrap |
hybrid-anthropic-openai | Kebijakan hibrida untuk provider yang mencampur permukaan model pesan Anthropic dan yang kompatibel dengan OpenAI dalam satu plugin; pembuangan thinking-block opsional khusus Claude tetap terbatas pada sisi Anthropic |
googledangoogle-gemini-cli:google-geminiopenrouter,kilocode,opencode, danopencode-go:passthrough-geminiamazon-bedrockdananthropic-vertex:anthropic-by-modelminimax:hybrid-anthropic-openaimoonshot,ollama,xai, danzai:openai-compatible
| Family | Yang dirangkai |
|---|---|
google-thinking | Normalisasi payload thinking Gemini pada path stream bersama |
kilocode-thinking | Wrapper reasoning Kilo pada path stream proxy bersama, dengan kilo/auto dan ID reasoning proxy yang tidak didukung melewati thinking yang disuntikkan |
moonshot-thinking | Pemetaan payload native-thinking biner Moonshot dari konfigurasi + level /think |
minimax-fast-mode | Penulisan ulang model fast-mode MiniMax pada path stream bersama |
openai-responses-defaults | Wrapper Responses OpenAI/Codex native bersama: header atribusi, /fast/serviceTier, verbositas teks, web search Codex native, pembentukan payload reasoning-compat, dan manajemen konteks Responses |
openrouter-thinking | Wrapper reasoning OpenRouter untuk rute proxy, dengan lompatan model yang tidak didukung/auto ditangani secara terpusat |
tool-stream-default-on | Wrapper tool_stream default aktif untuk provider seperti Z.AI yang menginginkan tool streaming kecuali dinonaktifkan secara eksplisit |
googledangoogle-gemini-cli:google-thinkingkilocode:kilocode-thinkingmoonshot:moonshot-thinkingminimaxdanminimax-portal:minimax-fast-modeopenaidanopenai-codex:openai-responses-defaultsopenrouter:openrouter-thinkingzai:tool-stream-default-on
openclaw/plugin-sdk/provider-model-shared juga mengekspor enum replay-family
plus helper bersama yang menjadi dasar keluarga tersebut. Ekspor publik umum
mencakup:ProviderReplayFamilybuildProviderReplayFamilyHooks(...)- builder replay bersama seperti
buildOpenAICompatibleReplayPolicy(...),buildAnthropicReplayPolicyForModel(...),buildGoogleGeminiReplayPolicy(...), danbuildHybridAnthropicOrOpenAIReplayPolicy(...) - helper replay Gemini seperti
sanitizeGoogleGeminiReplayHistory(...)danresolveTaggedReasoningOutputMode() - helper endpoint/model seperti
resolveProviderEndpoint(...),normalizeProviderId(...),normalizeGooglePreviewModelId(...), dannormalizeNativeXaiModelId(...)
openclaw/plugin-sdk/provider-stream mengekspos builder keluarga dan
helper wrapper publik yang digunakan kembali oleh keluarga tersebut. Ekspor publik umum
mencakup:ProviderStreamFamilybuildProviderStreamFamilyHooks(...)composeProviderStreamWrappers(...)- wrapper OpenAI/Codex bersama seperti
createOpenAIAttributionHeadersWrapper(...),createOpenAIFastModeWrapper(...),createOpenAIServiceTierWrapper(...),createOpenAIResponsesContextManagementWrapper(...), dancreateCodexNativeWebSearchWrapper(...) - wrapper proxy/provider bersama seperti
createOpenRouterWrapper(...),createToolStreamWrapper(...), dancreateMinimaxFastModeWrapper(...)
@openclaw/anthropic-provider mengekspor
wrapAnthropicProviderStream, resolveAnthropicBetas,
resolveAnthropicFastMode, resolveAnthropicServiceTier, dan
builder wrapper Anthropic tingkat lebih rendah dari seam publik api.ts /
contract-api.ts. Helper tersebut tetap khusus Anthropic karena
juga mengenkode penanganan beta Claude OAuth dan gating context1m.Provider bawaan lain juga menjaga wrapper khusus transport tetap lokal saat
perilakunya tidak dapat dibagikan dengan rapi antar keluarga. Contoh saat ini: plugin
xAI bawaan menyimpan pembentukan Responses xAI native di
wrapStreamFn miliknya sendiri, termasuk penulisan ulang alias /fast, default tool_stream,
pembersihan strict-tool yang tidak didukung, dan penghapusan payload reasoning khusus xAI.openclaw/plugin-sdk/provider-tools saat ini mengekspos satu keluarga tool-schema
bersama plus helper schema/compat bersama:ProviderToolCompatFamilymendokumentasikan inventaris keluarga bersama saat ini.buildProviderToolCompatFamilyHooks("gemini")merangkai pembersihan schema Gemini- diagnostik untuk provider yang memerlukan tool schema yang aman untuk Gemini.
normalizeGeminiToolSchemas(...)daninspectGeminiToolSchemas(...)adalah helper schema Gemini publik yang mendasarinya.resolveXaiModelCompatPatch()mengembalikan patch compat xAI bawaan:toolSchemaProfile: "xai", keyword schema yang tidak didukung, dukungan nativeweb_search, dan decoding argumen tool-call HTML-entity.applyXaiModelCompat(model)menerapkan patch compat xAI yang sama itu ke model yang di-resolve sebelum mencapai runner.
normalizeResolvedModel plus
contributeResolvedModelCompat agar metadata compat tersebut tetap dimiliki oleh
provider alih-alih meng-hardcode aturan xAI di core.Pola root package yang sama juga mendasari provider bawaan lainnya:@openclaw/openai-provider:api.tsmengekspor builder provider, helper model default, dan builder provider realtime@openclaw/openrouter-provider:api.tsmengekspor builder provider plus helper onboarding/konfigurasi
- Pertukaran token
- Header kustom
- Identitas transport native
- Penggunaan dan penagihan
Untuk provider yang memerlukan pertukaran token sebelum setiap panggilan inferensi:
Semua hook provider yang tersedia
Semua hook provider yang tersedia
OpenClaw memanggil hook dalam urutan ini. Sebagian besar provider hanya menggunakan 2-3:
Catatan fallback runtime:
| # | Hook | Kapan digunakan |
|---|---|---|
| 1 | catalog | Katalog model atau default baseUrl |
| 2 | applyConfigDefaults | Default global milik provider selama materialisasi konfigurasi |
| 3 | normalizeModelId | Pembersihan alias model-id lama/pratinjau sebelum lookup |
| 4 | normalizeTransport | Pembersihan api / baseUrl keluarga provider sebelum perakitan model generik |
| 5 | normalizeConfig | Normalisasi konfigurasi models.providers.<id> |
| 6 | applyNativeStreamingUsageCompat | Penulisan ulang compat streaming-usage native untuk provider konfigurasi |
| 7 | resolveConfigApiKey | Resolusi autentikasi env-marker milik provider |
| 8 | resolveSyntheticAuth | Auth sintetis lokal/self-hosted atau berbasis konfigurasi |
| 9 | shouldDeferSyntheticProfileAuth | Menurunkan prioritas placeholder stored-profile sintetis di bawah auth env/config |
| 10 | resolveDynamicModel | Menerima ID model upstream arbitrer |
| 11 | prepareDynamicModel | Pengambilan metadata async sebelum resolve |
| 12 | normalizeResolvedModel | Penulisan ulang transport sebelum runner |
normalizeConfigmemeriksa provider yang cocok terlebih dahulu, lalu plugin provider lain yang mendukung hook hingga ada yang benar-benar mengubah konfigurasi. Jika tidak ada hook provider yang menulis ulang entri konfigurasi keluarga Google yang didukung, normalizer konfigurasi Google bawaan tetap diterapkan.resolveConfigApiKeymenggunakan hook provider saat tersedia. Jaluramazon-bedrockbawaan juga memiliki resolver env-marker AWS bawaan di sini, meskipun auth runtime Bedrock sendiri masih menggunakan rantai default AWS SDK. | 13 |contributeResolvedModelCompat| Flag compat untuk model vendor di balik transport kompatibel lain | | 14 |capabilities| Kumpulan kapabilitas statis lama; hanya untuk kompatibilitas | | 15 |normalizeToolSchemas| Pembersihan tool-schema milik provider sebelum registrasi | | 16 |inspectToolSchemas| Diagnostik tool-schema milik provider | | 17 |resolveReasoningOutputMode| Kontrak output reasoning bertag vs native | | 18 |prepareExtraParams| Parameter request default | | 19 |createStreamFn| Transport StreamFn kustom sepenuhnya | | 20 |wrapStreamFn| Wrapper header/body kustom pada path stream normal | | 21 |resolveTransportTurnState| Header/metadata native per turn | | 22 |resolveWebSocketSessionPolicy| Header session native WS / cool-down | | 23 |formatApiKey| Bentuk token runtime kustom | | 24 |refreshOAuth| Refresh OAuth kustom | | 25 |buildAuthDoctorHint| Panduan perbaikan auth | | 26 |matchesContextOverflowError| Deteksi overflow milik provider | | 27 |classifyFailoverReason| Klasifikasi rate-limit/overload milik provider | | 28 |isCacheTtlEligible| Gating TTL prompt cache | | 29 |buildMissingAuthMessage| Petunjuk custom missing-auth | | 30 |suppressBuiltInModel| Sembunyikan baris upstream yang kedaluwarsa | | 31 |augmentModelCatalog| Baris forward-compat sintetis | | 32 |isBinaryThinking| Thinking biner aktif/nonaktif | | 33 |supportsXHighThinking| Dukungan reasoningxhigh| | 34 |resolveDefaultThinkingLevel| Kebijakan default/think| | 35 |isModernModelRef| Pencocokan model live/smoke | | 36 |prepareRuntimeAuth| Pertukaran token sebelum inferensi | | 37 |resolveUsageAuth| Parsing kredensial penggunaan kustom | | 38 |fetchUsageSnapshot| Endpoint penggunaan kustom | | 39 |createEmbeddingProvider| Adapter embedding milik provider untuk memori/pencarian | | 40 |buildReplayPolicy| Kebijakan replay/pemadatan transkrip kustom | | 41 |sanitizeReplayHistory| Penulisan ulang replay khusus provider setelah pembersihan generik | | 42 |validateReplayTurns| Validasi replay-turn ketat sebelum embedded runner | | 43 |onModelSelected| Callback pasca-pemilihan (misalnya telemetri) |
resolveSystemPromptContributionmemungkinkan provider menyuntikkan panduan system-prompt yang sadar cache untuk keluarga model. Utamakan ini daripadabefore_prompt_buildsaat perilakunya milik satu keluarga provider/model dan harus mempertahankan pemisahan cache stabil/dinamis.
Tambahkan kemampuan ekstra (opsional)
Plugin provider dapat mendaftarkan speech, transkripsi realtime, suara realtime,
pemahaman media, generasi gambar, generasi video, web fetch,
dan web search di samping inferensi teks:OpenClaw mengklasifikasikan ini sebagai plugin hybrid-capability. Ini adalah
pola yang direkomendasikan untuk plugin perusahaan (satu plugin per vendor). Lihat
Internals: Capability Ownership.
Publikasikan ke ClawHub
Plugin provider dipublikasikan dengan cara yang sama seperti plugin kode eksternal lainnya:clawhub package publish.
Struktur file
Referensi urutan katalog
catalog.order mengontrol kapan katalog Anda digabungkan relatif terhadap
provider bawaan:
| Order | Kapan | Kasus penggunaan |
|---|---|---|
simple | Lintasan awal | Provider API key biasa |
profile | Setelah simple | Provider yang bergantung pada profile auth |
paired | Setelah profile | Menyintesis beberapa entri yang berkaitan |
late | Lintasan akhir | Menimpa provider yang ada (menang saat tabrakan) |
Langkah berikutnya
- Channel Plugins — jika plugin Anda juga menyediakan channel
- SDK Runtime — helper
api.runtime(TTS, pencarian, subagen) - SDK Overview — referensi impor subpath lengkap
- Plugin Internals — detail hook dan contoh bawaan