Ten przewodnik prowadzi przez tworzenie pluginu dostawcy, który dodaje dostawcę modelu (LLM) do OpenClaw. Na końcu będziesz mieć dostawcę z katalogiem modeli, uwierzytelnianiem kluczem API oraz dynamicznym rozwiązywaniem modeli.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Jeśli nie tworzono wcześniej żadnego pluginu OpenClaw, najpierw przeczytaj
Pierwsze kroki, aby poznać podstawową strukturę
pakietu i konfigurację manifestu.
Przewodnik
Pakiet i manifest
Krok 1: Pakiet i manifest
providerAuthEnvVars, dzięki czemu OpenClaw może wykrywać
poświadczenia bez ładowania runtime pluginu. Dodaj providerAuthAliases,
gdy wariant dostawcy powinien ponownie używać uwierzytelniania innego identyfikatora dostawcy. modelSupport
jest opcjonalne i pozwala OpenClaw automatycznie ładować plugin dostawcy ze skróconych
identyfikatorów modeli, takich jak acme-large, zanim będą dostępne haki runtime. Jeśli publikujesz
dostawcę w ClawHub, pola openclaw.compat i openclaw.build
są wymagane w package.json.Zarejestruj dostawcę
Minimalny dostawca tekstu potrzebuje
id, label, auth i catalog.
catalog to hak runtime/konfiguracji należący do dostawcy; może wywoływać działające
API dostawcy i zwraca wpisy models.providers.index.ts
registerModelCatalogProvider to nowsza powierzchnia katalogu płaszczyzny sterowania
dla interfejsu list/pomocy/selektora. Używaj jej dla wierszy tekstu, generowania obrazów,
generowania wideo i generowania muzyki. Zachowaj wywołania punktów końcowych dostawcy i
mapowanie odpowiedzi w pluginie; OpenClaw odpowiada za wspólny kształt wiersza, etykiety
źródeł i renderowanie pomocy.To jest działający dostawca. Użytkownicy mogą teraz uruchomić
openclaw onboard --acme-ai-api-key <key> i wybrać
acme-ai/acme-large jako swój model.Jeśli dostawca upstream używa innych tokenów sterujących niż OpenClaw, dodaj
małą dwukierunkową transformację tekstu zamiast zastępować ścieżkę strumienia:input przepisuje końcowy prompt systemowy i treść wiadomości tekstowej przed
transportem. output przepisuje delty tekstu asystenta i tekst końcowy, zanim
OpenClaw przeanalizuje własne znaczniki sterujące lub dostarczanie do kanału.Dla wbudowanych dostawców, którzy rejestrują tylko jednego dostawcę tekstu z uwierzytelnianiem
kluczem API oraz jednym runtime opartym na katalogu, preferuj węższy
helper defineSingleProviderPluginEntry(...):buildProvider to ścieżka katalogu na żywo używana, gdy OpenClaw może rozwiązać rzeczywiste
uwierzytelnianie dostawcy. Może wykonywać wykrywanie specyficzne dla dostawcy. Używaj
buildStaticProvider tylko dla wierszy offline, które można bezpiecznie pokazać przed skonfigurowaniem uwierzytelniania;
nie może wymagać poświadczeń ani wykonywać żądań sieciowych.
Widok models list --all w OpenClaw obecnie wykonuje katalogi statyczne
tylko dla wbudowanych pluginów dostawców, z pustą konfiguracją, pustym środowiskiem i bez
ścieżek agenta/przestrzeni roboczej.Jeśli przepływ uwierzytelniania musi również poprawiać models.providers.*, aliasy i
domyślny model agenta podczas onboardingu, użyj helperów presetów z
openclaw/plugin-sdk/provider-onboard. Najwęższe helpery to
createDefaultModelPresetAppliers(...),
createDefaultModelsPresetAppliers(...) i
createModelCatalogPresetAppliers(...).Gdy natywny punkt końcowy dostawcy obsługuje strumieniowane bloki użycia w
standardowym transporcie openai-completions, preferuj współdzielone helpery katalogu w
openclaw/plugin-sdk/provider-catalog-shared zamiast kodować na stałe
kontrole identyfikatorów dostawców. supportsNativeStreamingUsageCompat(...) i
applyProviderNativeStreamingUsageCompat(...) wykrywają obsługę z
mapy możliwości punktu końcowego, dzięki czemu natywne punkty końcowe w stylu Moonshot/DashScope nadal
włączają się nawet wtedy, gdy plugin używa niestandardowego identyfikatora dostawcy.Dodaj dynamiczne rozwiązywanie modeli
Jeśli dostawca akceptuje dowolne identyfikatory modeli (jak proxy lub router),
dodaj Jeśli rozwiązywanie wymaga wywołania sieciowego, użyj
resolveDynamicModel:prepareDynamicModel do asynchronicznego
rozgrzewania - resolveDynamicModel uruchomi się ponownie po jego zakończeniu.Dodaj haki runtime (w razie potrzeby)
Większość dostawców potrzebuje tylko Dostępne obecnie rodziny replay:
Dostępne obecnie rodziny strumieni:
catalog + resolveDynamicModel. Dodawaj haki
stopniowo, zgodnie z wymaganiami dostawcy.Współdzielone kreatory helperów obejmują teraz najczęstsze rodziny zgodności replay/narzędzi,
więc pluginy zwykle nie muszą ręcznie łączyć każdego haka osobno:| Rodzina | Co podłącza | Dołączone przykłady |
|---|---|---|
openai-compatible | Wspólna polityka odtwarzania w stylu OpenAI dla transportów zgodnych z OpenAI, w tym oczyszczanie identyfikatorów wywołań narzędzi, poprawki kolejności z asystentem jako pierwszym oraz ogólna walidacja tur Gemini tam, gdzie transport jej wymaga | moonshot, ollama, xai, zai |
anthropic-by-model | Polityka odtwarzania świadoma Claude wybierana przez modelId, dzięki czemu transporty komunikatów Anthropic otrzymują czyszczenie bloków myślenia specyficzne dla Claude tylko wtedy, gdy rozwiązany model jest rzeczywiście identyfikatorem Claude | amazon-bedrock, anthropic-vertex |
google-gemini | Natywna polityka odtwarzania Gemini oraz oczyszczanie odtwarzania startowego i tryb oznaczonych wyników rozumowania | google, google-gemini-cli |
passthrough-gemini | Oczyszczanie sygnatur myśli Gemini dla modeli Gemini uruchamianych przez transporty proxy zgodne z OpenAI; nie włącza natywnej walidacji odtwarzania Gemini ani przepisań startowych | openrouter, kilocode, opencode, opencode-go |
hybrid-anthropic-openai | Polityka hybrydowa dla dostawców, którzy łączą powierzchnie modeli komunikatów Anthropic i zgodne z OpenAI w jednym pluginie; opcjonalne porzucanie bloków myślenia wyłącznie dla Claude pozostaje ograniczone do strony Anthropic | minimax |
| Rodzina | Co podłącza | Dołączone przykłady |
|---|---|---|
google-thinking | Normalizacja ładunku myślenia Gemini we wspólnej ścieżce strumienia | google, google-gemini-cli |
kilocode-thinking | Opakowanie rozumowania Kilo we wspólnej ścieżce strumienia proxy, z pomijaniem wstrzykniętego myślenia dla kilo/auto i nieobsługiwanych identyfikatorów rozumowania proxy | kilocode |
moonshot-thinking | Mapowanie binarnego natywnego ładunku myślenia Moonshot z konfiguracji + poziomu /think | moonshot |
minimax-fast-mode | Przepisanie modelu trybu szybkiego MiniMax we wspólnej ścieżce strumienia | minimax, minimax-portal |
openai-responses-defaults | Wspólne natywne opakowania OpenAI/Codex Responses: nagłówki atrybucji, /fast/serviceTier, szczegółowość tekstu, natywne wyszukiwanie internetowe Codex, kształtowanie ładunku zgodności rozumowania oraz zarządzanie kontekstem Responses | openai, openai-codex |
openrouter-thinking | Opakowanie rozumowania OpenRouter dla tras proxy, z centralną obsługą pominięć nieobsługiwanego modelu/auto | openrouter |
tool-stream-default-on | Domyślnie włączone opakowanie tool_stream dla dostawców takich jak Z.AI, którzy chcą strumieniowania narzędzi, chyba że zostanie jawnie wyłączone | zai |
Seamy SDK zasilające konstruktory rodzin
Seamy SDK zasilające konstruktory rodzin
Każdy konstruktor rodziny składa się z publicznych pomocników niższego poziomu eksportowanych z tego samego pakietu, po które możesz sięgnąć, gdy dostawca musi odejść od wspólnego wzorca:
openclaw/plugin-sdk/provider-model-shared-ProviderReplayFamily,buildProviderReplayFamilyHooks(...)oraz surowe konstruktory odtwarzania (buildOpenAICompatibleReplayPolicy,buildAnthropicReplayPolicyForModel,buildGoogleGeminiReplayPolicy,buildHybridAnthropicOrOpenAIReplayPolicy). Eksportuje także pomocniki odtwarzania Gemini (sanitizeGoogleGeminiReplayHistory,resolveTaggedReasoningOutputMode) oraz pomocniki punktów końcowych/modeli (resolveProviderEndpoint,normalizeProviderId,normalizeGooglePreviewModelId).openclaw/plugin-sdk/provider-stream-ProviderStreamFamily,buildProviderStreamFamilyHooks(...),composeProviderStreamWrappers(...), a także wspólne opakowania OpenAI/Codex (createOpenAIAttributionHeadersWrapper,createOpenAIFastModeWrapper,createOpenAIServiceTierWrapper,createOpenAIResponsesContextManagementWrapper,createCodexNativeWebSearchWrapper), opakowanie DeepSeek V4 zgodne z OpenAI (createDeepSeekV4OpenAICompatibleThinkingWrapper), czyszczenie wypełnienia myślenia Anthropic Messages (createAnthropicThinkingPrefillPayloadWrapper) oraz wspólne opakowania proxy/dostawcy (createOpenRouterWrapper,createToolStreamWrapper,createMinimaxFastModeWrapper).openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily,buildProviderToolCompatFamilyHooks("gemini")oraz bazowe pomocniki schematów Gemini (normalizeGeminiToolSchemas,inspectGeminiToolSchemas).
@openclaw/anthropic-provider trzyma wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier oraz konstruktory opakowań Anthropic niższego poziomu we własnym publicznym seamie api.ts / contract-api.ts, ponieważ kodują obsługę wersji beta OAuth Claude i bramkowanie context1m. Plugin xAI podobnie trzyma natywne kształtowanie xAI Responses we własnym wrapStreamFn (aliasy /fast, domyślny tool_stream, czyszczenie nieobsługiwanych narzędzi ścisłych, usuwanie ładunku rozumowania specyficzne dla xAI).Ten sam wzorzec katalogu głównego pakietu wspiera także @openclaw/openai-provider (konstruktory dostawcy, pomocniki modelu domyślnego, konstruktory dostawcy czasu rzeczywistego) oraz @openclaw/openrouter-provider (konstruktor dostawcy oraz pomocniki wdrażania/konfiguracji).- Wymiana tokenu
- Niestandardowe nagłówki
- Natywna tożsamość transportu
- Użycie i rozliczenia
Dla dostawców, którzy wymagają wymiany tokenu przed każdym wywołaniem wnioskowania:
Wszystkie dostępne hooki dostawcy
Wszystkie dostępne hooki dostawcy
OpenClaw wywołuje hooki w tej kolejności. Większość dostawców używa tylko 2-3:
Pola dostawcy wyłącznie dla zgodności, których OpenClaw już nie wywołuje, takie jak
Uwagi dotyczące rezerwowych zachowań uruchomieniowych:
ProviderPlugin.capabilities i suppressBuiltInModel, nie są tutaj wymienione.| # | Hook | Kiedy używać |
|---|---|---|
| 1 | catalog | Katalog modeli lub domyślne wartości bazowego URL |
| 2 | applyConfigDefaults | Globalne wartości domyślne należące do dostawcy podczas materializacji konfiguracji |
| 3 | normalizeModelId | Czyszczenie aliasów starszych/podglądowych identyfikatorów modeli przed wyszukiwaniem |
| 4 | normalizeTransport | Czyszczenie api / baseUrl rodziny dostawcy przed ogólnym składaniem modelu |
| 5 | normalizeConfig | Normalizacja konfiguracji models.providers.<id> |
| 6 | applyNativeStreamingUsageCompat | Przepisania zgodności natywnego użycia strumieniowego dla dostawców konfiguracyjnych |
| 7 | resolveConfigApiKey | Rozwiązywanie uwierzytelniania znaczników env należące do dostawcy |
| 8 | resolveSyntheticAuth | Lokalne/samohostowane lub oparte na konfiguracji syntetyczne uwierzytelnianie |
| 9 | shouldDeferSyntheticProfileAuth | Obniżanie syntetycznych symboli zastępczych zapisanego profilu za uwierzytelnianiem env/konfiguracyjnym |
| 10 | resolveDynamicModel | Akceptowanie dowolnych identyfikatorów modeli upstream |
| 11 | prepareDynamicModel | Asynchroniczne pobieranie metadanych przed rozwiązaniem |
| 12 | normalizeResolvedModel | Przepisania transportu przed runnerem |
| 13 | contributeResolvedModelCompat | Flagi zgodności dla modeli dostawców za innym zgodnym transportem |
| 14 | normalizeToolSchemas | Czyszczenie schematów narzędzi należące do dostawcy przed rejestracją |
| 15 | inspectToolSchemas | Diagnostyka schematów narzędzi należąca do dostawcy |
| 16 | resolveReasoningOutputMode | Kontrakt oznaczonego kontra natywnego wyniku rozumowania |
| 17 | prepareExtraParams | Domyślne parametry żądania |
| 18 | createStreamFn | W pełni niestandardowy transport StreamFn |
| 19 | wrapStreamFn | Niestandardowe opakowania nagłówków/treści w normalnej ścieżce strumienia |
| 20 | resolveTransportTurnState | Natywne nagłówki/metadane per tura |
| 21 | resolveWebSocketSessionPolicy | Natywne nagłówki sesji WS/czas odnowienia |
| 22 | formatApiKey | Niestandardowy kształt tokenu uruchomieniowego |
| 23 | refreshOAuth | Niestandardowe odświeżanie OAuth |
| 24 | buildAuthDoctorHint | Wskazówki naprawy uwierzytelniania |
| 25 | matchesContextOverflowError | Wykrywanie przepełnienia należące do dostawcy |
| 26 | classifyFailoverReason | Klasyfikacja limitu szybkości/przeciążenia należąca do dostawcy |
| 27 | isCacheTtlEligible | Bramkowanie TTL pamięci podręcznej promptu |
| 28 | buildMissingAuthMessage | Niestandardowa wskazówka brakującego uwierzytelniania |
| 29 | augmentModelCatalog | Syntetyczne wiersze zgodności w przód |
| 30 | resolveThinkingProfile | Zestaw opcji /think specyficzny dla modelu |
| 31 | isBinaryThinking | Zgodność włączonego/wyłączonego myślenia binarnego |
| 32 | supportsXHighThinking | Zgodność obsługi rozumowania xhigh |
| 33 | resolveDefaultThinkingLevel | Zgodność domyślnej polityki /think |
| 34 | isModernModelRef | Dopasowanie modelu live/smoke |
| 35 | prepareRuntimeAuth | Wymiana tokenu przed wnioskowaniem |
| 36 | resolveUsageAuth | Niestandardowe parsowanie poświadczeń użycia |
| 37 | fetchUsageSnapshot | Niestandardowy punkt końcowy użycia |
| 38 | createEmbeddingProvider | Adapter embeddingów należący do dostawcy dla pamięci/wyszukiwania |
| 39 | buildReplayPolicy | Niestandardowa polityka odtwarzania/Compaction transkryptu |
| 40 | sanitizeReplayHistory | Przepisania odtwarzania specyficzne dla dostawcy po ogólnym czyszczeniu |
| 41 | validateReplayTurns | Ścisła walidacja tur odtwarzania przed osadzonym runnerem |
| 42 | onModelSelected | Wywołanie zwrotne po wyborze (np. telemetria) |
normalizeConfigsprawdza najpierw dopasowanego dostawcę, a następnie inne pluginy dostawców obsługujące hooki, aż któryś faktycznie zmieni konfigurację. Jeśli żaden hook dostawcy nie przepisze obsługiwanego wpisu konfiguracji rodziny Google, nadal stosowany jest dołączony normalizator konfiguracji Google.resolveConfigApiKeyużywa hooka dostawcy, gdy jest udostępniony. Dołączona ścieżkaamazon-bedrockma tutaj także wbudowany resolver znaczników env AWS, mimo że samo uwierzytelnianie uruchomieniowe Bedrock nadal używa domyślnego łańcucha AWS SDK.resolveSystemPromptContributionpozwala dostawcy wstrzyknąć wskazówki promptu systemowego świadome pamięci podręcznej dla rodziny modeli. Preferuj to zamiastbefore_prompt_build, gdy zachowanie należy do jednego dostawcy/rodziny modeli i powinno zachować stabilny/dynamiczny podział pamięci podręcznej.
Dodaj dodatkowe możliwości (opcjonalnie)
Krok 5: Dodaj dodatkowe możliwości
Plugin dostawcy może rejestrować mowę, transkrypcję w czasie rzeczywistym, głos w czasie rzeczywistym, rozumienie mediów, generowanie obrazów, generowanie wideo, pobieranie z sieci oraz wyszukiwanie w sieci obok wnioskowania tekstowego. OpenClaw klasyfikuje to jako Plugin o możliwościach hybrydowych - zalecany wzorzec dla firmowych Pluginów (jeden Plugin na dostawcę). Zobacz Wnętrze: własność możliwości.Zarejestruj każdą możliwość wewnątrzregister(api) obok istniejącego wywołania
api.registerProvider(...). Wybierz tylko potrzebne karty:- Mowa (TTS)
- Transkrypcja w czasie rzeczywistym
- Głos w czasie rzeczywistym
- Rozumienie mediów
- Generowanie obrazów i wideo
- Pobieranie i wyszukiwanie w sieci
assertOkOrThrowProviderError(...) w przypadku błędów HTTP dostawcy, aby
Pluginy współdzieliły ograniczone odczyty treści błędów, parsowanie błędów JSON oraz
sufiksy identyfikatorów żądań.Test
Krok 6: Test
src/provider.test.ts
Publikowanie w ClawHub
Pluginy dostawców publikuje się tak samo jak każdy inny zewnętrzny kodowy Plugin:clawhub package publish.
Struktura plików
Odniesienie do kolejności katalogu
catalog.order kontroluje, kiedy Twój katalog jest scalany względem wbudowanych
dostawców:
| Kolejność | Kiedy | Przypadek użycia |
|---|---|---|
simple | Pierwsze przejście | Zwykli dostawcy z kluczem API |
profile | Po simple | Dostawcy zależni od profili uwierzytelniania |
paired | Po profile | Synteza wielu powiązanych wpisów |
late | Ostatnie przejście | Nadpisywanie istniejących dostawców (wygrywa przy kolizji) |
Następne kroki
- Pluginy kanałów - jeśli Twój Plugin zapewnia także kanał
- Środowisko uruchomieniowe SDK - pomocniki
api.runtime(TTS, wyszukiwanie, podagent) - Przegląd SDK - pełne odniesienie importów podścieżek
- Wnętrze Pluginów - szczegóły hooków i dołączone przykłady