Jeśli wcześniej nie budowałeś żadnego Plugin OpenClaw, najpierw przeczytaj
Pierwsze kroki, aby poznać podstawową strukturę
pakietu i konfigurację manifestu.
Przewodnik
Package and manifest
Krok 1: Pakiet i manifest
setup.providers[].envVars, dzięki czemu OpenClaw może wykrywać
poświadczenia bez ładowania runtime Twojego Plugin. Dodaj providerAuthAliases,
gdy wariant providera powinien ponownie używać uwierzytelniania identyfikatora innego providera. modelSupport
jest opcjonalne i pozwala OpenClaw automatycznie wczytać Plugin providera ze skróconych
identyfikatorów modeli, takich jak acme-large, zanim będą istnieć haki runtime. Jeśli publikujesz
providera w ClawHub, te pola openclaw.compat i openclaw.build
są wymagane w package.json.Register the provider
Minimalny provider tekstowy wymaga Użyj
id, label, auth i catalog.
catalog jest należącym do providera hakiem runtime/konfiguracji; może wywoływać live
interfejsy 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 Plugin; OpenClaw odpowiada za wspólny kształt wiersza, etykiety
źródła i renderowanie pomocy.To działający provider. Użytkownicy mogą teraz uruchomić
openclaw onboard --acme-ai-api-key <key> i wybrać
acme-ai/acme-large jako swój model.Wykrywanie modeli live
Jeśli Twój provider udostępnia interfejs API w stylu/models, zachowaj specyficzny dla providera
punkt końcowy i projekcję wierszy w Plugin oraz użyj
openclaw/plugin-sdk/provider-catalog-live-runtime dla wspólnego cyklu życia pobierania.
Helper zapewnia chronione pobieranie HTTP, nagłówki uwierzytelniania providera,
ustrukturyzowane błędy HTTP, buforowanie TTL i statyczne zachowanie fallback bez
umieszczania polityki providera w rdzeniu OpenClaw.Użyj buildLiveModelProviderConfig, gdy live API informuje tylko, które
należące do providera statyczne wiersze katalogu są obecnie dostępne:index.ts
getCachedLiveProviderModelRows, gdy API providera zwraca bogatsze
metadane, a Plugin musi samodzielnie projektować wiersze do definicji modeli
OpenClaw:index.ts
run powinno pozostać bramkowane uwierzytelnianiem i zwracać null, gdy nie ma dostępnych
użytecznych poświadczeń. Zachowaj offline staticRun lub statyczny fallback, aby konfiguracja, dokumentacja,
testy i powierzchnie selektora nie zależały od dostępu do sieci live. Użyj TTL
odpowiedniego do świeżości listy modeli, unikaj odpytywania systemu plików w czasie żądania
i przekaż specyficzne dla providera readRows / readModelId tylko wtedy, gdy
odpowiedź upstream nie ma zgodnego z OpenAI kształtu { data: [{ id, object }] }.Jeśli upstream provider używa innych tokenów kontrolnych 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 końcowy tekst, zanim
OpenClaw sparsuje własne znaczniki kontrolne lub dostarczenie kanałem.W przypadku bundled providerów, które rejestrują tylko jednego providera tekstowego z uwierzytelnianiem
kluczem API oraz pojedynczym runtime opartym na katalogu, preferuj węższy
helper defineSingleProviderPluginEntry(...):buildProvider to ścieżka katalogu na żywo używana, gdy OpenClaw może rozpoznać 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 Twój przepływ uwierzytelniania musi także poprawiać models.providers.*, aliasy oraz
domyślny model agenta podczas wdrażania, użyj pomocników presetów z
openclaw/plugin-sdk/provider-onboard. Najwęższe pomocniki to
createDefaultModelPresetAppliers(...),
createDefaultModelsPresetAppliers(...) oraz
createModelCatalogPresetAppliers(...).Gdy natywny endpoint dostawcy obsługuje przesyłane strumieniowo bloki użycia na
standardowym transporcie openai-completions, preferuj współdzielone pomocniki katalogu w
openclaw/plugin-sdk/provider-catalog-shared zamiast wpisywać na stałe
sprawdzenia identyfikatorów dostawcy. supportsNativeStreamingUsageCompat(...) i
applyProviderNativeStreamingUsageCompat(...) wykrywają obsługę na podstawie
mapy możliwości endpointu, więc natywne endpointy w stylu Moonshot/DashScope nadal
zgłaszają obsługę, nawet gdy plugin używa niestandardowego identyfikatora dostawcy.Powyższe przykłady wykrywania na żywo obejmują API dostawców w stylu /models. Zachowaj
to wykrywanie wewnątrz catalog.run, bramkowane użytecznym uwierzytelnianiem, i pozostaw
staticRun bez sieci na potrzeby generowania katalogu offline.Add dynamic model resolution
Jeśli Twój dostawca akceptuje dowolne identyfikatory modeli (jak proxy lub router),
dodaj Jeśli rozpoznanie wymaga wywołania sieciowego, użyj
resolveDynamicModel:prepareDynamicModel do asynchronicznego
rozgrzania - resolveDynamicModel uruchomi się ponownie po jego zakończeniu.Add runtime hooks (as needed)
Większość dostawców potrzebuje tylko Obecnie dostępne rodziny replay:
Obecnie dostępne rodziny strumieni:
catalog + resolveDynamicModel. Dodawaj hooki
stopniowo, gdy dostawca ich wymaga.Współdzielone konstruktory pomocników obejmują teraz najczęstsze rodziny zgodności
replay/narzędzi, więc pluginy zwykle nie muszą ręcznie podłączać każdego hooka osobno:| Rodzina | Co podłącza | Wbudowane przykłady |
|---|---|---|
openai-compatible | Współdzielona polityka replay w stylu OpenAI dla transportów zgodnych z OpenAI, w tym oczyszczanie identyfikatorów wywołań narzędzi, poprawki kolejności zaczynającej od asystenta oraz ogólna walidacja tur Gemini tam, gdzie wymaga tego transport | moonshot, ollama, xai, zai |
anthropic-by-model | Polityka replay świadoma Claude wybierana według modelId, dzięki czemu transporty wiadomości Anthropic otrzymują oczyszczanie bloków myślenia specyficzne dla Claude tylko wtedy, gdy rozpoznany model faktycznie jest identyfikatorem Claude | amazon-bedrock, anthropic-vertex |
google-gemini | Natywna polityka replay Gemini oraz oczyszczanie replay podczas bootstrapu. Współdzielona rodzina utrzymuje tekstowe wyjście Gemini CLI przy tagowanym rozumowaniu; bezpośredni dostawca google nadpisuje resolveReasoningOutputMode na native, ponieważ myślenie Gemini API przychodzi jako natywne części myśli. | 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 replay Gemini ani przepisywania bootstrapu | openrouter, kilocode, opencode, opencode-go |
hybrid-anthropic-openai | Polityka hybrydowa dla dostawców, którzy mieszają powierzchnie modeli wiadomości Anthropic i zgodne z OpenAI w jednym pluginie; opcjonalne usuwanie bloków myślenia tylko dla Claude pozostaje ograniczone do strony Anthropic | minimax |
| Rodzina | Co podłącza | Wbudowane przykłady |
|---|---|---|
google-thinking | Normalizacja ładunku myślenia Gemini na współdzielonej ścieżce strumienia | google, google-gemini-cli |
kilocode-thinking | Wrapper rozumowania Kilo na współdzielonej ścieżce strumienia proxy, z kilo/auto i nieobsługiwanymi identyfikatorami rozumowania proxy pomijającymi wstrzyknięte myślenie | kilocode |
moonshot-thinking | Mapowanie binarnego natywnego ładunku myślenia Moonshot z konfiguracji + poziomu /think | moonshot |
minimax-fast-mode | Przepisanie modelu trybu szybkiego MiniMax na współdzielonej ścieżce strumienia | minimax, minimax-portal |
openai-responses-defaults | Współdzielone natywne wrappery 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 |
openrouter-thinking | Wrapper rozumowania OpenRouter dla tras proxy, z pominięciami nieobsługiwanych modeli/auto obsługiwanymi centralnie | openrouter |
tool-stream-default-on | Domyślnie włączony wrapper tool_stream dla dostawców takich jak Z.AI, którzy chcą strumieniowania narzędzi, chyba że zostanie jawnie wyłączone | zai |
SDK seams powering the family builders
SDK seams powering the family builders
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 replay (buildOpenAICompatibleReplayPolicy,buildAnthropicReplayPolicyForModel,buildGoogleGeminiReplayPolicy,buildHybridAnthropicOrOpenAIReplayPolicy). Eksportuje także pomocniki replay Gemini (sanitizeGoogleGeminiReplayHistory,resolveTaggedReasoningOutputMode) oraz pomocniki endpointów/modeli (resolveProviderEndpoint,normalizeProviderId,normalizeGooglePreviewModelId).openclaw/plugin-sdk/provider-stream-ProviderStreamFamily,buildProviderStreamFamilyHooks(...),composeProviderStreamWrappers(...), a także współdzielone wrappery OpenAI/Codex (createOpenAIAttributionHeadersWrapper,createOpenAIFastModeWrapper,createOpenAIServiceTierWrapper,createOpenAIResponsesContextManagementWrapper,createCodexNativeWebSearchWrapper), wrapper zgodny z OpenAI dla DeepSeek V4 (createDeepSeekV4OpenAICompatibleThinkingWrapper), czyszczenie prefill myślenia Anthropic Messages (createAnthropicThinkingPrefillPayloadWrapper), zgodność wywołań narzędzi w zwykłym tekście (createPlainTextToolCallCompatWrapper) oraz współdzielone wrappery proxy/dostawców (createOpenRouterWrapper,createToolStreamWrapper,createMinimaxFastModeWrapper).openclaw/plugin-sdk/provider-stream-shared- lekkie wrappery ładunku i zdarzeń dla gorących ścieżek dostawców, w tymcreateOpenAICompatibleCompletionsThinkingOffWrapper,createPayloadPatchStreamWrapper,createPlainTextToolCallCompatWrapper,normalizeOpenAICompatibleReasoningPayload(...)orazsetQwenChatTemplateThinking(...).openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily,buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai")oraz bazowe pomocniki schematów dostawców.
native, aby OpenClaw zużywał natywne części myśli bez dodawania
dyrektyw promptu <think> / <final>. Tekstowe backendy w stylu Gemini CLI,
które parsują końcową odpowiedź JSON/tekst, mogą zachować współdzielony
tagowany kontrakt google-gemini.Niektóre pomocniki strumienia celowo pozostają lokalne dla dostawcy. @openclaw/anthropic-provider utrzymuje wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier oraz niższego poziomu konstruktory wrapperów Anthropic we własnym publicznym szwie api.ts / contract-api.ts, ponieważ kodują obsługę beta Claude OAuth oraz bramkowanie context1m. Plugin xAI podobnie utrzymuje natywne kształtowanie xAI Responses we własnym wrapStreamFn (aliasy /fast, domyślne tool_stream, czyszczenie nieobsługiwanych narzędzi ścisłych, usuwanie ładunku rozumowania specyficzne dla xAI).Ten sam wzorzec korzenia pakietu obsługuje także @openclaw/openai-provider (konstruktory dostawców, pomocniki modeli domyślnych, konstruktory dostawcy realtime) oraz @openclaw/openrouter-provider (konstruktor dostawcy oraz pomocniki onboardingu/konfiguracji).- Token exchange
- Custom headers
- Native transport identity
- Użycie i rozliczenia
Dla dostawców, którzy potrzebują wymiany tokenu przed każdym wywołaniem inferencji:
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 przeznaczone wyłącznie do zgodności, których OpenClaw już nie
wywołuje, takie jak
Uwagi dotyczące mechanizmu awaryjnego runtime:
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 identyfikatorów modeli legacy/podglądowych przed wyszukiwaniem |
| 4 | normalizeTransport | Czyszczenie api / baseUrl rodziny dostawcy przed ogólnym składaniem modelu |
| 5 | normalizeConfig | Normalizacja konfiguracji models.providers.<id> |
| 6 | applyNativeStreamingUsageCompat | Przepisywanie zgodności natywnego użycia strumieniowania dla dostawców konfiguracji |
| 7 | resolveConfigApiKey | Rozwiązywanie uwierzytelniania markerów env należące do dostawcy |
| 8 | resolveSyntheticAuth | Syntetyczne uwierzytelnianie lokalne/self-hosted lub oparte na konfiguracji |
| 9 | shouldDeferSyntheticProfileAuth | Obniżenie syntetycznych symboli zastępczych zapisanych profili za uwierzytelnianie env/config |
| 10 | resolveDynamicModel | Akceptowanie dowolnych identyfikatorów modeli upstream |
| 11 | prepareDynamicModel | Asynchroniczne pobranie metadanych przed rozwiązaniem |
| 12 | normalizeResolvedModel | Przepisywanie transportu przed runnerem |
| 13 | normalizeToolSchemas | Czyszczenie schematów narzędzi należące do dostawcy przed rejestracją |
| 14 | inspectToolSchemas | Diagnostyka schematów narzędzi należąca do dostawcy |
| 15 | resolveReasoningOutputMode | Kontrakt wyniku rozumowania tagowanego kontra natywnego |
| 16 | prepareExtraParams | Domyślne parametry żądania |
| 17 | createStreamFn | W pełni niestandardowy transport StreamFn |
| 19 | wrapStreamFn | Niestandardowe opakowania nagłówków/treści na normalnej ścieżce strumienia |
| 20 | resolveTransportTurnState | Natywne nagłówki/metadane dla każdej tury |
| 21 | resolveWebSocketSessionPolicy | Natywne nagłówki sesji WS/okres wyciszenia |
| 22 | formatApiKey | Niestandardowy kształt tokenu runtime |
| 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 promptów |
| 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łączania/wyłączania binarnego myślenia |
| 32 | supportsXHighThinking | Zgodność obsługi rozumowania xhigh |
| 33 | resolveDefaultThinkingLevel | Zgodność domyślnej polityki /think |
| 34 | isModernModelRef | Dopasowywanie modelu live/smoke |
| 35 | prepareRuntimeAuth | Wymiana tokenu przed inferencją |
| 36 | resolveUsageAuth | Niestandardowe parsowanie poświadczeń użycia |
| 37 | fetchUsageSnapshot | Niestandardowy endpoint użycia |
| 38 | createEmbeddingProvider | Adapter embeddingów należący do dostawcy dla pamięci/wyszukiwania |
| 39 | buildReplayPolicy | Niestandardowa polityka odtwarzania/Compaction transkryptu |
| 40 | sanitizeReplayHistory | Przepisywanie odtwarzania specyficzne dla dostawcy po ogólnym czyszczeniu |
| 41 | validateReplayTurns | Ścisła walidacja tur odtwarzania przed osadzonym runnerem |
| 42 | onModelSelected | Callback po wyborze (np. telemetria) |
normalizeConfignajpierw sprawdza 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 z rodziny Google, wbudowany normalizator konfiguracji Google nadal zostanie zastosowany.resolveConfigApiKeyużywa hooka dostawcy, gdy jest udostępniony. Amazon Bedrock utrzymuje rozwiązywanie markerów env AWS w swoim pluginie dostawcy; samo uwierzytelnianie runtime nadal używa domyślnego łańcucha AWS SDK, gdy jest skonfigurowane zauth: "aws-sdk".resolveThinkingProfile(ctx)otrzymuje wybranegoprovider,modelId, opcjonalną scaloną wskazówkę katalogureasoningi opcjonalne scalone faktycompatmodelu. Używajcompattylko do wyboru UI/profilu myślenia dostawcy.resolveSystemPromptContributionpozwala dostawcy wstrzyknąć wskazówki promptu systemowego świadome pamięci podręcznej dla rodziny modeli. Preferuj go zamiastbefore_prompt_build, gdy zachowanie należy do jednej rodziny dostawcy/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ć embeddingi, mowę, transkrypcję w czasie rzeczywistym, głos w czasie rzeczywistym, rozumienie mediów, generowanie obrazów, generowanie wideo, pobieranie z sieci i wyszukiwanie w sieci obok inferencji tekstu. OpenClaw klasyfikuje to jako plugin hybrid-capability - zalecany wzorzec dla pluginów firmowych (jeden plugin na dostawcę). Zobacz Internals: Capability Ownership.Zarejestruj każdą możliwość wregister(api) obok istniejącego wywołania
api.registerProvider(...). Wybierz tylko potrzebne karty:- Mowa (TTS)
- Transkrypcja w czasie rzeczywistym
- Głos w czasie rzeczywistym
- Media understanding
- Embeddings
- Image and video generation
- Web fetch and search
assertOkOrThrowProviderError(...) dla błędów HTTP dostawcy, aby
pluginy współdzieliły limitowane odczyty treści błędów, parsowanie błędów
JSON i 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 Plugin kodu:clawhub package publish.
Struktura plików
Odniesienie do kolejności katalogu
catalog.order kontroluje, kiedy 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 | Syntezowanie wielu powiązanych wpisów |
late | Ostatnie przejście | Nadpisanie 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) - Omówienie SDK - pełna referencja importów podścieżek
- Wewnętrzna architektura Plugin - szczegóły hooków i przykłady wbudowane