Non conosci ancora i Plugin di OpenClaw? Leggi prima la Guida
introduttiva per la struttura del pacchetto e la
configurazione del manifesto.
Procedura guidata
1
Pacchetto e manifesto
Passaggio 1: pacchetto e manifesto
setup.providers[].envVars consente a OpenClaw di rilevare le credenziali
senza caricare il runtime del Plugin. Aggiungi providerAuthAliases quando
una variante del provider deve riutilizzare l’autenticazione dell’ID di un
altro provider. modelSupport è facoltativo e consente a OpenClaw di
caricare automaticamente il Plugin provider da ID abbreviati dei modelli
come acme-large, prima che esistano gli hook di runtime. openclaw.compat
e openclaw.build in package.json sono obbligatori per la pubblicazione
su ClawHub (openclaw.compat.pluginApi e
openclaw.build.openclawVersion sono i due campi obbligatori;
minGatewayVersion usa come valore di riserva
openclaw.install.minHostVersion quando viene omesso).2
Registra il provider
Un provider di testo minimale richiede Usa
id, label, auth e catalog.
catalog è l’hook di runtime/configurazione gestito dal provider; può
chiamare le API del fornitore in tempo reale e restituisce voci
models.providers.index.ts
registerModelCatalogProvider è la più recente interfaccia di catalogo del
piano di controllo per l’interfaccia utente di elenchi, guida e selettori e
comprende righe text, voice, image_generation, video_generation e
music_generation. Mantieni nel Plugin le chiamate agli endpoint del
fornitore e la mappatura delle risposte; OpenClaw gestisce la struttura
condivisa delle righe, le etichette delle origini e il rendering della
guida.Questo è un provider funzionante. Ora gli utenti possono eseguire
openclaw onboard --acme-ai-api-key <key> e selezionare
acme-ai/acme-large come modello.Rilevamento dei modelli in tempo reale
Se il provider espone un’API in stile/models, mantieni nel Plugin
l’endpoint specifico del provider e la proiezione delle righe e usa
openclaw/plugin-sdk/provider-catalog-live-runtime per il ciclo di
recupero condiviso. L’helper fornisce richieste HTTP protette, intestazioni
per l’autenticazione del provider, errori HTTP strutturati, memorizzazione
nella cache con TTL e comportamento di ripiego statico, senza inserire nel
core di OpenClaw le regole specifiche del provider.Usa buildLiveModelProviderConfig quando l’API in tempo reale indica
soltanto quali righe del catalogo statico gestito dal provider sono
attualmente disponibili:index.ts
getCachedLiveProviderModelRows quando l’API del provider restituisce
metadati più dettagliati e il Plugin deve proiettare autonomamente le righe
nelle definizioni dei modelli di OpenClaw:index.ts
run deve restare subordinato all’autenticazione e restituire null
quando non sono disponibili credenziali utilizzabili. Mantieni uno
staticRun offline o un ripiego statico affinché la configurazione, la
documentazione, i test e le interfacce dei selettori non dipendano
dall’accesso alla rete in tempo reale. Usa un TTL adeguato alla frequenza di
aggiornamento dell’elenco dei modelli, evita il polling del file system al
momento della richiesta e passa valori readRows / readModelId specifici
del provider solo quando la risposta upstream non ha una struttura
compatibile con OpenAI del tipo { data: [{ id, object }] }.Se il provider upstream usa token di controllo diversi da OpenClaw,
aggiungi una piccola trasformazione bidirezionale del testo anziché
sostituire il percorso dello stream:input riscrive il prompt di sistema finale e il contenuto testuale dei
messaggi prima del trasporto. output riscrive i delta di testo
dell’assistente e il testo finale prima che OpenClaw analizzi i propri
marcatori di controllo o effettui la consegna al canale.Per i provider inclusi che registrano soltanto un provider di testo con
autenticazione tramite chiave API e un singolo runtime basato su catalogo,
preferisci l’helper più specifico defineSingleProviderPluginEntry(...):buildProvider è il percorso del catalogo attivo usato quando OpenClaw può risolvere
l’autenticazione reale del provider. Può eseguire il rilevamento specifico del provider. Usa
buildStaticProvider solo per le righe offline che possono essere mostrate in sicurezza prima
della configurazione dell’autenticazione; non deve richiedere credenziali né effettuare richieste
di rete. Attualmente, la visualizzazione models list --all di OpenClaw esegue i cataloghi statici
solo per i Plugin provider inclusi, con configurazione vuota, ambiente vuoto e nessun
percorso di agente o area di lavoro.Se il flusso di autenticazione deve anche modificare models.providers.*, gli alias e
il modello predefinito dell’agente durante la configurazione iniziale, usa le funzioni ausiliarie per le preimpostazioni da
openclaw/plugin-sdk/provider-onboard. Le funzioni ausiliarie più specifiche sono
createDefaultModelPresetAppliers(...),
createDefaultModelsPresetAppliers(...) e
createModelCatalogPresetAppliers(...).Quando l’endpoint nativo di un provider supporta blocchi di utilizzo in streaming sul
normale trasporto openai-completions, preferisci le funzioni ausiliarie condivise per i cataloghi in
openclaw/plugin-sdk/provider-catalog-shared invece di codificare direttamente
controlli sull’ID del provider. supportsNativeStreamingUsageCompat(...) e
applyProviderNativeStreamingUsageCompat(...) rilevano il supporto dalla
mappa delle capacità dell’endpoint, quindi gli endpoint nativi in stile Moonshot/DashScope
continuano ad aderire anche quando un Plugin usa un ID provider personalizzato.Gli esempi di rilevamento attivo precedenti coprono le API dei provider in stile /models. Mantieni
tale rilevamento all’interno di catalog.run, subordinato alla disponibilità di un’autenticazione utilizzabile, e mantieni
staticRun privo di accesso alla rete per la generazione offline del catalogo.3
Aggiungere la risoluzione dinamica dei modelli
Se il provider accetta ID modello arbitrari, come un proxy o un router,
aggiungi Se la risoluzione richiede una chiamata di rete, usa
resolveDynamicModel:prepareDynamicModel per la
preparazione asincrona: resolveDynamicModel viene eseguito nuovamente al termine.4
Aggiungere gli hook di runtime (se necessari)
La maggior parte dei provider richiede solo Famiglie di riproduzione attualmente disponibili:
catalog + resolveDynamicModel. Aggiungi gli hook
in modo incrementale, in base alle esigenze del provider.Le funzioni di creazione condivise ora coprono le famiglie più comuni per la compatibilità
con la riproduzione e gli strumenti, quindi in genere i Plugin non devono collegare manualmente ogni hook uno alla volta:Famiglie di streaming attualmente disponibili:
Interfacce SDK alla base delle funzioni di creazione delle famiglie
Interfacce SDK alla base delle funzioni di creazione delle famiglie
Ogni funzione di creazione delle famiglie è composta da funzioni ausiliarie pubbliche di livello inferiore esportate dallo stesso pacchetto, utilizzabili quando un provider deve discostarsi dallo schema comune:
openclaw/plugin-sdk/provider-model-shared-ProviderReplayFamily,buildProviderReplayFamilyHooks(...)e le funzioni di creazione della riproduzione di base (buildOpenAICompatibleReplayPolicy,buildAnthropicReplayPolicyForModel,buildGoogleGeminiReplayPolicy,buildHybridAnthropicOrOpenAIReplayPolicy). Esporta inoltre le funzioni ausiliarie per la riproduzione Gemini (sanitizeGoogleGeminiReplayHistory,resolveTaggedReasoningOutputMode) e quelle per endpoint e modelli (resolveProviderEndpoint,normalizeProviderId,normalizeGooglePreviewModelId).openclaw/plugin-sdk/provider-stream-ProviderStreamFamily,buildProviderStreamFamilyHooks(...),composeProviderStreamWrappers(...), oltre ai wrapper condivisi per OpenAI/Codex (createOpenAIAttributionHeadersWrapper,createOpenAIFastModeWrapper,createOpenAIServiceTierWrapper,createOpenAIResponsesContextManagementWrapper,createCodexNativeWebSearchWrapper), al wrapper DeepSeek V4 compatibile con OpenAI (createDeepSeekV4OpenAICompatibleThinkingWrapper), alla pulizia del precompilato di ragionamento per Anthropic Messages (createAnthropicThinkingPrefillPayloadWrapper), alla compatibilità con le chiamate agli strumenti in testo semplice (createPlainTextToolCallCompatWrapper) e ai wrapper condivisi per proxy e provider (createOpenRouterWrapper,createToolStreamWrapper,createMinimaxFastModeWrapper).openclaw/plugin-sdk/provider-stream-shared- wrapper leggeri per payload ed eventi nei percorsi critici dei provider, inclusicreateOpenAICompatibleCompletionsThinkingOffWrapper,createPayloadPatchStreamWrapper,createPlainTextToolCallCompatWrapper,normalizeOpenAICompatibleReasoningPayload(...)esetQwenChatTemplateThinking(...).openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily,buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai")e le funzioni ausiliarie sottostanti per gli schemi dei provider.
native,
affinché OpenClaw elabori le parti di pensiero native senza aggiungere
direttive di prompt <think> / <final>. I backend in stile CLI Gemini
con solo testo, che analizzano una risposta finale JSON o testuale, possono mantenere il contratto condiviso
con tag google-gemini.Alcune funzioni ausiliarie per lo streaming restano intenzionalmente locali al provider. @openclaw/anthropic-provider mantiene wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier e le funzioni di creazione dei wrapper Anthropic di livello inferiore nella propria interfaccia pubblica api.ts / contract-api.ts, perché codificano la gestione delle funzionalità beta OAuth di Claude e la subordinazione a context1m. Analogamente, il Plugin xAI mantiene la conformazione nativa di xAI Responses nel proprio wrapStreamFn (alias /fast, tool_stream predefinito, pulizia degli strumenti rigorosi non supportati, rimozione del payload di ragionamento specifica per xAI).Lo stesso schema basato sulla radice del pacchetto supporta anche @openclaw/openai-provider (funzioni di creazione dei provider, funzioni ausiliarie per il modello predefinito, funzioni di creazione dei provider in tempo reale) e @openclaw/openrouter-provider (funzione di creazione del provider e funzioni ausiliarie per configurazione iniziale e configurazione).- Scambio di token
- Intestazioni personalizzate
- Identità del trasporto nativo
- Utilizzo e fatturazione
Per i provider che richiedono uno scambio di token prima di ogni chiamata di inferenza:
Hook comuni dei provider
Hook comuni dei provider
OpenClaw chiama gli hook approssimativamente in quest’ordine per i Plugin
di modelli/provider. La maggior parte dei provider ne utilizza solo 2-3.
Questo non è il contratto
ProviderPlugin completo: consulta
Aspetti interni: hook di runtime dei provider
per l’elenco
completo e attualmente aggiornato degli hook e per le note sui fallback.
I campi dei provider riservati alla compatibilità che OpenClaw non chiama più,
come ProviderPlugin.capabilities e suppressBuiltInModel, non sono elencati
qui.Note sui fallback di runtime:
normalizeConfigrisolve un solo Plugin proprietario per ogni ID provider (prima i provider inclusi, poi il Plugin di runtime corrispondente) e chiama solo quell’hook: non viene eseguita alcuna scansione degli altri provider. È l’hooknormalizeConfigdi Google a normalizzare le voci di configurazionegoogle/google-vertex/google-antigravity; non si tratta di un fallback separato del core.resolveConfigApiKeyutilizza l’hook del provider quando disponibile. Amazon Bedrock mantiene la risoluzione dei marcatori di ambiente AWS nel proprio Plugin del provider; l’autenticazione di runtime continua invece a utilizzare la catena predefinita dell’SDK AWS quando è configurata conauth: "aws-sdk".resolveThinkingProfile(ctx)riceve ilproviderselezionato,modelId, il suggerimento facoltativo del catalogoreasoningunificato e i dati facoltativicompatunificati del modello. Usacompatsolo per selezionare l’interfaccia/il profilo di ragionamento del provider.resolveSystemPromptContributionconsente a un provider di inserire indicazioni per il prompt di sistema sensibili alla cache per una famiglia di modelli. Preferiscilo all’hook legacybefore_prompt_buildapplicato all’intero Plugin quando il comportamento appartiene a una sola famiglia di provider/modelli e deve preservare la separazione tra cache stabile e dinamica.
5
Aggiungere funzionalità aggiuntive (facoltativo)
Passaggio 5: aggiungere funzionalità aggiuntive
Un Plugin del provider può registrare incorporamenti, sintesi vocale, trascrizione in tempo reale, voce in tempo reale, comprensione dei contenuti multimediali, generazione di immagini, generazione di video, recupero web e ricerca web insieme all’inferenza testuale. OpenClaw lo classifica come Plugin a funzionalità ibride, il modello consigliato per i Plugin aziendali (un Plugin per fornitore). Consulta Aspetti interni: proprietà delle funzionalità.Registra ogni funzionalità all’interno diregister(api) insieme alla chiamata
api.registerProvider(...) esistente. Seleziona solo le schede necessarie:- Sintesi vocale (TTS)
- Trascrizione in tempo reale
- Realtime voice
- Media understanding
- Embeddings
- Image and video generation
- Web fetch and search
assertOkOrThrowProviderError(...) per gli errori HTTP del provider,
in modo che i Plugin condividano la lettura limitata del corpo degli errori,
l’analisi degli errori JSON e i suffissi degli ID richiesta.6
Test
Passaggio 6: test
src/provider.test.ts
Pubblicazione su ClawHub
I Plugin provider vengono pubblicati allo stesso modo di qualsiasi altro Plugin di codice esterno:clawhub skill publish <path> è un comando diverso, destinato alla
pubblicazione di una cartella di skill e non di un pacchetto Plugin: non usarlo
qui.
Struttura dei file
Riferimento per l’ordine del catalogo
catalog.order determina quando il catalogo viene unito rispetto ai provider
integrati:
Passaggi successivi
- Plugin per canali - se il Plugin fornisce anche un canale
- Runtime dell’SDK - helper
api.runtime(TTS, ricerca, subagente) - Panoramica dell’SDK - riferimento completo alle importazioni dei sottopercorsi
- Funzionamento interno dei Plugin - dettagli sugli hook ed esempi inclusi