Als je nog niet eerder een OpenClaw-Plugin hebt gebouwd, lees dan eerst
Aan de slag voor de basispakketstructuur
en manifestconfiguratie.
Stapsgewijze handleiding
Package and manifest
Stap 1: Pakket en manifest
setup.providers[].envVars zodat OpenClaw
referenties kan detecteren zonder je Plugin-runtime te laden. Voeg
providerAuthAliases toe wanneer een providervariant de authenticatie van
een andere provider-id moet hergebruiken. modelSupport is optioneel en laat
OpenClaw je provider-Plugin automatisch laden vanuit verkorte model-id’s
zoals acme-large voordat runtime-hooks bestaan. Als je de provider op
ClawHub publiceert, zijn die velden openclaw.compat en openclaw.build
verplicht in package.json.Register the provider
Een minimale tekstprovider heeft een Gebruik
id, label, auth en catalog
nodig. catalog is de runtime-/configuratiehook die eigendom is van de
provider; deze kan live vendor-API’s aanroepen en retourneert
models.providers-items.index.ts
registerModelCatalogProvider is het nieuwere control-plane catalogusvlak
voor lijst-, help- en picker-UI. Gebruik het voor rijen voor tekst,
beeldgeneratie, videogeneratie en muziekgeneratie. Houd vendor-eindpunt-
aanroepen en response-mapping in de Plugin; OpenClaw beheert de gedeelde
rijvorm, bronlabels en helpweergave.Dat is een werkende provider. Gebruikers kunnen nu
openclaw onboard --acme-ai-api-key <key> uitvoeren en
acme-ai/acme-large als hun model selecteren.Live modeldetectie
Als je provider een/models-achtige API aanbiedt, houd dan het
providerspecifieke eindpunt en de rijprojectie in je Plugin en gebruik
openclaw/plugin-sdk/provider-catalog-live-runtime voor de gedeelde
fetch-levenscyclus. De helper geeft je bewaakte HTTP-fetches,
provider-auth-headers, gestructureerde HTTP-fouten, TTL-caching en statisch
fallbackgedrag zonder providerbeleid in de OpenClaw-kern te plaatsen.Gebruik buildLiveModelProviderConfig wanneer de live API alleen aangeeft
welke statische catalogusrijen die eigendom zijn van de provider momenteel
beschikbaar zijn:index.ts
getCachedLiveProviderModelRows wanneer de provider-API rijkere
metadata retourneert en de Plugin zelf rijen naar OpenClaw-modeldefinities
moet projecteren:index.ts
run moet door authenticatie bewaakt blijven en null retourneren wanneer
er geen bruikbare referentie beschikbaar is. Houd een offline staticRun of
statische fallback aan zodat installatie, docs, tests en picker-oppervlakken
niet afhankelijk zijn van live netwerktoegang. Gebruik een TTL die passend is
voor de versheid van de modellenlijst, vermijd filesystem-polling tijdens
requests en geef alleen een providerspecifieke readRows / readModelId
door wanneer de upstreamrespons geen OpenAI-compatibele
{ data: [{ id, object }] }-vorm heeft.Als de upstreamprovider andere controletokens gebruikt dan OpenClaw, voeg dan
een kleine bidirectionele teksttransformatie toe in plaats van het streampad
te vervangen:input herschrijft de uiteindelijke systeemprompt en tekstberichtinhoud
vóór transport. output herschrijft assistent-tekstdelta’s en de finale
tekst voordat OpenClaw zijn eigen controlemarkers of kanaalbezorging parseert.Voor gebundelde providers die slechts één tekstprovider registreren met
API-sleutel-authenticatie plus één catalogusgestuurde runtime, geef de
voorkeur aan de smallere helper defineSingleProviderPluginEntry(...):buildProvider is het live cataloguspad dat wordt gebruikt wanneer OpenClaw echte
provider-auth kan oplossen. Het mag providerspecifieke detectie uitvoeren. Gebruik
buildStaticProvider alleen voor offline rijen die veilig zijn om te tonen voordat auth
is geconfigureerd; het mag geen referenties vereisen of netwerkverzoeken doen.
De weergave models list --all van OpenClaw voert momenteel statische catalogi
alleen uit voor gebundelde providerplugins, met een lege config, lege env en geen
agent-/werkruimtepaden.Als je auth-flow ook models.providers.*, aliassen en
het standaardmodel van de agent tijdens onboarding moet patchen, gebruik dan de presethelpers uit
openclaw/plugin-sdk/provider-onboard. De smalste helpers zijn
createDefaultModelPresetAppliers(...),
createDefaultModelsPresetAppliers(...) en
createModelCatalogPresetAppliers(...).Wanneer een native endpoint van een provider gestreamde gebruiksblokken ondersteunt op het
normale openai-completions-transport, geef dan de voorkeur aan de gedeelde catalogushelpers in
openclaw/plugin-sdk/provider-catalog-shared in plaats van
provider-id-controles hard te coderen. supportsNativeStreamingUsageCompat(...) en
applyProviderNativeStreamingUsageCompat(...) detecteren ondersteuning vanuit de
endpoint-capabilitymap, zodat native Moonshot-/DashScope-achtige endpoints nog steeds
aanmelden, zelfs wanneer een plugin een aangepaste provider-id gebruikt.De live detectievoorbeelden hierboven behandelen provider-API’s in /models-stijl. Houd
die detectie binnen catalog.run, afgeschermd op bruikbare auth, en houd
staticRun netwerkvrij voor offline catalogusgeneratie.Dynamische modelresolutie toevoegen
Als je provider willekeurige model-ID’s accepteert (zoals een proxy of router),
voeg dan Als oplossen een netwerkoproep vereist, gebruik dan
resolveDynamicModel toe:prepareDynamicModel voor asynchrone
warming-up - resolveDynamicModel draait opnieuw nadat dit is voltooid.Runtime-hooks toevoegen (waar nodig)
De meeste providers hebben alleen Vandaag beschikbare replay-families:
Vandaag beschikbare stream-families:
catalog + resolveDynamicModel nodig. Voeg hooks
stapsgewijs toe wanneer je provider ze vereist.Gedeelde helperbuilders dekken nu de meest voorkomende replay-/tool-compat-
families, dus plugins hoeven meestal niet elke hook een voor een handmatig te verbinden:| Familie | Wat ermee wordt verbonden | Gebundelde voorbeelden |
|---|---|---|
openai-compatible | Gedeeld OpenAI-stijl replaybeleid voor OpenAI-compatibele transporten, inclusief opschoning van tool-call-id’s, fixes voor assistant-first-volgorde en generieke Gemini-turnvalidatie waar het transport die nodig heeft | moonshot, ollama, xai, zai |
anthropic-by-model | Claude-bewust replaybeleid gekozen op basis van modelId, zodat Anthropic-message-transporten alleen Claude-specifieke opschoning van thinking-blokken krijgen wanneer het opgeloste model daadwerkelijk een Claude-id is | amazon-bedrock, anthropic-vertex |
google-gemini | Native Gemini-replaybeleid plus bootstrap-replayopschoning. De gedeelde familie houdt de tekstuitvoer Gemini CLI op tagged reasoning; de directe google-provider overschrijft resolveReasoningOutputMode naar native omdat Gemini API-thinking aankomt als native thought parts. | google, google-gemini-cli |
passthrough-gemini | Opschoning van Gemini-thought-signatures voor Gemini-modellen die via OpenAI-compatibele proxytransporten draaien; schakelt geen native Gemini-replayvalidatie of bootstrap-herschrijvingen in | openrouter, kilocode, opencode, opencode-go |
hybrid-anthropic-openai | Hybride beleid voor providers die Anthropic-message- en OpenAI-compatibele modeloppervlakken in één plugin combineren; optioneel Claude-only verwijderen van thinking-blokken blijft beperkt tot de Anthropic-kant | minimax |
| Familie | Wat ermee wordt verbonden | Gebundelde voorbeelden |
|---|---|---|
google-thinking | Normalisatie van Gemini-thinking-payloads op het gedeelde streampad | google, google-gemini-cli |
kilocode-thinking | Kilo-reasoningwrapper op het gedeelde proxystreampad, waarbij kilo/auto en niet-ondersteunde proxy-reasoning-id’s injected thinking overslaan | kilocode |
moonshot-thinking | Moonshot binaire native-thinking-payloadmapping vanuit config + /think-niveau | moonshot |
minimax-fast-mode | MiniMax fast-mode modelherschrijving op het gedeelde streampad | minimax, minimax-portal |
openai-responses-defaults | Gedeelde native OpenAI/Codex Responses-wrappers: attributieheaders, /fast/serviceTier, tekstverboseheid, native Codex-webzoekfunctie, vormgeving van reasoning-compat-payloads en Responses-contextbeheer | openai |
openrouter-thinking | OpenRouter reasoningwrapper voor proxyroutes, waarbij overslaan voor niet-ondersteunde modellen/auto centraal wordt afgehandeld | openrouter |
tool-stream-default-on | Standaard ingeschakelde tool_stream-wrapper voor providers zoals Z.AI die toolstreaming willen tenzij dit expliciet is uitgeschakeld | zai |
SDK-seams die de familiebuilders aandrijven
SDK-seams die de familiebuilders aandrijven
Elke familiebuilder is samengesteld uit lagere openbare helpers die uit hetzelfde pakket worden geëxporteerd, die je kunt gebruiken wanneer een provider van het algemene patroon moet afwijken:
openclaw/plugin-sdk/provider-model-shared-ProviderReplayFamily,buildProviderReplayFamilyHooks(...)en de ruwe replaybuilders (buildOpenAICompatibleReplayPolicy,buildAnthropicReplayPolicyForModel,buildGoogleGeminiReplayPolicy,buildHybridAnthropicOrOpenAIReplayPolicy). Exporteert ook Gemini-replayhelpers (sanitizeGoogleGeminiReplayHistory,resolveTaggedReasoningOutputMode) en endpoint-/modelhelpers (resolveProviderEndpoint,normalizeProviderId,normalizeGooglePreviewModelId).openclaw/plugin-sdk/provider-stream-ProviderStreamFamily,buildProviderStreamFamilyHooks(...),composeProviderStreamWrappers(...), plus de gedeelde OpenAI/Codex-wrappers (createOpenAIAttributionHeadersWrapper,createOpenAIFastModeWrapper,createOpenAIServiceTierWrapper,createOpenAIResponsesContextManagementWrapper,createCodexNativeWebSearchWrapper), DeepSeek V4 OpenAI-compatibele wrapper (createDeepSeekV4OpenAICompatibleThinkingWrapper), Anthropic Messages thinking prefill cleanup (createAnthropicThinkingPrefillPayloadWrapper), plain-text tool-call compat (createPlainTextToolCallCompatWrapper) en gedeelde proxy-/providerwrappers (createOpenRouterWrapper,createToolStreamWrapper,createMinimaxFastModeWrapper).openclaw/plugin-sdk/provider-stream-shared- lichte payload- en eventwrappers voor hete providerpaden, inclusiefcreateOpenAICompatibleCompletionsThinkingOffWrapper,createPayloadPatchStreamWrapper,createPlainTextToolCallCompatWrapper,normalizeOpenAICompatibleReasoningPayload(...)ensetQwenChatTemplateThinking(...).openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily,buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai")en onderliggende providerschemahelpers.
native
reasoning-uitvoer gebruiken, zodat OpenClaw native thought parts verbruikt zonder
<think>- / <final>-promptdirectieven toe te voegen. Tekst-only Gemini CLI-achtige
backends die een finale JSON-/tekstrespons parsen, kunnen het gedeelde
google-gemini tagged contract behouden.Sommige streamhelpers blijven bewust provider-lokaal. @openclaw/anthropic-provider houdt wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier en de lagere Anthropic-wrapperbuilders in zijn eigen openbare api.ts- / contract-api.ts-seam omdat ze Claude OAuth-betabehandeling en context1m-gating coderen. De xAI-plugin houdt native xAI Responses-vormgeving op vergelijkbare wijze in zijn eigen wrapStreamFn (/fast-aliassen, standaard tool_stream, opschoning van niet-ondersteunde strict-tools, xAI-specifieke verwijdering van reasoning-payloads).Hetzelfde package-root-patroon ondersteunt ook @openclaw/openai-provider (providerbuilders, standaardmodelhelpers, realtime providerbuilders) en @openclaw/openrouter-provider (providerbuilder plus onboarding-/confighelpers).- Tokenuitwisseling
- Aangepaste headers
- Native transportidentiteit
- Gebruik en facturering
Voor providers die vóór elke inference-aanroep een tokenuitwisseling nodig hebben:
Alle beschikbare provider-hooks
Alle beschikbare provider-hooks
OpenClaw roept hooks in deze volgorde aan. De meeste providers gebruiken er slechts 2-3:
Alleen-compatibiliteit-provider-velden die OpenClaw niet meer aanroept, zoals
Opmerkingen over runtimefallback:
ProviderPlugin.capabilities en suppressBuiltInModel, worden hier niet
vermeld.| # | Hook | Wanneer te gebruiken |
|---|---|---|
| 1 | catalog | Modelcatalogus of standaardinstellingen voor basis-URL |
| 2 | applyConfigDefaults | Provider-eigen globale standaardwaarden tijdens configmaterialisatie |
| 3 | normalizeModelId | Opschoning van legacy-/preview-model-id-aliassen vóór lookup |
| 4 | normalizeTransport | Opschoning van providerfamilie-api / baseUrl vóór generieke modelsamenstelling |
| 5 | normalizeConfig | models.providers.<id>-config normaliseren |
| 6 | applyNativeStreamingUsageCompat | Compat-herschrijvingen voor native streaminggebruik voor configproviders |
| 7 | resolveConfigApiKey | Provider-eigen env-marker-authresolutie |
| 8 | resolveSyntheticAuth | Lokale/zelfgehoste of config-onderbouwde synthetische auth |
| 9 | shouldDeferSyntheticProfileAuth | Synthetische opgeslagen-profiel-placeholders lager zetten achter env-/config-auth |
| 10 | resolveDynamicModel | Willekeurige upstream-model-ID’s accepteren |
| 11 | prepareDynamicModel | Asynchrone metadatafetch vóór resolutie |
| 12 | normalizeResolvedModel | Transportherschrijvingen vóór de runner |
| 13 | normalizeToolSchemas | Provider-eigen opschoning van tool-schema’s vóór registratie |
| 14 | inspectToolSchemas | Provider-eigen diagnostiek voor tool-schema’s |
| 15 | resolveReasoningOutputMode | Tagged versus native contract voor reasoning-output |
| 16 | prepareExtraParams | Standaard aanvraagparameters |
| 17 | createStreamFn | Volledig aangepaste StreamFn-transport |
| 19 | wrapStreamFn | Aangepaste headers/body-wrappers op het normale streampad |
| 20 | resolveTransportTurnState | Native headers/metadata per beurt |
| 21 | resolveWebSocketSessionPolicy | Native WS-sessieheaders/cooldown |
| 22 | formatApiKey | Aangepaste runtimetokenvorm |
| 23 | refreshOAuth | Aangepaste OAuth-refresh |
| 24 | buildAuthDoctorHint | Richtlijnen voor authherstel |
| 25 | matchesContextOverflowError | Provider-eigen overflowdetectie |
| 26 | classifyFailoverReason | Provider-eigen classificatie van rate-limits/overbelasting |
| 27 | isCacheTtlEligible | TTL-gating voor promptcache |
| 28 | buildMissingAuthMessage | Aangepaste hint voor ontbrekende auth |
| 29 | augmentModelCatalog | Synthetische forward-compat-rijen |
| 30 | resolveThinkingProfile | Modelspecifieke /think-optieset |
| 31 | isBinaryThinking | Compatibiliteit voor binair denken aan/uit |
| 32 | supportsXHighThinking | Compatibiliteit voor ondersteuning van xhigh-redeneren |
| 33 | resolveDefaultThinkingLevel | Compatibiliteit voor standaardbeleid van /think |
| 34 | isModernModelRef | Live-/smoke-modelmatching |
| 35 | prepareRuntimeAuth | Tokenuitwisseling vóór inferentie |
| 36 | resolveUsageAuth | Aangepaste parsing van gebruiksreferenties |
| 37 | fetchUsageSnapshot | Aangepast gebruikseindpunt |
| 38 | createEmbeddingProvider | Provider-eigen embedding-adapter voor geheugen/zoekfunctie |
| 39 | buildReplayPolicy | Aangepast beleid voor transcript-replay/Compaction |
| 40 | sanitizeReplayHistory | Provider-specifieke replay-herschrijvingen na generieke opschoning |
| 41 | validateReplayTurns | Strikte validatie van replay-beurten vóór de embedded runner |
| 42 | onModelSelected | Callback na selectie (bijv. telemetrie) |
normalizeConfigcontroleert eerst de gematchte provider en daarna andere providerplugins met hookmogelijkheden totdat er één de config daadwerkelijk wijzigt. Als geen providerhook een ondersteunde Google-familieconfig-entry herschrijft, wordt de gebundelde Google-confignormalizer nog steeds toegepast.resolveConfigApiKeygebruikt de providerhook wanneer die beschikbaar is. Amazon Bedrock houdt AWS env-marker-resolutie in zijn providerplugin; runtime-auth zelf gebruikt nog steeds de standaardketen van de AWS SDK wanneer geconfigureerd metauth: "aws-sdk".resolveThinkingProfile(ctx)ontvangt de geselecteerdeprovider,modelId, optionele samengevoegdereasoning-catalogushint en optionele samengevoegde model-compat-feiten. Gebruikcompatalleen om de thinking-UI/het thinking-profiel van de provider te selecteren.resolveSystemPromptContributionlaat een provider cachebewuste system-prompt-richtlijnen injecteren voor een modelfamilie. Geef hier de voorkeur aan bovenbefore_prompt_buildwanneer het gedrag bij één provider/modelfamilie hoort en de stabiele/dynamische cachesplitsing moet behouden.
Extra mogelijkheden toevoegen (optioneel)
Stap 5: Extra mogelijkheden toevoegen
Een providerplugin kan embeddings, spraak, realtime transcriptie, realtime stem, media-understanding, beeldgeneratie, videogeneratie, webfetch en webzoekfunctie naast tekstinferentie registreren. OpenClaw classificeert dit als een hybrid-capability-plugin - het aanbevolen patroon voor bedrijfsplugins (één plugin per leverancier). Zie Internals: Capability Ownership.Registreer elke mogelijkheid binnenregister(api) naast je bestaande
api.registerProvider(...)-aanroep. Kies alleen de tabs die je nodig hebt:- Spraak (TTS)
- Realtime transcriptie
- Realtime stem
- Media understanding
- Embeddings
- Image and video generation
- Web fetch and search
assertOkOrThrowProviderError(...) voor provider-HTTP-fouten zodat
plugins afgetopte reads van error-body’s, JSON-error-parsing en
request-id-suffixen delen.Test
Stap 6: Testen
src/provider.test.ts
Publiceren naar ClawHub
Provider-plugins worden op dezelfde manier gepubliceerd als elke andere externe codeplugin:clawhub package publish gebruiken.
Bestandsstructuur
Referentie voor catalogusvolgorde
catalog.order bepaalt wanneer je catalogus wordt samengevoegd ten opzichte van ingebouwde
providers:
| Volgorde | Wanneer | Gebruiksscenario |
|---|---|---|
simple | Eerste pass | Gewone API-sleutelproviders |
profile | Na simple | Providers afgeschermd door auth-profielen |
paired | Na profile | Meerdere gerelateerde entries synthetiseren |
late | Laatste pass | Bestaande providers overschrijven (wint bij botsing) |
Volgende stappen
- Kanaalplugins - als je plugin ook een kanaal levert
- SDK Runtime -
api.runtime-helpers (TTS, zoeken, subagent) - SDK-overzicht - volledige importreferentie voor subpaden
- Plugin-internals - hookdetails en gebundelde voorbeelden