Creare plugin provider
Questa guida spiega come creare un plugin provider che aggiunge a OpenClaw un provider di modelli (LLM). Alla fine avrai un provider con un catalogo di modelli, autenticazione tramite chiave API e risoluzione dinamica dei modelli.Se non hai mai creato prima alcun plugin OpenClaw, leggi prima
Per iniziare per la struttura di base del pacchetto
e la configurazione del manifest.
Procedura guidata
Pacchetto e manifest
providerAuthEnvVars così OpenClaw può rilevare
le credenziali senza caricare il runtime del tuo plugin. modelSupport è facoltativo
e permette a OpenClaw di caricare automaticamente il tuo plugin provider a partire da ID modello abbreviati
come acme-large prima che esistano hook runtime. Se pubblichi il
provider su ClawHub, quei campi openclaw.compat e openclaw.build
sono obbligatori in package.json.Registra il provider
Un provider minimo richiede Questo è un provider funzionante. Gli utenti possono ora
eseguire Se il tuo flusso auth deve anche aggiornare
id, label, auth e catalog:index.ts
openclaw onboard --acme-ai-api-key <key> e selezionare
acme-ai/acme-large come proprio modello.Per provider bundled che registrano solo un provider testuale con autenticazione tramite chiave API
più un singolo runtime basato su catalogo, preferisci l’helper più ristretto
defineSingleProviderPluginEntry(...):models.providers.*, alias e
il modello predefinito dell’agente durante l’onboarding, usa gli helper preset di
openclaw/plugin-sdk/provider-onboard. Gli helper più mirati sono
createDefaultModelPresetAppliers(...),
createDefaultModelsPresetAppliers(...) e
createModelCatalogPresetAppliers(...).Quando l’endpoint nativo di un provider supporta blocchi di utilizzo in streaming sul
trasporto normale openai-completions, preferisci gli helper di catalogo condivisi in
openclaw/plugin-sdk/provider-catalog-shared invece di codificare controlli
specifici dell’ID provider. supportsNativeStreamingUsageCompat(...) e
applyProviderNativeStreamingUsageCompat(...) rilevano il supporto dalla mappa delle capacità
dell’endpoint, così endpoint nativi in stile Moonshot/DashScope possono comunque
aderire anche quando un plugin usa un ID provider personalizzato.Aggiungi la risoluzione dinamica dei modelli
Se il tuo provider accetta ID modello arbitrari (come un proxy o router),
aggiungi Se la risoluzione richiede una chiamata di rete, usa
resolveDynamicModel:prepareDynamicModel per un
warm-up asincrono: resolveDynamicModel verrà eseguito di nuovo dopo il completamento.Aggiungi hook runtime (se necessario)
La maggior parte dei provider richiede solo Famiglie replay disponibili oggi:
Esempi bundled reali:
Esempi bundled reali:
catalog + resolveDynamicModel. Aggiungi gli hook
in modo incrementale, a seconda delle esigenze del tuo provider.I builder di helper condivisi ora coprono le famiglie più comuni di replay/compatibilità strumenti,
quindi di solito i plugin non devono collegare manualmente ogni hook uno per uno:| Family | Cosa collega |
|---|---|
openai-compatible | Policy replay condivisa in stile OpenAI per trasporti compatibili OpenAI, inclusi pulizia tool-call-id, correzioni dell’ordine assistant-first e validazione generica dei turni Gemini dove il trasporto lo richiede |
anthropic-by-model | Policy replay compatibile con Claude scelta in base a modelId, così i trasporti Anthropic-message ricevono la pulizia specifica dei blocchi di thinking di Claude solo quando il modello risolto è effettivamente un ID Claude |
google-gemini | Policy replay nativa Gemini più sanitizzazione del replay bootstrap e modalità output reasoning etichettata |
passthrough-gemini | Sanitizzazione della firma di thought Gemini per modelli Gemini in esecuzione tramite trasporti proxy compatibili OpenAI; non abilita validazione replay Gemini nativa né riscritture bootstrap |
hybrid-anthropic-openai | Policy ibrida per provider che combinano superfici di modelli Anthropic-message e compatibili OpenAI in un unico plugin; l’eventuale rimozione dei blocchi di thinking solo-Claude resta limitata al lato Anthropic |
googleegoogle-gemini-cli:google-geminiopenrouter,kilocode,opencodeeopencode-go:passthrough-geminiamazon-bedrockeanthropic-vertex:anthropic-by-modelminimax:hybrid-anthropic-openaimoonshot,ollama,xaiezai:openai-compatible
| Family | Cosa collega |
|---|---|
google-thinking | Normalizzazione del payload di thinking Gemini nel percorso stream condiviso |
kilocode-thinking | Wrapper reasoning Kilo nel percorso stream proxy condiviso, con kilo/auto e ID reasoning proxy non supportati che saltano il thinking iniettato |
moonshot-thinking | Mappatura del payload native-thinking binario Moonshot da config + livello /think |
minimax-fast-mode | Riscrittura del modello fast-mode MiniMax nel percorso stream condiviso |
openai-responses-defaults | Wrapper condivisi nativi OpenAI/Codex Responses: header di attribuzione, /fast/serviceTier, verbosity del testo, web search Codex nativa, model shaping del payload di compatibilità reasoning e gestione del contesto Responses |
openrouter-thinking | Wrapper reasoning OpenRouter per route proxy, con skip centralizzati per modelli non supportati/auto |
tool-stream-default-on | Wrapper tool_stream attivo di default per provider come Z.AI che vogliono lo streaming degli strumenti salvo disabilitazione esplicita |
googleegoogle-gemini-cli:google-thinkingkilocode:kilocode-thinkingmoonshot:moonshot-thinkingminimaxeminimax-portal:minimax-fast-modeopenaieopenai-codex:openai-responses-defaultsopenrouter:openrouter-thinkingzai:tool-stream-default-on
openclaw/plugin-sdk/provider-model-shared esporta anche l’enum delle
famiglie replay più gli helper condivisi su cui si basano queste famiglie. Le esportazioni pubbliche
comuni includono:ProviderReplayFamilybuildProviderReplayFamilyHooks(...)- builder replay condivisi come
buildOpenAICompatibleReplayPolicy(...),buildAnthropicReplayPolicyForModel(...),buildGoogleGeminiReplayPolicy(...), ebuildHybridAnthropicOrOpenAIReplayPolicy(...) - helper replay Gemini come
sanitizeGoogleGeminiReplayHistory(...)eresolveTaggedReasoningOutputMode() - helper endpoint/model come
resolveProviderEndpoint(...),normalizeProviderId(...),normalizeGooglePreviewModelId(...), enormalizeNativeXaiModelId(...)
openclaw/plugin-sdk/provider-stream espone sia il builder di famiglie sia
i wrapper helper pubblici riutilizzati da queste famiglie. Le esportazioni pubbliche comuni
includono:ProviderStreamFamilybuildProviderStreamFamilyHooks(...)composeProviderStreamWrappers(...)- wrapper condivisi OpenAI/Codex come
createOpenAIAttributionHeadersWrapper(...),createOpenAIFastModeWrapper(...),createOpenAIServiceTierWrapper(...),createOpenAIResponsesContextManagementWrapper(...), ecreateCodexNativeWebSearchWrapper(...) - wrapper condivisi proxy/provider come
createOpenRouterWrapper(...),createToolStreamWrapper(...), ecreateMinimaxFastModeWrapper(...)
@openclaw/anthropic-provider esporta
wrapAnthropicProviderStream, resolveAnthropicBetas,
resolveAnthropicFastMode, resolveAnthropicServiceTier, e i
builder wrapper Anthropic di livello inferiore tramite il suo seam pubblico api.ts /
contract-api.ts. Quegli helper restano specifici di Anthropic perché
codificano anche la gestione delle beta OAuth Claude e il gating context1m.Anche altri provider bundled mantengono wrapper specifici del trasporto in locale quando
il comportamento non è condivisibile in modo pulito tra famiglie. Esempio attuale: il
plugin xAI bundled mantiene nel proprio
wrapStreamFn il model shaping nativo xAI Responses, inclusi riscritture di alias /fast, tool_stream predefinito,
pulizia dei strict-tool non supportati e rimozione
del payload reasoning specifica xAI.openclaw/plugin-sdk/provider-tools attualmente espone una famiglia condivisa
di schemi degli strumenti più helper condivisi per schema/compatibilità:ProviderToolCompatFamilydocumenta oggi l’inventario delle famiglie condivise.buildProviderToolCompatFamilyHooks("gemini")collega la pulizia dello schema Gemini + diagnostica per provider che necessitano di schemi strumenti sicuri per Gemini.normalizeGeminiToolSchemas(...)einspectGeminiToolSchemas(...)sono gli helper pubblici sottostanti per gli schemi Gemini.resolveXaiModelCompatPatch()restituisce la patch di compatibilità xAI bundled:toolSchemaProfile: "xai", keyword di schema non supportate, supporto nativoweb_search, e decodifica delle argomentazioni delle tool-call con entità HTML.applyXaiModelCompat(model)applica la stessa patch di compatibilità xAI a un modello risolto prima che arrivi al runner.
normalizeResolvedModel più
contributeResolvedModelCompat per mantenere quei metadati di compatibilità
di proprietà del provider invece di codificare in core regole specifiche di xAI.Lo stesso schema del package root supporta anche altri provider bundled:@openclaw/openai-provider:api.tsesporta builder provider, helper per modelli predefiniti e builder realtime provider@openclaw/openrouter-provider:api.tsesporta il builder provider più helper di onboarding/config
- Scambio token
- Header personalizzati
- Identità nativa del trasporto
- Utilizzo e fatturazione
Per provider che necessitano di uno scambio token prima di ogni chiamata di inferenza:
Tutti gli hook provider disponibili
Tutti gli hook provider disponibili
OpenClaw chiama gli hook in questo ordine. La maggior parte dei provider ne usa solo 2-3:
Note sul fallback runtime:
| # | Hook | Quando usarlo |
|---|---|---|
| 1 | catalog | Catalogo modelli o valori predefiniti di base URL |
| 2 | applyConfigDefaults | Valori globali predefiniti di proprietà del provider durante la materializzazione della config |
| 3 | normalizeModelId | Pulizia di alias legacy/preview per model-id prima del lookup |
| 4 | normalizeTransport | Pulizia di api / baseUrl della famiglia provider prima dell’assemblaggio del modello generico |
| 5 | normalizeConfig | Normalizza la config models.providers.<id> |
| 6 | applyNativeStreamingUsageCompat | Riscritture di compatibilità per utilizzo streaming nativo per i provider config |
| 7 | resolveConfigApiKey | Risoluzione auth con env-marker di proprietà del provider |
| 8 | resolveSyntheticAuth | Auth sintetica locale/self-hosted o basata su config |
| 9 | shouldDeferSyntheticProfileAuth | Sposta i placeholder sintetici di profili memorizzati dietro auth env/config |
| 10 | resolveDynamicModel | Accetta ID modello upstream arbitrari |
| 11 | prepareDynamicModel | Recupero asincrono dei metadati prima della risoluzione |
| 12 | normalizeResolvedModel | Riscritture del trasporto prima del runner |
-
normalizeConfigcontrolla prima il provider corrispondente, poi altri plugin provider con hook finché uno non modifica davvero la config. Se nessun hook provider riscrive una voce config supportata della famiglia Google, si applica comunque il normalizzatore config Google bundled. -
resolveConfigApiKeyusa l’hook del provider quando esposto. Il percorso bundledamazon-bedrockinclude qui anche un resolver built-in di marker env AWS, anche se l’auth runtime Bedrock stesso continua a usare la chain predefinita AWS SDK. | 13 |contributeResolvedModelCompat| Flag di compatibilità per modelli vendor dietro un altro trasporto compatibile | | 14 |capabilities| Bag statica di capacità legacy; solo compatibilità | | 15 |normalizeToolSchemas| Pulizia degli schemi strumenti di proprietà del provider prima della registrazione | | 16 |inspectToolSchemas| Diagnostica degli schemi strumenti di proprietà del provider | | 17 |resolveReasoningOutputMode| Contratto output reasoning etichettato vs nativo | | 18 |prepareExtraParams| Parametri predefiniti della richiesta | | 19 |createStreamFn| Trasporto StreamFn completamente personalizzato | | 20 |wrapStreamFn| Wrapper personalizzati di header/body nel normale percorso stream | | 21 |resolveTransportTurnState| Header/metadati nativi per turno | | 22 |resolveWebSocketSessionPolicy| Header sessione WS nativi/cool-down | | 23 |formatApiKey| Forma personalizzata del token runtime | | 24 |refreshOAuth| Refresh OAuth personalizzato | | 25 |buildAuthDoctorHint| Guida alla riparazione dell’auth | | 26 |matchesContextOverflowError| Rilevamento overflow di proprietà del provider | | 27 |classifyFailoverReason| Classificazione rate-limit/sovraccarico di proprietà del provider | | 28 |isCacheTtlEligible| Gating TTL per prompt cache | | 29 |buildMissingAuthMessage| Suggerimento personalizzato per auth mancante | | 30 |suppressBuiltInModel| Nasconde righe upstream obsolete | | 31 |augmentModelCatalog| Righe sintetiche per forward-compat | | 32 |isBinaryThinking| Thinking binario on/off | | 33 |supportsXHighThinking| Supporto reasoningxhigh| | 34 |resolveDefaultThinkingLevel| Policy predefinita/think| | 35 |isModernModelRef| Corrispondenza del modello live/smoke | | 36 |prepareRuntimeAuth| Scambio token prima dell’inferenza | | 37 |resolveUsageAuth| Parsing personalizzato delle credenziali di utilizzo | | 38 |fetchUsageSnapshot| Endpoint di utilizzo personalizzato | | 39 |createEmbeddingProvider| Adapter embedding di proprietà del provider per memory/search | | 40 |buildReplayPolicy| Policy personalizzata di replay/compattazione delle trascrizioni | | 41 |sanitizeReplayHistory| Riscritture replay specifiche del provider dopo la pulizia generica | | 42 |validateReplayTurns| Validazione rigorosa dei turni replay prima del runner embedded | | 43 |onModelSelected| Callback post-selezione (ad esempio telemetria) | Nota sul tuning dei prompt:resolveSystemPromptContributionpermette a un provider di iniettare indicazioni sul prompt di sistema consapevoli della cache per una famiglia di modelli. Preferiscilo abefore_prompt_buildquando il comportamento appartiene a una sola famiglia provider/modello e dovrebbe preservare la separazione stabile/dinamica della cache.
Aggiungi capacità extra (facoltativo)
Un plugin provider può registrare speech, trascrizione realtime, voce realtime,
comprensione media, generazione di immagini, generazione video, web fetch
e web search oltre all’inferenza di testo:OpenClaw lo classifica come plugin a capacità ibride. Questo è il
modello consigliato per i plugin aziendali (un plugin per vendor). Vedi
Internals: Proprietà delle capacità.
Pubblica su ClawHub
I plugin provider si pubblicano allo stesso modo di qualsiasi altro plugin di codice esterno:clawhub package publish.
Struttura dei file
Riferimento ordine del catalogo
catalog.order controlla quando il tuo catalogo viene unito rispetto ai
provider integrati:
| Order | Quando | Caso d’uso |
|---|---|---|
simple | Primo passaggio | Provider semplici con chiave API |
profile | Dopo simple | Provider vincolati ai profili auth |
paired | Dopo profile | Sintetizza più voci correlate |
late | Ultimo passaggio | Sovrascrive provider esistenti (vince in caso di collisione) |
Passi successivi
- Plugin canale — se il tuo plugin fornisce anche un canale
- SDK Runtime — helper
api.runtime(TTS, search, subagent) - Panoramica SDK — riferimento completo agli import subpath
- Internals dei plugin — dettagli degli hook ed esempi bundled