Plugins
Przegląd Plugin SDK
SDK pluginów jest typowanym kontraktem między pluginami a rdzeniem. Ta strona jest odniesieniem dla tego, co importować i tego, co można zarejestrować.
Konwencja importu
Zawsze importuj z konkretnej podścieżki:
Każda podścieżka jest małym, samodzielnym modułem. Dzięki temu uruchamianie jest szybkie i
zapobiega problemom z zależnościami cyklicznymi. W przypadku pomocników wejścia/budowania
specyficznych dla kanału preferuj openclaw/plugin-sdk/channel-core; zachowaj
openclaw/plugin-sdk/core dla szerszej powierzchni zbiorczej i współdzielonych pomocników, takich jak
buildChannelConfigSchema.
W przypadku konfiguracji kanału opublikuj należący do kanału JSON Schema przez
openclaw.plugin.json#channelConfigs. Podścieżka plugin-sdk/channel-config-schema
służy do współdzielonych prymitywów schematów i ogólnego konstruktora. Wbudowane pluginy OpenClaw
używają plugin-sdk/bundled-channel-config-schema dla zachowanych schematów
wbudowanych kanałów. Przestarzałe eksporty zgodności pozostają w
plugin-sdk/channel-config-schema-legacy; żadna z podścieżek schematów wbudowanych nie jest
wzorcem dla nowych pluginów.
Odniesienie podścieżek
SDK pluginów jest udostępniane jako zestaw wąskich podścieżek pogrupowanych według obszaru (wejście pluginu, kanał, dostawca, uwierzytelnianie, runtime, capability, pamięć oraz zarezerwowane pomocniki wbudowanych pluginów). Pełny katalog, pogrupowany i podlinkowany, znajdziesz w Podścieżki SDK pluginów.
Wygenerowana lista ponad 200 podścieżek znajduje się w scripts/lib/plugin-sdk-entrypoints.json.
API rejestracji
Callback register(api) otrzymuje obiekt OpenClawPluginApi z tymi
metodami:
Rejestracja capability
| Metoda | Co rejestruje |
|---|---|
api.registerProvider(...) |
Wnioskowanie tekstowe (LLM) |
api.registerAgentHarness(...) |
Eksperymentalny niskopoziomowy executor agentów |
api.registerCliBackend(...) |
Lokalny backend wnioskowania CLI |
api.registerChannel(...) |
Kanał wiadomości |
api.registerSpeechProvider(...) |
Synteza tekst-na-mowę / STT |
api.registerRealtimeTranscriptionProvider(...) |
Strumieniowa transkrypcja w czasie rzeczywistym |
api.registerRealtimeVoiceProvider(...) |
Dupleksowe sesje głosowe w czasie rzeczywistym |
api.registerMediaUnderstandingProvider(...) |
Analiza obrazów/audio/wideo |
api.registerImageGenerationProvider(...) |
Generowanie obrazów |
api.registerMusicGenerationProvider(...) |
Generowanie muzyki |
api.registerVideoGenerationProvider(...) |
Generowanie wideo |
api.registerWebFetchProvider(...) |
Dostawca pobierania / scrape’owania WWW |
api.registerWebSearchProvider(...) |
Wyszukiwanie w sieci |
Narzędzia i polecenia
| Metoda | Co rejestruje |
|---|---|
api.registerTool(tool, opts?) |
Narzędzie agenta (wymagane lub { optional: true }) |
api.registerCommand(def) |
Niestandardowe polecenie (omija LLM) |
Polecenia pluginów mogą ustawić agentPromptGuidance, gdy agent potrzebuje krótkiej,
należącej do polecenia wskazówki routingu. Zachowaj ten tekst o samym poleceniu; nie dodawaj
polityki specyficznej dla dostawcy lub pluginu do konstruktorów promptów rdzenia.
Infrastruktura
| Metoda | Co rejestruje |
|---|---|
api.registerHook(events, handler, opts?) |
Hook zdarzenia |
api.registerHttpRoute(params) |
Endpoint HTTP Gateway |
api.registerGatewayMethod(name, handler) |
Metoda RPC Gateway |
api.registerGatewayDiscoveryService(service) |
Lokalny anons usługi wykrywania Gateway |
api.registerCli(registrar, opts?) |
Podpolecenie CLI |
api.registerService(service) |
Usługa w tle |
api.registerInteractiveHandler(registration) |
Handler interaktywny |
api.registerAgentToolResultMiddleware(...) |
Middleware runtime dla wyników narzędzi |
api.registerMemoryPromptSupplement(builder) |
Addytywna sekcja promptu sąsiadująca z pamięcią |
api.registerMemoryCorpusSupplement(adapter) |
Addytywny korpus wyszukiwania/odczytu pamięci |
Hooki hosta dla pluginów workflow
Hooki hosta są seamami SDK dla pluginów, które muszą uczestniczyć w cyklu życia hosta, a nie tylko dodawać dostawcę, kanał lub narzędzie. Są to ogólne kontrakty; Plan Mode może ich używać, ale mogą też workflow zatwierdzania, bramki polityk workspace, monitory w tle, kreatory konfiguracji i towarzyszące pluginy UI.
| Metoda | Kontrakt, który posiada |
|---|---|
api.registerSessionExtension(...) |
Należący do pluginu, zgodny z JSON stan sesji projektowany przez sesje Gateway |
api.enqueueNextTurnInjection(...) |
Trwały kontekst dokładnie raz wstrzyknięty do następnej tury agenta dla jednej sesji |
api.registerTrustedToolPolicy(...) |
Polityka narzędzi pre-pluginu dla wbudowanych/zaufanych narzędzi, która może blokować lub przepisywać parametry narzędzia |
api.registerToolMetadata(...) |
Metadane wyświetlania katalogu narzędzi bez zmiany implementacji narzędzia |
api.registerCommand(...) |
Zakresowane polecenia pluginów; wyniki poleceń mogą ustawiać continueAgent: true; natywne polecenia Discord obsługują descriptionLocalizations |
api.registerControlUiDescriptor(...) |
Deskryptory wkładu Control UI dla powierzchni sesji, narzędzia, uruchomienia lub ustawień |
api.registerRuntimeLifecycle(...) |
Callbacki czyszczenia dla należących do pluginu zasobów runtime na ścieżkach resetowania/usuwania/ponownego ładowania |
api.registerAgentEventSubscription(...) |
Oczyszczone subskrypcje zdarzeń dla stanu workflow i monitorów |
api.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
Tymczasowy stan pluginu na uruchomienie, czyszczony przy terminalnym cyklu życia uruchomienia |
api.registerSessionSchedulerJob(...) |
Należące do pluginu rekordy zadań harmonogramu sesji z deterministycznym czyszczeniem |
Kontrakty celowo rozdzielają uprawnienia:
- Zewnętrzne pluginy mogą posiadać rozszerzenia sesji, deskryptory UI, polecenia, metadane narzędzi, wstrzyknięcia następnej tury i zwykłe hooki.
- Zaufane polityki narzędzi działają przed zwykłymi hookami
before_tool_calli są wyłącznie wbudowane, ponieważ uczestniczą w polityce bezpieczeństwa hosta. - Zarezerwowane posiadanie poleceń jest wyłącznie wbudowane. Zewnętrzne pluginy powinny używać własnych nazw poleceń lub aliasów.
allowPromptInjection=falsewyłącza hooki modyfikujące prompt, w tymagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, pola promptu ze starszegobefore_agent_startorazenqueueNextTurnInjection.
Przykłady konsumentów niebędących Plan:
| Archetyp pluginu | Używane hooki |
|---|---|
| Workflow zatwierdzania | Rozszerzenie sesji, kontynuacja polecenia, wstrzyknięcie następnej tury, deskryptor UI |
| Bramki polityki budżetu/workspace | Zaufana polityka narzędzi, metadane narzędzi, projekcja sesji |
| Monitor cyklu życia w tle | Czyszczenie cyklu życia runtime, subskrypcja zdarzeń agenta, posiadanie/czyszczenie harmonogramu sesji, wkład promptu heartbeat, deskryptor UI |
| Kreator konfiguracji lub onboardingu | Rozszerzenie sesji, zakresowane polecenia, deskryptor Control UI |
Kiedy używać middleware wyników narzędzi
Wbudowane pluginy mogą używać api.registerAgentToolResultMiddleware(...), gdy
muszą przepisać wynik narzędzia po wykonaniu i zanim runtime
poda ten wynik z powrotem do modelu. To zaufany, neutralny względem runtime
seam dla asynchronicznych reduktorów wyjścia, takich jak tokenjuice.
Wbudowane pluginy muszą deklarować contracts.agentToolResultMiddleware dla każdego
docelowego runtime, na przykład ["pi", "codex"]. Zewnętrzne pluginy
nie mogą rejestrować tego middleware; zachowaj zwykłe hooki pluginów OpenClaw dla pracy,
która nie wymaga czasowania wyniku narzędzia przed modelem. Stara, osadzona ścieżka
rejestracji fabryki rozszerzeń tylko dla Pi została usunięta.
Rejestracja wykrywania Gateway
api.registerGatewayDiscoveryService(...) pozwala Pluginowi ogłaszać aktywny
Gateway w lokalnym transporcie wykrywania, takim jak mDNS/Bonjour. OpenClaw wywołuje
usługę podczas uruchamiania Gateway, gdy lokalne wykrywanie jest włączone, przekazuje
bieżące porty Gateway oraz nietajne dane podpowiedzi TXT i wywołuje zwrócony
handler stop podczas zamykania Gateway.
api.registerGatewayDiscoveryService({
id: "my-discovery",
async advertise(ctx) {
const handle = await startMyAdvertiser({
gatewayPort: ctx.gatewayPort,
tls: ctx.gatewayTlsEnabled,
displayName: ctx.machineDisplayName,
});
return { stop: () => handle.stop() };
},
});
Pluginy wykrywania Gateway nie mogą traktować ogłaszanych wartości TXT jako sekretów ani uwierzytelniania. Wykrywanie jest podpowiedzią routingu; uwierzytelnianie Gateway i przypinanie TLS nadal odpowiadają za zaufanie.
Metadane rejestracji CLI
api.registerCli(registrar, opts?) akceptuje dwa rodzaje metadanych najwyższego poziomu:
commands: jawne korzenie poleceń należące do rejestratoradescriptors: deskryptory poleceń używane w czasie parsowania na potrzeby pomocy głównego CLI, routingu i leniwej rejestracji CLI Pluginu
Jeśli chcesz, aby polecenie Pluginu pozostało leniwie ładowane w normalnej ścieżce głównego CLI,
podaj descriptors, które obejmują każdy korzeń polecenia najwyższego poziomu udostępniany przez tego
rejestratora.
api.registerCli(
async ({ program }) => {
const { registerMatrixCli } = await import("./src/cli.js");
registerMatrixCli({ program });
},
{
descriptors: [
{
name: "matrix",
description: "Manage Matrix accounts, verification, devices, and profile state",
hasSubcommands: true,
},
],
},
);
Używaj samego commands tylko wtedy, gdy nie potrzebujesz leniwej rejestracji głównego CLI.
Ta gorliwa ścieżka zgodności pozostaje obsługiwana, ale nie instaluje
symboli zastępczych opartych na deskryptorach do leniwego ładowania w czasie parsowania.
Rejestracja backendu CLI
api.registerCliBackend(...) pozwala Pluginowi posiadać domyślną konfigurację lokalnego
backendu AI CLI, takiego jak codex-cli.
- Backend
idstaje się prefiksem dostawcy w referencjach modeli, takich jakcodex-cli/gpt-5. - Backend
configużywa tego samego kształtu coagents.defaults.cliBackends.<id>. - Konfiguracja użytkownika nadal ma pierwszeństwo. OpenClaw scala
agents.defaults.cliBackends.<id>nad domyślną konfiguracją Pluginu przed uruchomieniem CLI. - Użyj
normalizeConfig, gdy backend wymaga przepisania zgodności po scaleniu (na przykład normalizacji starych kształtów flag). - Użyj
resolveExecutionArgsdo przepisywania argv w zakresie żądania, które należy do dialektu CLI, takiego jak mapowanie poziomów myślenia OpenClaw na natywną flagę wysiłku.
Sloty wyłączne
| Metoda | Co rejestruje |
|---|---|
api.registerContextEngine(id, factory) |
Silnik kontekstu (jeden aktywny naraz). Callback assemble() otrzymuje availableTools i citationsMode, aby silnik mógł dostosować dodatki do promptu. |
api.registerMemoryCapability(capability) |
Ujednolicona zdolność pamięci |
api.registerMemoryPromptSection(builder) |
Konstruktor sekcji promptu pamięci |
api.registerMemoryFlushPlan(resolver) |
Resolver planu opróżniania pamięci |
api.registerMemoryRuntime(runtime) |
Adapter runtime pamięci |
Adaptery embeddingów pamięci
| Metoda | Co rejestruje |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
Adapter embeddingów pamięci dla aktywnego Pluginu |
registerMemoryCapabilityto preferowany wyłączny interfejs API Pluginu pamięci.registerMemoryCapabilitymoże także udostępniaćpublicArtifacts.listArtifacts(...), aby Pluginy towarzyszące mogły korzystać z wyeksportowanych artefaktów pamięci przezopenclaw/plugin-sdk/memory-host-core, zamiast sięgać do prywatnego układu konkretnego Pluginu pamięci.registerMemoryPromptSection,registerMemoryFlushPlaniregisterMemoryRuntimeto wyłączne interfejsy API Pluginu pamięci zgodne ze starszymi wersjami.MemoryFlushPlan.modelmoże przypiąć turę opróżniania do dokładnej referencjiprovider/model, takiej jakollama/qwen3:8b, bez dziedziczenia aktywnego łańcucha fallback.registerMemoryEmbeddingProviderpozwala aktywnemu Pluginowi pamięci zarejestrować jeden lub więcej identyfikatorów adapterów embeddingów (na przykładopenai,geminialbo niestandardowy identyfikator zdefiniowany przez Plugin).- Konfiguracja użytkownika, taka jak
agents.defaults.memorySearch.provideriagents.defaults.memorySearch.fallback, jest rozwiązywana względem tych zarejestrowanych identyfikatorów adapterów.
Zdarzenia i cykl życia
| Metoda | Co robi |
|---|---|
api.on(hookName, handler, opts?) |
Typowany hook cyklu życia |
api.onConversationBindingResolved(handler) |
Callback powiązania konwersacji |
Zobacz hooki Pluginów, aby poznać przykłady, typowe nazwy hooków i semantykę strażników.
Semantyka decyzji hooków
before_tool_call: zwrócenie{ block: true }jest końcowe. Gdy dowolny handler to ustawi, handlery o niższym priorytecie są pomijane.before_tool_call: zwrócenie{ block: false }jest traktowane jako brak decyzji (tak samo jak pominięcieblock), a nie jako nadpisanie.before_install: zwrócenie{ block: true }jest końcowe. Gdy dowolny handler to ustawi, handlery o niższym priorytecie są pomijane.before_install: zwrócenie{ block: false }jest traktowane jako brak decyzji (tak samo jak pominięcieblock), a nie jako nadpisanie.reply_dispatch: zwrócenie{ handled: true, ... }jest końcowe. Gdy dowolny handler przejmie wysyłkę, handlery o niższym priorytecie i domyślna ścieżka wysyłki modelu są pomijane.message_sending: zwrócenie{ cancel: true }jest końcowe. Gdy dowolny handler to ustawi, handlery o niższym priorytecie są pomijane.message_sending: zwrócenie{ cancel: false }jest traktowane jako brak decyzji (tak samo jak pominięciecancel), a nie jako nadpisanie.message_received: użyj typowanego polathreadId, gdy potrzebujesz routingu przychodzącego wątku/tematu. Zachowajmetadatana dodatki specyficzne dla kanału.message_sending: użyj typowanych pól routingureplyToId/threadIdprzed przejściem do specyficznego dla kanałumetadata.gateway_start: użyjctx.config,ctx.workspaceDirictx.getCron?.()dla stanu uruchomieniowego należącego do Gateway, zamiast polegać na wewnętrznych hookachgateway:startup.cron_changed: obserwuj zmiany cyklu życia Cron należącego do Gateway. Użyjevent.job?.state?.nextRunAtMsictx.getCron?.()podczas synchronizowania zewnętrznych harmonogramów wybudzania oraz utrzymuj OpenClaw jako źródło prawdy dla sprawdzania terminów i wykonywania.
Pola obiektu API
| Pole | Typ | Opis |
|---|---|---|
api.id |
string |
Identyfikator Pluginu |
api.name |
string |
Nazwa wyświetlana |
api.version |
string? |
Wersja Pluginu (opcjonalnie) |
api.description |
string? |
Opis Pluginu (opcjonalnie) |
api.source |
string |
Ścieżka źródłowa Pluginu |
api.rootDir |
string? |
Katalog główny Pluginu (opcjonalnie) |
api.config |
OpenClawConfig |
Bieżący zrzut konfiguracji (aktywny zrzut runtime w pamięci, gdy jest dostępny) |
api.pluginConfig |
Record<string, unknown> |
Konfiguracja specyficzna dla Pluginu z plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
Helpery runtime |
api.logger |
PluginLogger |
Logger o ograniczonym zakresie (debug, info, warn, error) |
api.registrationMode |
PluginRegistrationMode |
Bieżący tryb ładowania; "setup-runtime" to lekkie okno uruchamiania/konfiguracji przed pełnym wejściem |
api.resolvePath(input) |
(string) => string |
Rozwiązuje ścieżkę względem katalogu głównego Pluginu |
Konwencja modułu wewnętrznego
W swoim Pluginie używaj lokalnych plików zbiorczych do importów wewnętrznych:
my-plugin/
api.ts # Public exports for external consumers
runtime-api.ts # Internal-only runtime exports
index.ts # Plugin entry point
setup-entry.ts # Lightweight setup-only entry (optional)
Publiczne powierzchnie dołączonych Pluginów ładowane przez fasadę (api.ts, runtime-api.ts,
index.ts, setup-entry.ts i podobne publiczne pliki wejściowe) preferują
aktywny zrzut konfiguracji runtime, gdy OpenClaw już działa. Jeśli zrzut runtime
jeszcze nie istnieje, wracają do rozwiązanej konfiguracji z pliku na dysku.
Fasady spakowanych dołączonych Pluginów powinny być ładowane przez loadery fasad Pluginów
OpenClaw; bezpośrednie importy z dist/extensions/... omijają manifest
i sprawdzenia bocznego procesu runtime, których spakowane instalacje używają dla kodu należącego do Pluginu.
Pluginy dostawców mogą udostępniać wąski lokalny dla Pluginu plik zbiorczy kontraktu, gdy helper jest celowo specyficzny dla dostawcy i nie pasuje jeszcze do ogólnej podścieżki SDK. Dołączone przykłady:
- Anthropic: publiczny szew
api.ts/contract-api.tsdla helperów strumieni Claude beta-header iservice_tier. @openclaw/openai-provider:api.tseksportuje konstruktory dostawcy, helpery modeli domyślnych i konstruktory dostawcy realtime.@openclaw/openrouter-provider:api.tseksportuje konstruktor dostawcy oraz helpery onboardingu/konfiguracji.
Powiązane
Opcje definePluginEntry i defineChannelPluginEntry.
Pełna dokumentacja przestrzeni nazw api.runtime.
Pakowanie, manifesty i schematy konfiguracji.
Narzędzia testowe i reguły lintowania.
Migracja z przestarzałych powierzchni.
Szczegółowa architektura i model możliwości.