Se non hai mai creato un Plugin OpenClaw prima, leggi prima
Introduzione per la struttura di base del pacchetto
e la configurazione del manifest.
Procedura guidata
Package and manifest
Passaggio 1: pacchetto e manifest
setup.providers[].envVars così OpenClaw può rilevare
le credenziali senza caricare il runtime del tuo Plugin. Aggiungi providerAuthAliases
quando una variante del provider deve riutilizzare l’autenticazione dell’id di un altro provider. modelSupport
è opzionale e consente a OpenClaw di caricare automaticamente il tuo Plugin provider da id
di modelli abbreviati come acme-large prima che esistano gli hook runtime. Se pubblichi il
provider su ClawHub, quei campi openclaw.compat e openclaw.build
sono obbligatori in package.json.Register the provider
Un provider testuale minimale richiede un Usa
id, una label, auth e catalog.
catalog è l’hook runtime/config di proprietà del provider; può chiamare API live
del vendor e restituisce voci models.providers.index.ts
registerModelCatalogProvider è la superficie di catalogo control-plane più recente
per interfacce di elenco/aiuto/selettore. Usala per righe di testo, generazione di immagini,
generazione di video e generazione musicale. Mantieni nel Plugin le chiamate agli endpoint del vendor e
la mappatura delle risposte; OpenClaw possiede la forma condivisa delle righe, le etichette
di origine e il rendering dell’aiuto.Questo è un provider funzionante. Gli utenti ora possono
eseguire openclaw onboard --acme-ai-api-key <key> e selezionare
acme-ai/acme-large come modello.Rilevamento live dei modelli
Se il tuo provider espone un’API in stile/models, mantieni nel tuo Plugin
l’endpoint specifico del provider e la proiezione delle righe e usa
openclaw/plugin-sdk/provider-catalog-live-runtime per il ciclo di vita condiviso
del fetch. L’helper fornisce fetch HTTP protetti, header di autenticazione del provider,
errori HTTP strutturati, caching TTL e comportamento di fallback statico senza
inserire policy del provider nel core di OpenClaw.Usa buildLiveModelProviderConfig quando l’API live indica solo quali
righe del catalogo statico di proprietà del provider sono attualmente disponibili:index.ts
getCachedLiveProviderModelRows quando l’API del provider restituisce metadati
più ricchi e il Plugin deve proiettare autonomamente le righe nelle definizioni
dei modelli OpenClaw:index.ts
run deve restare vincolato all’autenticazione e restituire null quando non è
disponibile alcuna credenziale utilizzabile. Mantieni un staticRun offline o un fallback statico in modo che configurazione, documentazione,
test e superfici di selezione non dipendano dall’accesso alla rete live. Usa un TTL
appropriato per la freschezza dell’elenco dei modelli, evita il polling del filesystem al momento della richiesta
e passa un readRows / readModelId specifico del provider solo quando la
risposta upstream non ha una forma compatibile con OpenAI { data: [{ id, object }] }.Se il provider upstream usa token di controllo diversi da OpenClaw, aggiungi una
piccola trasformazione testuale bidirezionale invece di sostituire il percorso di stream:input riscrive il prompt di sistema finale e il contenuto dei messaggi di testo prima
del trasporto. output riscrive i delta testuali dell’assistente e il testo finale prima che
OpenClaw analizzi i propri marker di controllo o la consegna al canale.Per provider in bundle che registrano solo un provider testuale con autenticazione tramite chiave API
più un singolo runtime basato su catalogo, preferisci l’helper più ristretto
defineSingleProviderPluginEntry(...):buildProvider è il percorso del catalogo live usato quando OpenClaw può risolvere l’autenticazione
reale del provider. Può eseguire discovery specifica del provider. Usa
buildStaticProvider solo per righe offline che è sicuro mostrare prima che l’autenticazione
sia configurata; non deve richiedere credenziali né effettuare richieste di rete.
La visualizzazione models list --all di OpenClaw attualmente esegue i cataloghi statici
solo per i Plugin provider inclusi, con configurazione vuota, env vuoto e nessun
percorso agente/workspace.Se il tuo flusso di autenticazione deve anche applicare patch a models.providers.*, alias e
al modello predefinito dell’agente durante l’onboarding, usa gli helper preset da
openclaw/plugin-sdk/provider-onboard. Gli helper più specifici sono
createDefaultModelPresetAppliers(...),
createDefaultModelsPresetAppliers(...) e
createModelCatalogPresetAppliers(...).Quando l’endpoint nativo di un provider supporta blocchi di utilizzo in streaming sul
normale trasporto openai-completions, preferisci gli helper di catalogo condivisi in
openclaw/plugin-sdk/provider-catalog-shared invece di codificare controlli
provider-id. supportsNativeStreamingUsageCompat(...) e
applyProviderNativeStreamingUsageCompat(...) rilevano il supporto dalla
mappa delle capability dell’endpoint, quindi gli endpoint nativi in stile Moonshot/DashScope
si attivano comunque anche quando un Plugin usa un id provider personalizzato.Gli esempi di discovery live sopra coprono API provider in stile /models. Mantieni
tale discovery dentro catalog.run, vincolata ad autenticazione utilizzabile, e mantieni
staticRun senza rete per la generazione del catalogo offline.Aggiungi la risoluzione dinamica del modello
Se il tuo provider accetta ID modello arbitrari (come un proxy o un router),
aggiungi Se la risoluzione richiede una chiamata di rete, usa
resolveDynamicModel:prepareDynamicModel per il
warm-up asincrono: resolveDynamicModel viene eseguito di nuovo al completamento.Aggiungi hook runtime (secondo necessità)
La maggior parte dei provider necessita solo di Famiglie di replay disponibili oggi:
Famiglie di stream disponibili oggi:
catalog + resolveDynamicModel. Aggiungi hook
in modo incrementale man mano che il tuo provider li richiede.I builder helper condivisi ora coprono le famiglie più comuni di compatibilità replay/tool,
quindi i Plugin di solito non devono collegare manualmente ogni hook uno per uno:| Famiglia | Cosa collega | Esempi inclusi |
|---|---|---|
openai-compatible | Policy di replay condivisa in stile OpenAI per trasporti compatibili con OpenAI, inclusa la sanitizzazione dei tool-call-id, correzioni dell’ordinamento con assistente per primo e validazione generica dei turni Gemini dove il trasporto ne ha bisogno | moonshot, ollama, xai, zai |
anthropic-by-model | Policy di replay consapevole di Claude scelta da modelId, così i trasporti con messaggi Anthropic ricevono la pulizia dei blocchi di pensiero specifica di Claude solo quando il modello risolto è effettivamente un id Claude | amazon-bedrock, anthropic-vertex |
google-gemini | Policy di replay Gemini nativa più sanitizzazione del replay di bootstrap. La famiglia condivisa mantiene la CLI Gemini con output testuale sul ragionamento con tag; il provider diretto google sovrascrive resolveReasoningOutputMode su native perché il pensiero dell’API Gemini arriva come parti di pensiero native. | google, google-gemini-cli |
passthrough-gemini | Sanitizzazione della firma di pensiero Gemini per modelli Gemini eseguiti tramite trasporti proxy compatibili con OpenAI; non abilita la validazione del replay Gemini nativa né le riscritture di bootstrap | openrouter, kilocode, opencode, opencode-go |
hybrid-anthropic-openai | Policy ibrida per provider che combinano superfici modello con messaggi Anthropic e compatibili con OpenAI in un unico Plugin; l’eliminazione opzionale dei blocchi di pensiero solo Claude resta limitata al lato Anthropic | minimax |
| Famiglia | Cosa collega | Esempi inclusi |
|---|---|---|
google-thinking | Normalizzazione del payload di pensiero Gemini sul percorso stream condiviso | google, google-gemini-cli |
kilocode-thinking | Wrapper di ragionamento Kilo sul percorso stream proxy condiviso, con kilo/auto e id di ragionamento proxy non supportati che saltano il pensiero iniettato | kilocode |
moonshot-thinking | Mapping del payload binario di pensiero nativo Moonshot da config + livello /think | moonshot |
minimax-fast-mode | Riscrittura del modello fast-mode MiniMax sul percorso stream condiviso | minimax, minimax-portal |
openai-responses-defaults | Wrapper Responses nativi OpenAI/Codex condivisi: header di attribuzione, /fast/serviceTier, verbosità del testo, ricerca web nativa Codex, modellazione del payload di compatibilità del ragionamento e gestione del contesto Responses | openai |
openrouter-thinking | Wrapper di ragionamento OpenRouter per route proxy, con salti per modelli non supportati/auto gestiti centralmente | openrouter |
tool-stream-default-on | Wrapper tool_stream attivo per impostazione predefinita per provider come Z.AI che vogliono lo streaming degli strumenti salvo disabilitazione esplicita | zai |
Punti di integrazione SDK che alimentano i builder di famiglia
Punti di integrazione SDK che alimentano i builder di famiglia
Ogni builder di famiglia è composto da helper pubblici di livello inferiore esportati dallo stesso pacchetto, che puoi usare quando un provider deve discostarsi dal pattern comune:
openclaw/plugin-sdk/provider-model-shared-ProviderReplayFamily,buildProviderReplayFamilyHooks(...)e i builder di replay grezzi (buildOpenAICompatibleReplayPolicy,buildAnthropicReplayPolicyForModel,buildGoogleGeminiReplayPolicy,buildHybridAnthropicOrOpenAIReplayPolicy). Esporta anche helper di replay Gemini (sanitizeGoogleGeminiReplayHistory,resolveTaggedReasoningOutputMode) e helper per endpoint/modello (resolveProviderEndpoint,normalizeProviderId,normalizeGooglePreviewModelId).openclaw/plugin-sdk/provider-stream-ProviderStreamFamily,buildProviderStreamFamilyHooks(...),composeProviderStreamWrappers(...), più i wrapper OpenAI/Codex condivisi (createOpenAIAttributionHeadersWrapper,createOpenAIFastModeWrapper,createOpenAIServiceTierWrapper,createOpenAIResponsesContextManagementWrapper,createCodexNativeWebSearchWrapper), wrapper compatibile con OpenAI DeepSeek V4 (createDeepSeekV4OpenAICompatibleThinkingWrapper), pulizia del prefill di pensiero Anthropic Messages (createAnthropicThinkingPrefillPayloadWrapper), compatibilità delle chiamate agli strumenti in testo semplice (createPlainTextToolCallCompatWrapper) e wrapper proxy/provider condivisi (createOpenRouterWrapper,createToolStreamWrapper,createMinimaxFastModeWrapper).openclaw/plugin-sdk/provider-stream-shared- wrapper leggeri per payload ed eventi per percorsi provider caldi, inclusicreateOpenAICompatibleCompletionsThinkingOffWrapper,createPayloadPatchStreamWrapper,createPlainTextToolCallCompatWrapper,normalizeOpenAICompatibleReasoningPayload(...)esetQwenChatTemplateThinking(...).openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily,buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai")e helper sottostanti per gli schemi provider.
native così OpenClaw consuma parti di pensiero native senza aggiungere
direttive di prompt <think> / <final>. I backend Gemini in stile CLI solo testo
che analizzano una risposta finale JSON/testo possono mantenere il contratto condiviso
google-gemini con tag.Alcuni helper di stream restano locali al provider di proposito. @openclaw/anthropic-provider mantiene wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier e i builder di wrapper Anthropic di livello inferiore nel proprio punto di integrazione pubblico api.ts / contract-api.ts perché codificano la gestione beta OAuth di Claude e il gating context1m. Il Plugin xAI mantiene analogamente la modellazione nativa xAI Responses nel proprio wrapStreamFn (alias /fast, tool_stream predefinito, pulizia strict-tool non supportata, rimozione del payload di ragionamento specifica di xAI).Lo stesso pattern a radice di pacchetto supporta anche @openclaw/openai-provider (builder provider, helper per modello predefinito, builder provider realtime) e @openclaw/openrouter-provider (builder provider più helper di onboarding/configurazione).- Scambio token
- Header personalizzati
- Identità del trasporto nativo
- Utilizzo e fatturazione
Per i provider che richiedono 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:
i campi provider solo per compatibilità che OpenClaw non chiama più, come
Note sul fallback di runtime:
ProviderPlugin.capabilities e suppressBuiltInModel, non sono elencati
qui.| # | Hook | Quando usarlo |
|---|---|---|
| 1 | catalog | Catalogo dei modelli o valori predefiniti dell’URL di base |
| 2 | applyConfigDefaults | Valori predefiniti globali di proprietà del provider durante la materializzazione della configurazione |
| 3 | normalizeModelId | Pulizia degli alias legacy/preview degli ID modello prima della ricerca |
| 4 | normalizeTransport | Pulizia di api / baseUrl della famiglia di provider prima dell’assemblaggio generico del modello |
| 5 | normalizeConfig | Normalizza la configurazione models.providers.<id> |
| 6 | applyNativeStreamingUsageCompat | Riscritture di compatibilità dell’utilizzo dello streaming nativo per i provider di configurazione |
| 7 | resolveConfigApiKey | Risoluzione dell’autenticazione con marker env di proprietà del provider |
| 8 | resolveSyntheticAuth | Autenticazione sintetica locale/self-hosted o basata su configurazione |
| 9 | shouldDeferSyntheticProfileAuth | Abbassa i segnaposto sintetici del profilo memorizzato dietro l’autenticazione 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 |
| 13 | normalizeToolSchemas | Pulizia degli schemi degli strumenti di proprietà del provider prima della registrazione |
| 14 | inspectToolSchemas | Diagnostica degli schemi degli strumenti di proprietà del provider |
| 15 | resolveReasoningOutputMode | Contratto di output di reasoning con tag rispetto a nativo |
| 16 | prepareExtraParams | Parametri di richiesta predefiniti |
| 17 | createStreamFn | Trasporto StreamFn completamente personalizzato |
| 19 | wrapStreamFn | Wrapper personalizzati di header/body sul percorso di stream normale |
| 20 | resolveTransportTurnState | Header/metadati nativi per turno |
| 21 | resolveWebSocketSessionPolicy | Header sessione WS/cool-down nativi |
| 22 | formatApiKey | Forma personalizzata del token di runtime |
| 23 | refreshOAuth | Refresh OAuth personalizzato |
| 24 | buildAuthDoctorHint | Guida alla riparazione dell’autenticazione |
| 25 | matchesContextOverflowError | Rilevamento dell’overflow di proprietà del provider |
| 26 | classifyFailoverReason | Classificazione rate-limit/sovraccarico di proprietà del provider |
| 27 | isCacheTtlEligible | Gate TTL della cache dei prompt |
| 28 | buildMissingAuthMessage | Suggerimento personalizzato per autenticazione mancante |
| 29 | augmentModelCatalog | Righe sintetiche di compatibilità futura |
| 30 | resolveThinkingProfile | Set di opzioni /think specifico del modello |
| 31 | isBinaryThinking | Compatibilità thinking binario on/off |
| 32 | supportsXHighThinking | Compatibilità del supporto al reasoning xhigh |
| 33 | resolveDefaultThinkingLevel | Compatibilità della policy /think predefinita |
| 34 | isModernModelRef | Corrispondenza modello live/smoke |
| 35 | prepareRuntimeAuth | Scambio del token prima dell’inferenza |
| 36 | resolveUsageAuth | Parsing personalizzato delle credenziali di utilizzo |
| 37 | fetchUsageSnapshot | Endpoint di utilizzo personalizzato |
| 38 | createEmbeddingProvider | Adapter embedding di proprietà del provider per memoria/ricerca |
| 39 | buildReplayPolicy | Policy personalizzata di replay/compaction della trascrizione |
| 40 | sanitizeReplayHistory | Riscritture replay specifiche del provider dopo la pulizia generica |
| 41 | validateReplayTurns | Validazione rigorosa dei turni replay prima del runner incorporato |
| 42 | onModelSelected | Callback post-selezione (ad es. telemetria) |
normalizeConfigcontrolla prima il provider corrispondente, poi altri Plugin provider con hook finché uno non modifica effettivamente la configurazione. Se nessun hook provider riscrive una voce di configurazione supportata della famiglia Google, si applica comunque il normalizzatore di configurazione Google incluso.resolveConfigApiKeyusa l’hook provider quando esposto. Amazon Bedrock mantiene la risoluzione del marker env AWS nel proprio Plugin provider; l’autenticazione di runtime in sé usa comunque la catena predefinita dell’AWS SDK quando configurata conauth: "aws-sdk".resolveThinkingProfile(ctx)riceve ilproviderselezionato,modelId, l’hint del catalogoreasoningunito facoltativo e i fatticompatdel modello uniti facoltativi. Usacompatsolo per selezionare l’interfaccia/profilo thinking del provider.resolveSystemPromptContributionconsente a un provider di iniettare una guida al prompt di sistema consapevole della cache per una famiglia di modelli. Preferiscilo abefore_prompt_buildquando il comportamento appartiene a una sola famiglia provider/modello e deve preservare la separazione stabile/dinamica della cache.
Aggiungi capacità extra (facoltativo)
Passaggio 5: Aggiungi capacità extra
Un Plugin provider può registrare embedding, sintesi vocale, trascrizione realtime, voce realtime, comprensione dei media, generazione di immagini, generazione di video, recupero web e ricerca web insieme all’inferenza testuale. OpenClaw classifica questo come un Plugin hybrid-capability, il pattern consigliato per i Plugin aziendali (un Plugin per vendor). Consulta Internals: Proprietà delle capacità.Registra ogni capacità dentroregister(api) insieme alla tua chiamata
api.registerProvider(...) esistente. Scegli solo le schede che ti servono:- Sintesi vocale (TTS)
- Trascrizione realtime
- Voce realtime
- Comprensione dei media
- Embedding
- Generazione di immagini e video
- Recupero e ricerca web
assertOkOrThrowProviderError(...) per gli errori HTTP del provider, così
i Plugin condividono letture limitate del corpo d’errore, parsing degli errori JSON e
suffissi request-id.Test
Passaggio 6: Test
src/provider.test.ts
Pubblicare su ClawHub
I Plugin provider vengono pubblicati nello stesso modo di qualsiasi altro Plugin di codice esterno:clawhub package publish.
Struttura dei file
Riferimento per l’ordine del catalogo
catalog.order controlla quando il tuo catalogo viene unito rispetto ai
provider integrati:
| Ordine | Quando | Caso d’uso |
|---|---|---|
simple | Primo passaggio | Provider con semplice chiave API |
profile | Dopo simple | Provider vincolati ai profili di autenticazione |
paired | Dopo profile | Sintetizzare più voci correlate |
late | Ultimo passaggio | Sovrascrivere provider esistenti (vince in caso di collisione) |
Passaggi successivi
- Plugin di canale - se il tuo Plugin fornisce anche un canale
- Runtime SDK - helper
api.runtime(TTS, ricerca, sottoagente) - Panoramica SDK - riferimento completo agli import di sottopercorso
- Internals del Plugin - dettagli degli hook ed esempi in bundle