Skip to main content
Bouw een providerplugin om een modelprovider (LLM) aan OpenClaw toe te voegen: een modelcatalogus, authenticatie met API-sleutel en dynamische modelresolutie.
Nieuw met OpenClaw-plugins? Lees eerst Aan de slag voor de pakketstructuur en het instellen van het manifest.
Providerplugins voegen modellen toe aan de normale inferentielus van OpenClaw. Als het model moet worden uitgevoerd via een native agentdaemon die threads, Compaction of toolgebeurtenissen beheert, combineer de provider dan met een agent- harness in plaats van details van het daemonprotocol in de core te plaatsen.

Stapsgewijze uitleg

1

Pakket en manifest

Stap 1: Pakket en manifest

Met setup.providers[].envVars kan OpenClaw aanmeldgegevens detecteren zonder de runtime van je Plugin te laden. Voeg providerAuthAliases toe wanneer een providervariant de authenticatie van een andere provider-id moet hergebruiken. modelSupport is optioneel en laat OpenClaw je providerplugin automatisch laden op basis van verkorte model-id’s zoals acme-large, voordat runtimehooks bestaan. openclaw.compat en openclaw.build in package.json zijn vereist voor publicatie op ClawHub (openclaw.compat.pluginApi en openclaw.build.openclawVersion zijn de twee vereiste velden; minGatewayVersion valt terug op openclaw.install.minHostVersion wanneer het wordt weggelaten).
2

De provider registreren

Een minimale tekstprovider heeft een id, label, auth en catalog nodig. catalog is de runtime-/configuratiehook die eigendom is van de provider; deze kan live leveranciers-API’s aanroepen en retourneert models.providers-items.
index.ts
registerModelCatalogProvider is het nieuwere catalogusoppervlak van het besturingsvlak voor de gebruikersinterface voor lijsten, hulp en selectie, met ondersteuning voor rijen van text, voice, image_generation, video_generation en music_generation. Houd aanroepen naar leverancierseindpunten en het toewijzen van antwoorden in de Plugin; OpenClaw beheert de gedeelde rijstructuur, bronlabels en de weergave van hulp.Dit is een werkende provider. Gebruikers kunnen nu openclaw onboard --acme-ai-api-key <key> uitvoeren en acme-ai/acme-large als model selecteren.

Live modeldetectie

Als je provider een OpenAI-compatibele /models-API aanbiedt, meld je de helper voor één provider aan voor gedeelde detectie:
liveModelDiscovery: true is een openbaar Plugin SDK-contract met het volgende gedrag:Geef voor een niet-Bearer- of niet-standaard lijsteindpunt opties door in plaats van true:
Gebruik endpointUrl niet als onvoorwaardelijke alternatieve host. De requireBaseUrl-controle ervan vormt de grens voor het isoleren van aanmeldgegevens voor providers waarvan de host voor de modellenlijst verschilt van de host voor inferentie.Als de provider aangepaste modelsemantiek nodig heeft in plaats van de conservatieve OpenAI-compatibele projectie, houd die projectie dan in de Plugin en gebruik openclaw/plugin-sdk/provider-catalog-live-runtime voor de gedeelde ophaallevenscyclus. De helper biedt beveiligde HTTP-ophaalbewerkingen, provider-authenticatieheaders, gestructureerde HTTP-fouten, TTL-caching en statisch terugvalgedrag zonder providerbeleid in de OpenClaw-core te plaatsen.Gebruik buildLiveModelProviderConfig wanneer de live-API je alleen vertelt welke statische catalogusrijen die eigendom zijn van de provider momenteel beschikbaar zijn:
index.ts
Gebruik getCachedLiveProviderModelRows wanneer de provider-API uitgebreidere metadata retourneert en de plugin de rijen zelf naar OpenClaw-modeldefinities moet omzetten:
index.ts
run moet door authenticatie afgeschermd blijven en null retourneren wanneer er geen bruikbare aanmeldgegevens beschikbaar zijn. Zorg voor een offline staticRun of statische terugvaloptie, zodat installatie, documentatie, tests en selectie-interfaces niet afhankelijk zijn van live netwerktoegang. Gebruik een TTL die geschikt is voor de actualiteit van de modellenlijst, vermijd het pollen van het bestandssysteem tijdens verzoeken en geef alleen een providerspecifieke readRows / readModelId door wanneer het upstream-antwoord geen OpenAI-compatibele { data: [{ id, object }] }-vorm heeft.Als de upstream-provider andere besturingstokens gebruikt dan OpenClaw, voeg dan een kleine bidirectionele teksttransformatie toe in plaats van het streampad te vervangen:
input herschrijft de uiteindelijke systeemprompt en de inhoud van tekstberichten vóór het transport. output herschrijft tekstincrementen van de assistent en de uiteindelijke tekst voordat OpenClaw zijn eigen besturingsmarkeringen verwerkt of deze via een kanaal aflevert.Geef voor gebundelde providers die slechts één tekstprovider met API-sleutelauthenticatie plus één runtime op basis van een catalogus registreren de voorkeur aan de specifiekere helper defineSingleProviderPluginEntry(...):
buildProvider is het live cataloguspad dat wordt gebruikt wanneer OpenClaw echte providerauthenticatie kan achterhalen. Het mag providerspecifieke detectie uitvoeren. Gebruik buildStaticProvider alleen voor offline rijen die veilig kunnen worden weergegeven voordat authenticatie is geconfigureerd; hiervoor mogen geen aanmeldgegevens of netwerkverzoeken nodig zijn. De models list --all-weergave van OpenClaw voert statische catalogi momenteel alleen uit voor gebundelde providerplugins, met een lege configuratie, een lege omgeving en zonder agent-/werkruimtepaden.Als je authenticatiestroom tijdens de onboarding ook models.providers.*, aliassen en het standaardmodel van de agent moet aanpassen, gebruik dan de vooraf ingestelde helpers uit openclaw/plugin-sdk/provider-onboard. De specifiekste helpers zijn createDefaultModelPresetAppliers(...), createDefaultModelsPresetAppliers(...) en createModelCatalogPresetAppliers(...).Wanneer het native eindpunt van een provider gestreamde gebruiksblokken via het normale openai-completions-transport ondersteunt, geef dan de voorkeur aan de gedeelde catalogushelpers in openclaw/plugin-sdk/provider-catalog-shared in plaats van controles op provider-ID’s hard te coderen. supportsNativeStreamingUsageCompat(...) en applyProviderNativeStreamingUsageCompat(...) detecteren ondersteuning aan de hand van de mogelijkhedenkaart van het eindpunt, zodat native eindpunten in Moonshot-/DashScope-stijl zich nog steeds aanmelden, zelfs wanneer een plugin een aangepaste provider-ID gebruikt.De bovenstaande voorbeelden voor live detectie behandelen provider-API’s in /models-stijl. Houd die detectie binnen catalog.run, afgeschermd op basis van bruikbare authenticatie, en zorg dat staticRun netwerkvrij blijft voor het genereren van offline catalogi.
3

Dynamische modelresolutie toevoegen

Als je provider willekeurige model-ID’s accepteert (zoals een proxy of router), voeg dan resolveDynamicModel toe:
Als voor de resolutie een netwerkoproep nodig is, gebruik dan prepareDynamicModel voor asynchrone opwarming; resolveDynamicModel wordt opnieuw uitgevoerd nadat deze is voltooid.
4

Runtime-hooks toevoegen (indien nodig)

De meeste providers hebben alleen catalog + resolveDynamicModel nodig. Voeg hooks stapsgewijs toe wanneer je provider ze nodig heeft.Gedeelde helperbouwers ondersteunen nu de meest voorkomende families voor replay-/toolcompatibiliteit, zodat plugins meestal niet elke hook afzonderlijk handmatig hoeven te koppelen:
Momenteel beschikbare replayfamilies:Momenteel beschikbare streamfamilies:
Elke familiebouwer is samengesteld uit openbare helpers op lager niveau die vanuit hetzelfde pakket worden geëxporteerd. Je kunt deze gebruiken wanneer een provider van het algemene patroon moet afwijken:
  • openclaw/plugin-sdk/provider-model-shared - ProviderReplayFamily, buildProviderReplayFamilyHooks(...) en de onbewerkte replaybouwers (buildOpenAICompatibleReplayPolicy, buildAnthropicReplayPolicyForModel, buildGoogleGeminiReplayPolicy, buildHybridAnthropicOrOpenAIReplayPolicy). Exporteert ook Gemini-replayhelpers (sanitizeGoogleGeminiReplayHistory, resolveTaggedReasoningOutputMode) en helpers voor endpoints/modellen (resolveProviderEndpoint, normalizeProviderId, normalizeGooglePreviewModelId).
  • openclaw/plugin-sdk/provider-stream - ProviderStreamFamily, buildProviderStreamFamilyHooks(...), composeProviderStreamWrappers(...), plus de gedeelde OpenAI/Codex-wrappers (createOpenAIAttributionHeadersWrapper, createOpenAIFastModeWrapper, createOpenAIServiceTierWrapper, createOpenAIResponsesContextManagementWrapper, createCodexNativeWebSearchWrapper), de OpenAI-compatibele DeepSeek V4-wrapper (createDeepSeekV4OpenAICompatibleThinkingWrapper), opschoning van thinking-prefill voor Anthropic Messages (createAnthropicThinkingPrefillPayloadWrapper), compatibiliteit met toolaanroepen in platte tekst (createPlainTextToolCallCompatWrapper) en gedeelde proxy-/providerwrappers (createOpenRouterWrapper, createToolStreamWrapper, createMinimaxFastModeWrapper).
  • openclaw/plugin-sdk/provider-stream-shared - lichtgewicht payload- en eventwrappers voor intensief gebruikte providerpaden, waaronder createOpenAICompatibleCompletionsThinkingOffWrapper, createPayloadPatchStreamWrapper, createPlainTextToolCallCompatWrapper, normalizeOpenAICompatibleReasoningPayload(...) en setQwenChatTemplateThinking(...).
  • openclaw/plugin-sdk/provider-tools - ProviderToolCompatFamily, buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai") en onderliggende providerschemahelpers.
Houd voor providers uit de Gemini-familie de modus voor reasoning-uitvoer afgestemd op het transport. Providers die rechtstreeks de Google Gemini API gebruiken, moeten native- reasoning-uitvoer gebruiken, zodat OpenClaw native thought-onderdelen verwerkt zonder <think>- / <final>-promptinstructies toe te voegen. Gemini CLI-achtige backends die alleen tekst gebruiken en een definitief JSON-/tekstantwoord parseren, kunnen het gedeelde getagde google-gemini-contract behouden.Sommige streamhelpers blijven bewust lokaal bij de provider. @openclaw/anthropic-provider houdt wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier en de Anthropic-wrapperbouwers op lager niveau in het eigen openbare api.ts- / contract-api.ts-koppelvlak, omdat deze de afhandeling van Claude OAuth-bèta en context1m-beperking coderen. De xAI-plugin houdt op vergelijkbare wijze de vormgeving van native xAI Responses in de eigen wrapStreamFn (/fast-aliassen, standaard tool_stream, opschoning van niet-ondersteunde strikte tools, xAI-specifieke verwijdering van reasoning-payloads).Hetzelfde patroon voor de pakketroot ligt ook ten grondslag aan @openclaw/openai-provider (providerbouwers, helpers voor standaardmodellen, realtime-providerbouwers) en @openclaw/openrouter-provider (providerbouwer plus helpers voor onboarding/configuratie).
Voor providers die vóór elke inferentieaanroep een tokenuitwisseling nodig hebben:
OpenClaw roept hooks voor model-/providerplugins ongeveer in deze volgorde aan. De meeste providers gebruiken er slechts 2-3. Dit is niet het volledige ProviderPlugin- contract; zie Internals: hooks voor de providerruntime voor de volledige, momenteel actuele lijst met hooks en opmerkingen over terugval. Providervelden die uitsluitend voor compatibiliteit dienen en die OpenClaw niet meer aanroept, zoals ProviderPlugin.capabilities en suppressBuiltInModel, worden hier niet vermeld.Opmerkingen over runtimeterugval:
  • normalizeConfig bepaalt per provider-id één verantwoordelijke plugin (eerst gebundelde providers, daarna de overeenkomende runtimeplugin) en roept alleen die hook aan - er wordt niet in andere providers gezocht. De eigen normalizeConfig-hook van Google normaliseert de configuratie-items google / google-vertex / google-antigravity; dit is geen afzonderlijke core-fallback.
  • resolveConfigApiKey gebruikt de providerhook wanneer die beschikbaar is. Amazon Bedrock behoudt de resolutie van AWS-omgevingsmarkeringen in zijn providerplugin; runtime-authenticatie zelf gebruikt nog steeds de standaardketen van de AWS SDK wanneer deze is geconfigureerd met auth: "aws-sdk".
  • resolveThinkingProfile(ctx) ontvangt de geselecteerde provider, modelId, de optionele samengevoegde catalogushint reasoning en de optionele samengevoegde modelfeiten van compat. Gebruik compat alleen om de denkinterface/het denkprofiel van de provider te selecteren.
  • resolveSystemPromptContribution laat een provider cachebewuste richtlijnen voor de systeemprompt injecteren voor een modelfamilie. Geef hieraan de voorkeur boven de verouderde pluginbrede hook before_prompt_build wanneer het gedrag bij één provider/modelfamilie hoort en de stabiele/dynamische cachesplitsing moet behouden.
5

Extra mogelijkheden toevoegen (optioneel)

Stap 5: Extra mogelijkheden toevoegen

Een providerplugin kan naast tekstinferentie embeddings, spraak, realtime transcriptie, realtime spraak, mediabegrip, afbeeldingsgeneratie, videogeneratie, webophaling en webzoekopdrachten registreren. OpenClaw classificeert dit als een plugin met hybride mogelijkheden - het aanbevolen patroon voor bedrijfsplugins (één plugin per leverancier). Zie Intern: Eigendom van mogelijkheden.Registreer elke mogelijkheid binnen register(api) naast je bestaande aanroep van api.registerProvider(...). Kies alleen de tabbladen die je nodig hebt:
Gebruik assertOkOrThrowProviderError(...) voor HTTP-fouten van providers, zodat plugins begrensde lezingen van foutteksten, verwerking van JSON-fouten en achtervoegsels met aanvraag-id’s delen.
6

Testen

Stap 6: Testen

src/provider.test.ts

Publiceren naar ClawHub

Providerplugins worden op dezelfde manier gepubliceerd als elke andere externe codeplugin:
clawhub skill publish <path> is een andere opdracht voor het publiceren van een Skills-map, niet van een pluginpakket — gebruik deze hier niet.

Bestandsstructuur

Referentie voor catalogusvolgorde

catalog.order bepaalt wanneer je catalogus wordt samengevoegd ten opzichte van ingebouwde providers:

Volgende stappen

Gerelateerd