Skip to main content
Crea un Plugin provider per aggiungere un provider di modelli (LLM) a OpenClaw: un catalogo di modelli, autenticazione tramite chiave API e risoluzione dinamica dei modelli.
Non conosci ancora i Plugin di OpenClaw? Leggi prima la Guida introduttiva per la struttura del pacchetto e la configurazione del manifesto.
I Plugin provider aggiungono modelli al normale ciclo di inferenza di OpenClaw. Se il modello deve essere eseguito tramite un demone agente nativo che gestisce thread, Compaction o eventi degli strumenti, abbina al provider un harness per agenti, anziché inserire nel core i dettagli del protocollo del demone.

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 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
Usa 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 resolveDynamicModel:
Se la risoluzione richiede una chiamata di rete, usa 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 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 riproduzione attualmente disponibili:Famiglie di streaming attualmente disponibili:
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, inclusi createOpenAICompatibleCompletionsThinkingOffWrapper, createPayloadPatchStreamWrapper, createPlainTextToolCallCompatWrapper, normalizeOpenAICompatibleReasoningPayload(...) e setQwenChatTemplateThinking(...).
  • openclaw/plugin-sdk/provider-tools - ProviderToolCompatFamily, buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai") e le funzioni ausiliarie sottostanti per gli schemi dei provider.
Per i provider della famiglia Gemini, mantieni la modalità di output del ragionamento allineata al trasporto. I provider diretti dell’API Google Gemini devono usare l’output di ragionamento 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).
Per i provider che richiedono uno scambio di token prima di ogni chiamata di inferenza:
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:
  • normalizeConfig risolve 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’hook normalizeConfig di Google a normalizzare le voci di configurazione google / google-vertex / google-antigravity; non si tratta di un fallback separato del core.
  • resolveConfigApiKey utilizza 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 con auth: "aws-sdk".
  • resolveThinkingProfile(ctx) riceve il provider selezionato, modelId, il suggerimento facoltativo del catalogo reasoning unificato e i dati facoltativi compat unificati del modello. Usa compat solo per selezionare l’interfaccia/il profilo di ragionamento del provider.
  • resolveSystemPromptContribution consente a un provider di inserire indicazioni per il prompt di sistema sensibili alla cache per una famiglia di modelli. Preferiscilo all’hook legacy before_prompt_build applicato 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 di register(api) insieme alla chiamata api.registerProvider(...) esistente. Seleziona solo le schede necessarie:
Usa 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

catalog.order determina quando il catalogo viene unito rispetto ai provider integrati:

Passaggi successivi

Contenuti correlati