Deze gids leidt je door het bouwen van een provider-Plugin die een modelprovider (LLM) aan OpenClaw toevoegt. Aan het einde heb je een provider met een modelcatalogus, API-sleutelauthenticatie en dynamische modelresolutie.Documentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Als je nog niet eerder een OpenClaw-Plugin hebt gebouwd, lees dan eerst
Aan de slag voor de basisstructuur van het pakket
en de manifestconfiguratie.
Stapsgewijze handleiding
Pakket en manifest
Stap 1: Pakket en manifest
providerAuthEnvVars zodat OpenClaw
inloggegevens kan detecteren zonder de runtime van je Plugin te laden. Voeg providerAuthAliases
toe wanneer een providervariant de auth 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.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
vendor-API’s aanroepen en retourneert models.providers-items.index.ts
registerModelCatalogProvider is het nieuwere control-plane-catalogusoppervlak
voor UI voor lijsten/help/kiezers. Gebruik het voor rijen voor tekst,
afbeeldingsgeneratie, videogeneratie en muziekgeneratie. Houd aanroepen naar vendor-eindpunten en
responsmapping in de Plugin; OpenClaw is eigenaar van 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.Als de upstream-provider 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 definitieve tekst voordat
OpenClaw zijn eigen controlemarkeringen of kanaalbezorging parseert.Voor gebundelde providers die slechts één tekstprovider registreren met API-sleutel-
auth plus één door de catalogus ondersteunde runtime, geef de voorkeur aan de smallere
helper defineSingleProviderPluginEntry(...):buildProvider is het live-cataloguspad dat wordt gebruikt wanneer OpenClaw echte
providerauth kan oplossen. Het mag provider-specifieke ontdekking uitvoeren. Gebruik
buildStaticProvider alleen voor offline rijen die veilig zijn om te tonen voordat auth
is geconfigureerd; het mag geen inloggegevens vereisen of netwerkverzoeken doen.
De weergave models list --all van OpenClaw voert momenteel statische catalogi
alleen uit voor gebundelde provider-Plugins, met een lege config, lege env en zonder
agent-/workspacepaden.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 het native eindpunt van een provider gestreamde gebruiksblokken op het
normale openai-completions-transport ondersteunt, 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
capability-map van het eindpunt, zodat native Moonshot-/DashScope-achtige eindpunten zich nog steeds
aanmelden, zelfs wanneer een Plugin een aangepaste provider-id gebruikt.Dynamische modelresolutie toevoegen
Als je provider willekeurige model-ID’s accepteert (zoals een proxy of router),
voeg dan Als oplossen een netwerkaanroep vereist, gebruik dan
resolveDynamicModel toe:prepareDynamicModel voor asynchrone
opwarming - resolveDynamicModel wordt opnieuw uitgevoerd nadat dit is voltooid.Runtime-hooks toevoegen (indien nodig)
De meeste providers hebben alleen Beschikbare replayfamilies vandaag:
Vandaag beschikbare streamfamilies:
catalog + resolveDynamicModel nodig. Voeg hooks
stapsgewijs toe wanneer je provider ze vereist.Gedeelde helperbuilders dekken nu de meest voorkomende replay-/toolcompatibiliteits-
families, zodat Plugins meestal niet elke hook één voor één met de hand hoeven te verbinden:| Familie | Wat het koppelt | Meegeleverde voorbeelden |
|---|---|---|
openai-compatible | Gedeeld OpenAI-achtig replaybeleid voor OpenAI-compatibele transporten, inclusief opschoning van tool-call-id’s, oplossingen voor assistant-first-volgorde en generieke Gemini-turn-validatie waar het transport dit nodig heeft | moonshot, ollama, xai, zai |
anthropic-by-model | Claude-bewust replaybeleid gekozen door 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 opschoning van bootstrap-replay en modus voor getagde reasoning-uitvoer | 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 verwijderen van thinking-blokken alleen voor Claude blijft beperkt tot de Anthropic-kant | minimax |
| Familie | Wat het koppelt | Meegeleverde voorbeelden |
|---|---|---|
google-thinking | Normalisatie van Gemini-thinking-payloads op het gedeelde streampad | google, google-gemini-cli |
kilocode-thinking | Kilo-reasoning-wrapper op het gedeelde proxy-streampad, waarbij kilo/auto en niet-ondersteunde proxy-reasoning-id’s geïnjecteerde 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, tekstuitgebreidheid, native Codex-webzoekactie, reasoning-compat-payloadvorming en Responses-contextbeheer | openai, openai-codex |
openrouter-thinking | OpenRouter-reasoning-wrapper 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 familiebouwers aandrijven
SDK-seams die de familiebouwers aandrijven
Elke familiebouwer is samengesteld uit lagere openbare helpers die uit hetzelfde pakket worden geëxporteerd en die je kunt gebruiken wanneer een provider van het gemeenschappelijke 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 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-opruiming van thinking-prefill (createAnthropicThinkingPrefillPayloadWrapper) en gedeelde proxy-/providerwrappers (createOpenRouterWrapper,createToolStreamWrapper,createMinimaxFastModeWrapper).openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily,buildProviderToolCompatFamilyHooks("gemini")en onderliggende Gemini-schemahelpers (normalizeGeminiToolSchemas,inspectGeminiToolSchemas).
@openclaw/anthropic-provider houdt wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier en de lagere Anthropic-wrapperbouwers in zijn eigen openbare api.ts / contract-api.ts-seam omdat ze Claude OAuth-bèta-afhandeling en context1m-gating coderen. De xAI-plugin houdt native xAI Responses-vorming op vergelijkbare wijze in zijn eigen wrapStreamFn (/fast-aliassen, standaard tool_stream, opschoning van niet-ondersteunde strikte tools, xAI-specifieke verwijdering van reasoning-payloads).Hetzelfde pakket-rootpatroon ondersteunt ook @openclaw/openai-provider (providerbouwers, default-modelhelpers, realtime-providerbouwers) en @openclaw/openrouter-provider (providerbouwer 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 providerhooks
Alle beschikbare providerhooks
OpenClaw roept hooks in deze volgorde aan. De meeste providers gebruiken er slechts 2-3:
Provider-velden die alleen nog voor compatibiliteit bestaan en die OpenClaw niet meer aanroept, zoals
Runtime-fallbacknotities:
ProviderPlugin.capabilities en suppressBuiltInModel, worden hier niet vermeld.| # | Hook | Wanneer te gebruiken |
|---|---|---|
| 1 | catalog | Modelcatalogus of standaardwaarden voor base-URL |
| 2 | applyConfigDefaults | Globale standaardwaarden in eigendom van de provider tijdens configmaterialisatie |
| 3 | normalizeModelId | Opschoning van legacy-/preview-model-id-aliassen vóór lookup |
| 4 | normalizeTransport | Opschoning van providerfamilie-api / baseUrl vóór generieke modelassemblage |
| 5 | normalizeConfig | models.providers.<id>-config normaliseren |
| 6 | applyNativeStreamingUsageCompat | Native streaming-usage-compat-herschrijvingen voor configproviders |
| 7 | resolveConfigApiKey | Auth-resolutie van env-markers in eigendom van de provider |
| 8 | resolveSyntheticAuth | Lokale/zelfgehoste of config-ondersteunde synthetische auth |
| 9 | shouldDeferSyntheticProfileAuth | Synthetische opgeslagen-profiel-placeholders lager prioriteren 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 | contributeResolvedModelCompat | Compatflags voor vendormodellen achter een ander compatibel transport |
| 14 | normalizeToolSchemas | Opschoning van toolschema’s in eigendom van de provider vóór registratie |
| 15 | inspectToolSchemas | Toolschema-diagnostiek in eigendom van de provider |
| 16 | resolveReasoningOutputMode | Contract voor getagde versus native reasoning-uitvoer |
| 17 | prepareExtraParams | Standaard requestparameters |
| 18 | createStreamFn | Volledig aangepast StreamFn-transport |
| 19 | wrapStreamFn | Aangepaste header-/bodywrappers op het normale streampad |
| 20 | resolveTransportTurnState | Native headers/metadata per turn |
| 21 | resolveWebSocketSessionPolicy | Native WS-sessieheaders/-cooldown |
| 22 | formatApiKey | Aangepaste runtime-tokenvorm |
| 23 | refreshOAuth | Aangepaste OAuth-refresh |
| 24 | buildAuthDoctorHint | Richtlijnen voor auth-herstel |
| 25 | matchesContextOverflowError | Overflow-detectie in eigendom van de provider |
| 26 | classifyFailoverReason | Classificatie van rate-limit/overbelasting in eigendom van de provider |
| 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 thinking aan/uit |
| 32 | supportsXHighThinking | Compatibiliteit voor xhigh-reasoningondersteuning |
| 33 | resolveDefaultThinkingLevel | Compatibiliteit voor standaard /think-beleid |
| 34 | isModernModelRef | Live-/smoke-modelmatching |
| 35 | prepareRuntimeAuth | Tokenuitwisseling vóór inference |
| 36 | resolveUsageAuth | Aangepaste parsing van gebruikscredentials |
| 37 | fetchUsageSnapshot | Aangepast gebruiksendpoint |
| 38 | createEmbeddingProvider | Embeddingadapter in eigendom van de provider voor geheugen/zoeken |
| 39 | buildReplayPolicy | Aangepast transcript-replay-/Compaction-beleid |
| 40 | sanitizeReplayHistory | Provider-specifieke replayherschrijvingen na generieke opschoning |
| 41 | validateReplayTurns | Strikte replay-turn-validatie vóór de embedded runner |
| 42 | onModelSelected | Callback na selectie (bijv. telemetry) |
normalizeConfigcontroleert eerst de gematchte provider en daarna andere hook-capabele providerplugins totdat er één de config daadwerkelijk wijzigt. Als geen providerhook een ondersteunde Google-familie-configentry herschrijft, wordt de meegeleverde Google-confignormalizer nog steeds toegepast.resolveConfigApiKeygebruikt de providerhook wanneer die beschikbaar is. Het meegeleverdeamazon-bedrock-pad heeft hier ook een ingebouwde AWS env-marker-resolver, hoewel Bedrock-runtime-auth zelf nog steeds de standaardketen van de AWS SDK gebruikt.resolveSystemPromptContributionlaat een provider cachebewuste system-prompt-richtlijnen injecteren voor een modelfamilie. Geef hieraan de voorkeur bovenbefore_prompt_buildwanneer het gedrag bij één provider-/modelfamilie hoort en de stabiele/dynamische cachesplitsing moet behouden.
Extra capabilities toevoegen (optioneel)
Stap 5: Extra capabilities toevoegen
Een provider-Plugin kan spraak, realtime transcriptie, realtime spraak, mediabegrip, beeldgeneratie, videogeneratie, web-fetch en webzoekopdrachten naast tekstinferentie registreren. OpenClaw classificeert dit als een hybrid-capability-Plugin - het aanbevolen patroon voor bedrijfs-Plugins (een Plugin per leverancier). Zie Internals: Eigendom van capabilities.Registreer elke capability binnenregister(api) naast je bestaande
api.registerProvider(...)-aanroep. Kies alleen de tabbladen die je nodig hebt:- Speech (TTS)
- Realtime transcription
- Realtime voice
- Media understanding
- Image and video generation
- Web fetch and search
assertOkOrThrowProviderError(...) voor HTTP-fouten van providers, zodat
Plugins gedeelde begrensde reads van foutbody’s, JSON-foutparsing en
request-id-achtervoegsels gebruiken.Test
Stap 6: Test
src/provider.test.ts
Publiceren naar ClawHub
Provider-Plugins publiceren op dezelfde manier als elke andere externe code-Plugin:clawhub package publish gebruiken.
Bestandsstructuur
Referentie voor catalogusvolgorde
catalog.order bepaalt wanneer je catalogus samenvoegt ten opzichte van ingebouwde
providers:
| Volgorde | Wanneer | Usecase |
|---|---|---|
simple | Eerste pass | Gewone API-key-providers |
profile | Na simple | Providers afgeschermd via auth profiles |
paired | Na profile | Meerdere gerelateerde items synthetiseren |
late | Laatste pass | Bestaande providers overschrijven (wint bij botsing) |
Volgende stappen
- Channel-Plugins - 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