Panduan ini menjelaskan cara membangun Plugin penyedia yang menambahkan penyedia model (LLM) ke OpenClaw. Pada akhirnya, Anda akan memiliki penyedia dengan katalog model, autentikasi kunci API, dan resolusi model dinamis.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.
Jika Anda belum pernah membangun Plugin OpenClaw sebelumnya, baca
Memulai terlebih dahulu untuk struktur paket dasar
dan penyiapan manifes.
Panduan Langkah demi Langkah
Paket dan manifes
Langkah 1: Paket dan manifes
providerAuthEnvVars agar OpenClaw dapat mendeteksi
kredensial tanpa memuat runtime Plugin Anda. Tambahkan providerAuthAliases
ketika varian penyedia harus menggunakan ulang autentikasi dari id penyedia lain. modelSupport
bersifat opsional dan memungkinkan OpenClaw memuat otomatis Plugin penyedia Anda dari
id model singkat seperti acme-large sebelum hook runtime tersedia. Jika Anda menerbitkan
penyedia di ClawHub, field openclaw.compat dan openclaw.build tersebut
wajib ada di package.json.Daftarkan penyedia
Penyedia teks minimal memerlukan
id, label, auth, dan catalog.
catalog adalah hook runtime/konfigurasi yang dimiliki penyedia; ia dapat memanggil API
vendor live dan mengembalikan entri models.providers.index.ts
registerModelCatalogProvider adalah surface katalog control-plane yang lebih baru
untuk UI daftar/bantuan/pemilih. Gunakan ini untuk baris teks, pembuatan gambar,
pembuatan video, dan pembuatan musik. Pertahankan panggilan endpoint vendor dan
pemetaan respons di dalam Plugin; OpenClaw memiliki bentuk baris bersama, label
sumber, dan rendering bantuan.Ini sudah menjadi penyedia yang berfungsi. Pengguna sekarang dapat menjalankan
openclaw onboard --acme-ai-api-key <key> dan memilih
acme-ai/acme-large sebagai model mereka.Jika penyedia upstream menggunakan token kontrol yang berbeda dari OpenClaw, tambahkan
transformasi teks dua arah kecil alih-alih mengganti jalur stream:input menulis ulang prompt sistem final dan konten pesan teks sebelum
transport. output menulis ulang delta teks asisten dan teks final sebelum
OpenClaw mem-parse marker kontrolnya sendiri atau pengiriman channel.Untuk penyedia bawaan yang hanya mendaftarkan satu penyedia teks dengan autentikasi
kunci API plus satu runtime berbasis katalog, utamakan helper yang lebih sempit
defineSingleProviderPluginEntry(...):buildProvider adalah jalur katalog live yang digunakan ketika OpenClaw dapat menyelesaikan
autentikasi penyedia nyata. Ia dapat melakukan discovery khusus penyedia. Gunakan
buildStaticProvider hanya untuk baris offline yang aman ditampilkan sebelum autentikasi
dikonfigurasi; ia tidak boleh memerlukan kredensial atau membuat permintaan jaringan.
Tampilan models list --all OpenClaw saat ini mengeksekusi katalog statis
hanya untuk Plugin penyedia bawaan, dengan konfigurasi kosong, env kosong, dan tanpa
path agen/workspace.Jika alur autentikasi Anda juga perlu menambal 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(...).Ketika endpoint native penyedia mendukung blok penggunaan streamed pada
transport openai-completions normal, utamakan helper katalog bersama di
openclaw/plugin-sdk/provider-catalog-shared alih-alih melakukan hardcode
pemeriksaan id penyedia. supportsNativeStreamingUsageCompat(...) dan
applyProviderNativeStreamingUsageCompat(...) mendeteksi dukungan dari
peta kapabilitas endpoint, sehingga endpoint native bergaya Moonshot/DashScope tetap
ikut serta bahkan ketika Plugin menggunakan id penyedia kustom.Tambahkan resolusi model dinamis
Jika penyedia Anda menerima ID model arbitrer (seperti proxy atau router),
tambahkan Jika resolusi memerlukan panggilan jaringan, gunakan
resolveDynamicModel:prepareDynamicModel untuk warm-up
asinkron - resolveDynamicModel berjalan lagi setelah selesai.Tambahkan hook runtime (sesuai kebutuhan)
Sebagian besar penyedia hanya memerlukan Keluarga replay yang tersedia saat ini:
Keluarga aliran yang tersedia saat ini:
catalog + resolveDynamicModel. Tambahkan hook
secara bertahap sesuai kebutuhan penyedia Anda.Builder helper bersama kini mencakup keluarga replay/tool-compat yang paling umum,
sehingga Plugin biasanya tidak perlu merangkai setiap hook satu per satu secara manual:| Keluarga | Yang dihubungkan | Contoh bawaan |
|---|---|---|
openai-compatible | Kebijakan pemutaran ulang bergaya OpenAI bersama untuk transport yang kompatibel dengan OpenAI, termasuk sanitasi id panggilan alat, perbaikan pengurutan yang dimulai asisten, dan validasi giliran Gemini generik saat transport membutuhkannya | moonshot, ollama, xai, zai |
anthropic-by-model | Kebijakan pemutaran ulang yang sadar Claude yang dipilih oleh modelId, sehingga transport pesan Anthropic hanya mendapat pembersihan blok pemikiran khusus Claude saat model yang diselesaikan benar-benar merupakan id Claude | amazon-bedrock, anthropic-vertex |
google-gemini | Kebijakan pemutaran ulang Gemini native ditambah sanitasi pemutaran ulang bootstrap dan mode keluaran penalaran bertag | google, google-gemini-cli |
passthrough-gemini | Sanitasi tanda tangan pemikiran Gemini untuk model Gemini yang berjalan melalui transport proksi yang kompatibel dengan OpenAI; tidak mengaktifkan validasi pemutaran ulang Gemini native atau penulisan ulang bootstrap | openrouter, kilocode, opencode, opencode-go |
hybrid-anthropic-openai | Kebijakan hibrida untuk penyedia yang mencampur permukaan model pesan Anthropic dan yang kompatibel dengan OpenAI dalam satu plugin; penghapusan blok pemikiran khusus Claude opsional tetap dibatasi pada sisi Anthropic | minimax |
| Keluarga | Yang dihubungkan | Contoh bawaan |
|---|---|---|
google-thinking | Normalisasi payload pemikiran Gemini pada jalur aliran bersama | google, google-gemini-cli |
kilocode-thinking | Pembungkus penalaran Kilo pada jalur aliran proksi bersama, dengan kilo/auto dan id penalaran proksi yang tidak didukung melewati pemikiran yang disisipkan | kilocode |
moonshot-thinking | Pemetaan payload pemikiran native biner Moonshot dari konfigurasi + level /think | moonshot |
minimax-fast-mode | Penulisan ulang model mode cepat MiniMax pada jalur aliran bersama | minimax, minimax-portal |
openai-responses-defaults | Pembungkus OpenAI/Codex Responses native bersama: header atribusi, /fast/serviceTier, verbositas teks, pencarian web Codex native, pembentukan payload kompatibilitas penalaran, dan manajemen konteks Responses | openai, openai-codex |
openrouter-thinking | Pembungkus penalaran OpenRouter untuk rute proksi, dengan pelewatan model yang tidak didukung/auto ditangani secara terpusat | openrouter |
tool-stream-default-on | Pembungkus tool_stream aktif secara default untuk penyedia seperti Z.AI yang menginginkan streaming alat kecuali dinonaktifkan secara eksplisit | zai |
Seam SDK yang mendukung pembangun keluarga
Seam SDK yang mendukung pembangun keluarga
Setiap pembangun keluarga disusun dari helper publik tingkat lebih rendah yang diekspor dari paket yang sama, yang dapat Anda gunakan saat penyedia perlu keluar dari pola umum:
openclaw/plugin-sdk/provider-model-shared-ProviderReplayFamily,buildProviderReplayFamilyHooks(...), dan pembangun pemutaran ulang mentah (buildOpenAICompatibleReplayPolicy,buildAnthropicReplayPolicyForModel,buildGoogleGeminiReplayPolicy,buildHybridAnthropicOrOpenAIReplayPolicy). Juga mengekspor helper pemutaran ulang Gemini (sanitizeGoogleGeminiReplayHistory,resolveTaggedReasoningOutputMode) dan helper endpoint/model (resolveProviderEndpoint,normalizeProviderId,normalizeGooglePreviewModelId).openclaw/plugin-sdk/provider-stream-ProviderStreamFamily,buildProviderStreamFamilyHooks(...),composeProviderStreamWrappers(...), ditambah pembungkus OpenAI/Codex bersama (createOpenAIAttributionHeadersWrapper,createOpenAIFastModeWrapper,createOpenAIServiceTierWrapper,createOpenAIResponsesContextManagementWrapper,createCodexNativeWebSearchWrapper), pembungkus kompatibel OpenAI DeepSeek V4 (createDeepSeekV4OpenAICompatibleThinkingWrapper), pembersihan praisi pemikiran Anthropic Messages (createAnthropicThinkingPrefillPayloadWrapper), dan pembungkus proksi/penyedia bersama (createOpenRouterWrapper,createToolStreamWrapper,createMinimaxFastModeWrapper).openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily,buildProviderToolCompatFamilyHooks("gemini"), dan helper skema Gemini yang mendasarinya (normalizeGeminiToolSchemas,inspectGeminiToolSchemas).
@openclaw/anthropic-provider mempertahankan wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier, dan pembangun pembungkus Anthropic tingkat lebih rendah dalam seam publik api.ts / contract-api.ts miliknya sendiri karena semuanya mengodekan penanganan beta OAuth Claude dan gating context1m. Plugin xAI juga mempertahankan pembentukan xAI Responses native dalam wrapStreamFn miliknya sendiri (alias /fast, tool_stream default, pembersihan strict-tool yang tidak didukung, penghapusan payload penalaran khusus xAI).Pola root paket yang sama juga mendukung @openclaw/openai-provider (pembangun penyedia, helper model default, pembangun penyedia realtime) dan @openclaw/openrouter-provider (pembangun penyedia ditambah helper onboarding/konfigurasi).- Pertukaran token
- Header khusus
- Identitas transport native
- Penggunaan dan penagihan
Untuk penyedia yang memerlukan pertukaran token sebelum setiap panggilan inferensi:
Semua hook penyedia yang tersedia
Semua hook penyedia yang tersedia
OpenClaw memanggil hook dalam urutan ini. Sebagian besar penyedia hanya menggunakan 2-3:
Field penyedia khusus kompatibilitas yang tidak lagi dipanggil OpenClaw, seperti
Catatan fallback runtime:
ProviderPlugin.capabilities dan suppressBuiltInModel, tidak dicantumkan
di sini.| # | Hook | Kapan digunakan |
|---|---|---|
| 1 | catalog | Katalog model atau default URL dasar |
| 2 | applyConfigDefaults | Default global milik penyedia selama materialisasi konfigurasi |
| 3 | normalizeModelId | Pembersihan alias id model legacy/pratinjau sebelum pencarian |
| 4 | normalizeTransport | Pembersihan api / baseUrl keluarga penyedia sebelum perakitan model generik |
| 5 | normalizeConfig | Menormalkan konfigurasi models.providers.<id> |
| 6 | applyNativeStreamingUsageCompat | Penulisan ulang kompatibilitas penggunaan streaming native untuk penyedia konfigurasi |
| 7 | resolveConfigApiKey | Resolusi autentikasi penanda env milik penyedia |
| 8 | resolveSyntheticAuth | Autentikasi sintetis lokal/self-hosted atau berbasis konfigurasi |
| 9 | shouldDeferSyntheticProfileAuth | Menurunkan placeholder profil tersimpan sintetis di belakang autentikasi env/konfigurasi |
| 10 | resolveDynamicModel | Menerima ID model upstream arbitrer |
| 11 | prepareDynamicModel | Pengambilan metadata asinkron sebelum menyelesaikan |
| 12 | normalizeResolvedModel | Penulisan ulang transport sebelum runner |
| 13 | contributeResolvedModelCompat | Flag kompatibilitas untuk model vendor di balik transport kompatibel lain |
| 14 | normalizeToolSchemas | Pembersihan skema alat milik penyedia sebelum pendaftaran |
| 15 | inspectToolSchemas | Diagnostik skema alat milik penyedia |
| 16 | resolveReasoningOutputMode | Kontrak keluaran penalaran bertag vs native |
| 17 | prepareExtraParams | Parameter permintaan default |
| 18 | createStreamFn | Transport StreamFn kustom sepenuhnya |
| 19 | wrapStreamFn | Pembungkus header/isi khusus pada jalur aliran normal |
| 20 | resolveTransportTurnState | Header/metadata native per giliran |
| 21 | resolveWebSocketSessionPolicy | Header/cool-down sesi WS native |
| 22 | formatApiKey | Bentuk token runtime khusus |
| 23 | refreshOAuth | Refresh OAuth khusus |
| 24 | buildAuthDoctorHint | Panduan perbaikan autentikasi |
| 25 | matchesContextOverflowError | Deteksi overflow milik penyedia |
| 26 | classifyFailoverReason | Klasifikasi batas laju/kelebihan beban milik penyedia |
| 27 | isCacheTtlEligible | Gating TTL cache prompt |
| 28 | buildMissingAuthMessage | Petunjuk autentikasi hilang khusus |
| 29 | augmentModelCatalog | Baris forward-compat sintetis |
| 30 | resolveThinkingProfile | Set opsi /think khusus model |
| 31 | isBinaryThinking | Kompatibilitas pemikiran biner aktif/nonaktif |
| 32 | supportsXHighThinking | Kompatibilitas dukungan penalaran xhigh |
| 33 | resolveDefaultThinkingLevel | Kompatibilitas kebijakan /think default |
| 34 | isModernModelRef | Pencocokan model live/smoke |
| 35 | prepareRuntimeAuth | Pertukaran token sebelum inferensi |
| 36 | resolveUsageAuth | Penguraian kredensial penggunaan khusus |
| 37 | fetchUsageSnapshot | Endpoint penggunaan khusus |
| 38 | createEmbeddingProvider | Adapter embedding milik penyedia untuk memori/pencarian |
| 39 | buildReplayPolicy | Kebijakan pemutaran ulang/Compaction transkrip khusus |
| 40 | sanitizeReplayHistory | Penulisan ulang pemutaran ulang khusus penyedia setelah pembersihan generik |
| 41 | validateReplayTurns | Validasi giliran pemutaran ulang ketat sebelum runner tertanam |
| 42 | onModelSelected | Callback pasca-pemilihan (mis. telemetri) |
normalizeConfigmemeriksa penyedia yang cocok terlebih dahulu, lalu plugin penyedia lain yang mendukung hook sampai ada yang benar-benar mengubah konfigurasi. Jika tidak ada hook penyedia yang menulis ulang entri konfigurasi keluarga Google yang didukung, normalizer konfigurasi Google bawaan tetap diterapkan.resolveConfigApiKeymenggunakan hook penyedia saat diekspos. Jaluramazon-bedrockbawaan juga memiliki resolver penanda env AWS bawaan di sini, meskipun autentikasi runtime Bedrock sendiri tetap menggunakan rantai default AWS SDK.resolveSystemPromptContributionmemungkinkan penyedia menyisipkan panduan prompt sistem yang sadar cache untuk keluarga model. Pilih ini daripadabefore_prompt_buildsaat perilaku menjadi milik satu keluarga penyedia/model dan harus mempertahankan pemisahan cache stabil/dinamis.
Tambahkan kapabilitas ekstra (opsional)
Langkah 5: Tambahkan kapabilitas ekstra
Plugin penyedia dapat mendaftarkan speech, transkripsi realtime, suara realtime, pemahaman media, pembuatan gambar, pembuatan video, web fetch, dan pencarian web bersama inferensi teks. OpenClaw mengklasifikasikan ini sebagai plugin hybrid-capability - pola yang direkomendasikan untuk plugin perusahaan (satu plugin per vendor). Lihat Internal: Kepemilikan Kapabilitas.Daftarkan setiap kapabilitas di dalamregister(api) bersama panggilan
api.registerProvider(...) yang sudah ada. Pilih hanya tab yang Anda perlukan:- Speech (TTS)
- Transkripsi realtime
- Suara realtime
- Pemahaman media
- Pembuatan gambar dan video
- Web fetch dan pencarian
assertOkOrThrowProviderError(...) untuk kegagalan HTTP penyedia agar
plugin berbagi pembacaan isi galat yang dibatasi, parsing galat JSON, dan
sufiks ID permintaan.Uji
Langkah 6: Uji
src/provider.test.ts
Publikasikan ke ClawHub
Plugin penyedia 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 penyedia bawaan:
| Urutan | Kapan | Kasus penggunaan |
|---|---|---|
simple | Pass pertama | Penyedia API key biasa |
profile | Setelah simple | Penyedia yang dibatasi profil auth |
paired | Setelah profile | Mensintesis beberapa entri terkait |
late | Pass terakhir | Menimpa penyedia yang ada (menang saat konflik) |
Langkah berikutnya
- Plugin Channel - jika plugin Anda juga menyediakan channel
- Runtime SDK - helper
api.runtime(TTS, pencarian, subagent) - Ikhtisar SDK - referensi impor subpath lengkap
- Internal Plugin - detail hook dan contoh bawaan