Przejdź do głównej treści
OpenClaw przeszedł z szerokiej warstwy zgodności wstecznej na nowoczesną architekturę pluginów ze skoncentrowanymi, udokumentowanymi importami. Jeśli Twój plugin został zbudowany przed nową architekturą, ten przewodnik pomoże Ci przeprowadzić migrację.

Co się zmienia

Stary system pluginów udostępniał dwie bardzo szerokie powierzchnie, które pozwalały pluginom importować wszystko, czego potrzebowały, z jednego punktu wejścia:
  • openclaw/plugin-sdk/compat - pojedynczy import, który ponownie eksportował dziesiątki helperów. Został wprowadzony, aby starsze pluginy oparte na hookach nadal działały, gdy budowano nową architekturę pluginów.
  • openclaw/plugin-sdk/infra-runtime - szeroki barrel helperów uruchomieniowych, który mieszał zdarzenia systemowe, stan heartbeat, kolejki dostarczania, helpery fetch/proxy, helpery plików, typy zatwierdzeń i niepowiązane narzędzia.
  • openclaw/plugin-sdk/config-runtime - szeroki barrel zgodności konfiguracji, który wciąż przenosi przestarzałe bezpośrednie helpery ładowania/zapisu w okresie migracji.
  • openclaw/extension-api - most, który dawał pluginom bezpośredni dostęp do helperów po stronie hosta, takich jak osadzony runner agenta.
  • api.registerEmbeddedExtensionFactory(...) - usunięty hook bundled extension tylko dla osadzonego runnera, który mógł obserwować zdarzenia osadzonego runnera, takie jak tool_result.
Szerokie powierzchnie importu są teraz przestarzałe. Nadal działają w runtime, ale nowe pluginy nie mogą ich używać, a istniejące pluginy powinny przeprowadzić migrację, zanim następne wydanie główne je usunie. API rejestracji factory rozszerzeń wyłącznie dla osadzonego runnera zostało usunięte; zamiast tego użyj middleware wyników narzędzi. OpenClaw nie usuwa ani nie interpretuje ponownie udokumentowanego zachowania pluginów w tej samej zmianie, która wprowadza zamiennik. Zmiany łamiące kontrakt muszą najpierw przejść przez adapter zgodności, diagnostykę, dokumentację i okres wycofywania. Dotyczy to importów SDK, pól manifestu, API setup, hooków i zachowania rejestracji runtime.
Warstwa zgodności wstecznej zostanie usunięta w przyszłym wydaniu głównym. Pluginy, które nadal importują z tych powierzchni, przestaną wtedy działać. Starsze rejestracje factory osadzonych rozszerzeń już się nie ładują.

Dlaczego to się zmieniło

Stare podejście powodowało problemy:
  • Powolny startup - import jednego helpera ładował dziesiątki niepowiązanych modułów
  • Zależności cykliczne - szerokie ponowne eksporty ułatwiały tworzenie cykli importu
  • Niejasna powierzchnia API - nie było sposobu, aby stwierdzić, które eksporty były stabilne, a które wewnętrzne
Nowoczesny plugin SDK rozwiązuje ten problem: każda ścieżka importu (openclaw/plugin-sdk/\<subpath\>) jest małym, samodzielnym modułem o jasnym przeznaczeniu i udokumentowanym kontrakcie. Starsze wygodne seamy providerów dla bundled kanałów również zniknęły. Helper seamy oznaczone marką kanału były prywatnymi skrótami mono-repo, a nie stabilnymi kontraktami pluginów. Zamiast tego używaj wąskich, ogólnych podścieżek SDK. Wewnątrz bundled przestrzeni roboczej pluginów trzymaj helpery należące do providera we własnym api.ts lub runtime-api.ts tego pluginu. Aktualne przykłady bundled providerów:
  • Anthropic trzyma helpery strumieni specyficzne dla Claude we własnym seamie api.ts / contract-api.ts
  • OpenAI trzyma buildery providerów, helpery modeli domyślnych i buildery providerów realtime we własnym api.ts
  • OpenRouter trzyma builder providera oraz helpery onboardingu/konfiguracji we własnym api.ts

Plan migracji Talk i głosu realtime

Kod głosu realtime, telefonii, spotkań i przeglądarkowego Talk jest przenoszony z lokalnego dla powierzchni księgowania tur do współdzielonego kontrolera sesji Talk eksportowanego przez openclaw/plugin-sdk/realtime-voice. Nowy kontroler odpowiada za wspólną kopertę zdarzeń Talk, stan aktywnej tury, stan przechwytywania, stan dźwięku wyjściowego, ostatnią historię zdarzeń i odrzucanie przestarzałych tur. Pluginy providerów powinny nadal odpowiadać za sesje realtime specyficzne dla dostawcy; pluginy powierzchni powinny nadal odpowiadać za przechwytywanie, odtwarzanie, telefonię i osobliwości spotkań. Ta migracja Talk jest celowo czysto łamiąca:
  1. Utrzymaj współdzielony kontroler/prymitywy runtime w plugin-sdk/realtime-voice.
  2. Przenieś bundled powierzchnie na współdzielony kontroler: przekaźnik przeglądarkowy, przekazanie managed-room, realtime połączeń głosowych, strumieniowe STT połączeń głosowych, realtime Google Meet oraz natywne push-to-talk.
  3. Zastąp stare rodziny RPC Talk docelowym API talk.session.* i talk.client.*.
  4. Ogłaszaj jeden aktywny kanał zdarzeń Talk w Gateway hello-ok.features.events: talk.event.
  5. Usuń stary endpoint HTTP realtime i każdą ścieżkę nadpisywania instrukcji w czasie żądania.
Nowy kod nie powinien wywoływać createTalkEventSequencer(...) bezpośrednio, chyba że implementuje niskopoziomowy adapter lub fixture testowy. Preferuj współdzielony kontroler, aby zdarzenia ograniczone do tury nie mogły być emitowane bez id tury, przestarzałe wywołania turnEnd / turnCancel nie mogły wyczyścić nowszej aktywnej tury, a zdarzenia cyklu życia dźwięku wyjściowego pozostawały spójne w telefonii, spotkaniach, przekaźniku przeglądarkowym, przekazaniu managed-room i natywnych klientach Talk. Docelowy kształt publicznego API to:
// Gateway-owned Talk session API.
await gateway.request("talk.session.create", {
  mode: "realtime",
  transport: "gateway-relay",
  brain: "agent-consult",
  sessionKey: "main",
});
await gateway.request("talk.session.appendAudio", { sessionId, audioBase64 });
await gateway.request("talk.session.cancelOutput", { sessionId, reason: "barge-in" });
await gateway.request("talk.session.submitToolResult", {
  sessionId,
  callId,
  result: { status: "working" },
  options: { willContinue: true },
});
await gateway.request("talk.session.submitToolResult", {
  sessionId,
  callId,
  result: { status: "already_delivered" },
  options: { suppressResponse: true },
});
await gateway.request("talk.session.submitToolResult", { sessionId, callId, result });
await gateway.request("talk.session.close", { sessionId });

// Client-owned provider session API.
await gateway.request("talk.client.create", {
  mode: "realtime",
  transport: "webrtc",
  brain: "agent-consult",
  sessionKey: "main",
});
await gateway.request("talk.client.toolCall", { sessionKey, callId, name, args });
await gateway.request("talk.client.steer", { sessionKey, text, mode: "steer" });
Sesje WebRTC/provider-websocket należące do przeglądarki używają talk.client.create, ponieważ przeglądarka odpowiada za negocjację providera i transport mediów, podczas gdy Gateway odpowiada za poświadczenia, instrukcje i politykę narzędzi. talk.session.* jest wspólną powierzchnią zarządzaną przez Gateway dla realtime gateway-relay, transkrypcji gateway-relay i sesji STT/TTS natywnych managed-room. Starsze konfiguracje, które umieszczały selektory realtime obok talk.provider / talk.providers, powinny zostać naprawione przez openclaw doctor --fix; runtime Talk nie interpretuje ponownie konfiguracji providera speech/TTS jako konfiguracji providera realtime. Obsługiwane kombinacje talk.session.create są celowo niewielkie:
TrybTransportBrainWłaścicielUwagi
realtimegateway-relayagent-consultGatewayDźwięk providera full-duplex mostkowany przez Gateway; wywołania narzędzi są kierowane przez narzędzie agent-consult.
transcriptiongateway-relaynoneGatewayTylko strumieniowe STT; wywołujący wysyłają dźwięk wejściowy i otrzymują zdarzenia transkryptu.
stt-ttsmanaged-roomagent-consultPokój natywny/klientaPokoje w stylu push-to-talk i walkie-talkie, w których klient odpowiada za przechwytywanie/odtwarzanie, a Gateway za stan tury.
stt-ttsmanaged-roomdirect-toolsPokój natywny/klientaTryb pokoju tylko dla administratorów dla zaufanych powierzchni first-party, które wykonują akcje narzędzi Gateway bezpośrednio.
Mapa usuniętych metod:
StareNowe
talk.realtime.sessiontalk.client.create
talk.realtime.toolCalltalk.client.toolCall
talk.realtime.relayAudiotalk.session.appendAudio
talk.realtime.relayCanceltalk.session.cancelOutput lub talk.session.cancelTurn
talk.realtime.relayToolResulttalk.session.submitToolResult
talk.realtime.relayStoptalk.session.close
talk.transcription.sessiontalk.session.create({ mode: "transcription" })
talk.transcription.relayAudiotalk.session.appendAudio
talk.transcription.relayCanceltalk.session.cancelTurn
talk.transcription.relayStoptalk.session.close
talk.handoff.createtalk.session.create({ transport: "managed-room" })
talk.handoff.jointalk.session.join
talk.handoff.revoketalk.session.close
Ujednolicony słownik sterowania jest również celowo wąski:
MetodaDotyczyKontrakt
talk.session.appendAudiorealtime/gateway-relay, transcription/gateway-relayDołącz fragment audio PCM zakodowany w base64 do sesji dostawcy należącej do tego samego połączenia Gateway.
talk.session.startTurnstt-tts/managed-roomRozpocznij turę użytkownika w pokoju zarządzanym.
talk.session.endTurnstt-tts/managed-roomZakończ aktywną turę po walidacji nieaktualnej tury.
talk.session.cancelTurnwszystkie sesje należące do GatewayAnuluj aktywne przechwytywanie, pracę dostawcy, agenta i TTS dla tury.
talk.session.cancelOutputrealtime/gateway-relayZatrzymaj wyjście audio asystenta bez konieczności kończenia tury użytkownika.
talk.session.submitToolResultrealtime/gateway-relayDokończ wywołanie narzędzia dostawcy wyemitowane przez przekaźnik; przekaż options.willContinue dla wyjścia tymczasowego lub options.suppressResponse, aby spełnić wywołanie bez kolejnej odpowiedzi asystenta.
talk.session.steersesje Talk wspierane przez agentaWyślij mówioną kontrolę status, steer, cancel lub followup do aktywnego osadzonego uruchomienia rozwiązanego z sesji Talk.
talk.session.closewszystkie ujednolicone sesjeZatrzymaj sesje przekaźnika lub unieważnij stan pokoju zarządzanego, a następnie zapomnij ujednolicony identyfikator sesji.
Nie wprowadzaj w rdzeniu specjalnych przypadków dostawcy ani platformy, aby to działało. Rdzeń odpowiada za semantykę sesji Talk. Pluginy dostawców odpowiadają za konfigurację sesji dostawcy. Voice-call i Google Meet odpowiadają za adaptery telefonii/spotkań. Przeglądarka i aplikacje natywne odpowiadają za UX przechwytywania/odtwarzania urządzenia.

Zasady zgodności

Dla zewnętrznych pluginów prace nad zgodnością przebiegają w tej kolejności:
  1. dodaj nowy kontrakt
  2. zachowaj stare zachowanie podłączone przez adapter zgodności
  3. emituj diagnostykę lub ostrzeżenie, które wskazuje starą ścieżkę i zamiennik
  4. pokryj obie ścieżki testami
  5. udokumentuj wycofanie i ścieżkę migracji
  6. usuń dopiero po ogłoszonym oknie migracji, zwykle w wydaniu major
Maintainerzy mogą audytować bieżącą kolejkę migracji za pomocą pnpm plugins:boundary-report. Użyj pnpm plugins:boundary-report:summary dla zwartych zliczeń, --owner <id> dla jednego pluginu lub właściciela zgodności oraz pnpm plugins:boundary-report:ci, gdy bramka CI ma kończyć się niepowodzeniem przy zaległych rekordach zgodności, zastrzeżonych importach SDK między właścicielami albo nieużywanych zastrzeżonych podścieżkach SDK. Raport grupuje przestarzałe rekordy zgodności według daty usunięcia, zlicza lokalne odwołania w kodzie/dokumentacji, ujawnia zastrzeżone importy SDK między właścicielami i podsumowuje prywatny most SDK memory-host, aby sprzątanie zgodności pozostawało jawne zamiast polegać na doraźnych wyszukiwaniach. Zastrzeżone podścieżki SDK muszą mieć śledzone użycie przez właścicieli; nieużywane zastrzeżone eksporty pomocnicze należy usunąć z publicznego SDK. Jeśli pole manifestu jest nadal akceptowane, autorzy pluginów mogą go dalej używać, dopóki dokumentacja i diagnostyka nie powiedzą inaczej. Nowy kod powinien preferować udokumentowany zamiennik, ale istniejące pluginy nie powinny psuć się podczas zwykłych wydań minor.

Jak migrować

1

Migrate runtime config load/write helpers

Dołączone pluginy powinny przestać wywoływać api.runtime.config.loadConfig() i api.runtime.config.writeConfigFile(...) bezpośrednio. Preferuj konfigurację, która została już przekazana do aktywnej ścieżki wywołania. Długotrwałe handlery, które potrzebują bieżącego zrzutu procesu, mogą użyć api.runtime.config.current(). Długotrwałe narzędzia agenta powinny używać ctx.getRuntimeConfig() z kontekstu narzędzia wewnątrz execute, aby narzędzie utworzone przed zapisem konfiguracji nadal widziało odświeżoną konfigurację runtime.Zapisy konfiguracji muszą przechodzić przez pomocniki transakcyjne i wybrać zasadę po zapisie:
await api.runtime.config.mutateConfigFile({
  afterWrite: { mode: "auto" },
  mutate(draft) {
    draft.plugins ??= {};
  },
});
Użyj afterWrite: { mode: "restart", reason: "..." }, gdy wywołujący wie, że zmiana wymaga czystego restartu gateway, oraz afterWrite: { mode: "none", reason: "..." } tylko wtedy, gdy wywołujący odpowiada za dalsze działania i celowo chce pominąć planner przeładowania. Wyniki mutacji zawierają typowane podsumowanie followUp dla testów i logowania; gateway pozostaje odpowiedzialny za zastosowanie lub zaplanowanie restartu. loadConfig i writeConfigFile pozostają jako przestarzałe pomocniki zgodności dla zewnętrznych pluginów w trakcie okna migracji i ostrzegają raz z kodem zgodności runtime-config-load-write. Dołączone pluginy i kod runtime repozytorium są chronione przez zabezpieczenia skanera w pnpm check:deprecated-api-usage i pnpm check:no-runtime-action-load-config: nowe użycie produkcyjnego pluginu kończy się bezpośrednim niepowodzeniem, bezpośrednie zapisy konfiguracji zawodzą, metody serwera gateway muszą używać zrzutu runtime żądania, pomocniki wysyłki/akcji/klienta kanału runtime muszą otrzymywać konfigurację ze swojej granicy, a długotrwałe moduły runtime mają zero dozwolonych otaczających wywołań loadConfig().Nowy kod pluginu powinien także unikać importowania szerokiego barrela zgodności openclaw/plugin-sdk/config-runtime. Użyj wąskiej podścieżki SDK dopasowanej do zadania:
PotrzebaImport
Typy konfiguracji, takie jak OpenClawConfigopenclaw/plugin-sdk/config-contracts
Asercje już załadowanej konfiguracji i wyszukiwanie konfiguracji wejścia pluginuopenclaw/plugin-sdk/plugin-config-runtime
Odczyty bieżącego zrzutu runtimeopenclaw/plugin-sdk/runtime-config-snapshot
Zapisy konfiguracjiopenclaw/plugin-sdk/config-mutation
Pomocniki magazynu sesjiopenclaw/plugin-sdk/session-store-runtime
Konfiguracja tabel Markdownopenclaw/plugin-sdk/markdown-table-runtime
Pomocniki runtime zasad grupopenclaw/plugin-sdk/runtime-group-policy
Rozwiązywanie wejścia sekretuopenclaw/plugin-sdk/secret-input-runtime
Nadpisania modelu/sesjiopenclaw/plugin-sdk/model-session-runtime
Dołączone pluginy i ich testy są chronione skanerem przed szerokim barrelem, aby importy i mocki pozostawały lokalne wobec potrzebnego im zachowania. Szeroki barrel nadal istnieje dla zgodności zewnętrznej, ale nowy kod nie powinien od niego zależeć.
2

Migrate embedded tool-result extensions to middleware

Dołączone pluginy muszą zastąpić handlery wyników narzędzi api.registerEmbeddedExtensionFactory(...) przeznaczone tylko dla embedded-runnera neutralnym wobec runtime middleware.
// OpenClaw and Codex runtime dynamic tools
api.registerAgentToolResultMiddleware(async (event) => {
  return compactToolResult(event);
}, {
  runtimes: ["openclaw", "codex"],
});
Jednocześnie zaktualizuj manifest pluginu:
{
  "contracts": {
    "agentToolResultMiddleware": ["openclaw", "codex"]
  }
}
Zainstalowane pluginy mogą również rejestrować middleware wyników narzędzi, gdy są jawnie włączone i deklarują każdy docelowy runtime w contracts.agentToolResultMiddleware. Niezadeklarowane rejestracje zainstalowanego middleware są odrzucane.
3

Migrate approval-native handlers to capability facts

Pluginy kanałów obsługujące zatwierdzenia ujawniają teraz natywne zachowanie zatwierdzeń przez approvalCapability.nativeRuntime oraz współdzielony rejestr kontekstu runtime.Kluczowe zmiany:
  • Zastąp approvalCapability.handler.loadRuntime(...) przez approvalCapability.nativeRuntime
  • Przenieś autoryzację/dostarczanie specyficzne dla zatwierdzeń ze starego okablowania plugin.auth / plugin.approvals na approvalCapability
  • ChannelPlugin.approvals zostało usunięte z publicznego kontraktu pluginu kanału; przenieś pola delivery/native/render na approvalCapability
  • plugin.auth pozostaje tylko dla przepływów logowania/wylogowania kanału; hooki autoryzacji zatwierdzeń w tym miejscu nie są już odczytywane przez rdzeń
  • Rejestruj obiekty runtime należące do kanału, takie jak klienci, tokeny lub aplikacje Bolt, przez openclaw/plugin-sdk/channel-runtime-context
  • Nie wysyłaj powiadomień o przekierowaniu należących do pluginu z natywnych handlerów zatwierdzeń; rdzeń odpowiada teraz za powiadomienia o skierowaniu gdzie indziej na podstawie rzeczywistych wyników dostarczenia
  • Przekazując channelRuntime do createChannelManager(...), zapewnij rzeczywistą powierzchnię createPluginRuntime().channel. Częściowe stuby są odrzucane.
Zobacz /plugins/sdk-channel-plugins, aby poznać bieżący układ capability zatwierdzeń.
4

Audit Windows wrapper fallback behavior

Jeśli Twój plugin używa openclaw/plugin-sdk/windows-spawn, nierozwiązane wrappery Windows .cmd/.bat teraz zawodzą w trybie zamkniętym, chyba że jawnie przekażesz allowShellFallback: true.
// Before
const program = applyWindowsSpawnProgramPolicy({ candidate });

// After
const program = applyWindowsSpawnProgramPolicy({
  candidate,
  // Only set this for trusted compatibility callers that intentionally
  // accept shell-mediated fallback.
  allowShellFallback: true,
});
Jeśli Twój wywołujący nie polega celowo na fallbacku powłoki, nie ustawiaj allowShellFallback i zamiast tego obsłuż rzucony błąd.
5

Find deprecated imports

Przeszukaj swój plugin pod kątem importów z dowolnej przestarzałej powierzchni:
grep -r "plugin-sdk/compat" my-plugin/
grep -r "plugin-sdk/infra-runtime" my-plugin/
grep -r "plugin-sdk/config-runtime" my-plugin/
grep -r "openclaw/extension-api" my-plugin/
6

Replace with focused imports

Każdy eksport ze starej powierzchni mapuje się na konkretną nowoczesną ścieżkę importu:
// Before (deprecated backwards-compatibility layer)
import {
  createChannelReplyPipeline,
  createPluginRuntimeStore,
  resolveControlCommandGate,
} from "openclaw/plugin-sdk/compat";

// After (modern focused imports)
import { createChannelReplyPipeline } from "openclaw/plugin-sdk/channel-reply-pipeline";
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import { resolveControlCommandGate } from "openclaw/plugin-sdk/command-auth";
W przypadku pomocników po stronie hosta użyj wstrzykniętego runtime pluginu zamiast importować bezpośrednio:
// Before (deprecated extension-api bridge)
import { runEmbeddedAgent } from "openclaw/extension-api";
const result = await runEmbeddedAgent({ sessionId, prompt });

// After (injected runtime)
const result = await api.runtime.agent.runEmbeddedAgent({ sessionId, prompt });
Ten sam wzorzec dotyczy innych pomocników starszego mostu:
Stary importNowoczesny odpowiednik
resolveAgentDirapi.runtime.agent.resolveAgentDir
resolveAgentWorkspaceDirapi.runtime.agent.resolveAgentWorkspaceDir
resolveAgentIdentityapi.runtime.agent.resolveAgentIdentity
resolveThinkingDefaultapi.runtime.agent.resolveThinkingDefault
resolveAgentTimeoutMsapi.runtime.agent.resolveAgentTimeoutMs
ensureAgentWorkspaceapi.runtime.agent.ensureAgentWorkspace
pomocnicy magazynu sesjiapi.runtime.agent.session.*
7

Replace broad infra-runtime imports

openclaw/plugin-sdk/infra-runtime nadal istnieje na potrzeby zgodności zewnętrznej, ale nowy kod powinien importować zawężoną powierzchnię pomocniczą, której faktycznie potrzebuje:
PotrzebaImport
Pomocnicy kolejki zdarzeń systemowychopenclaw/plugin-sdk/system-event-runtime
Pomocnicy wybudzania, zdarzeń i widoczności Heartbeatopenclaw/plugin-sdk/heartbeat-runtime
Opróżnianie kolejki oczekujących dostarczeńopenclaw/plugin-sdk/delivery-queue-runtime
Telemetria aktywności kanałuopenclaw/plugin-sdk/channel-activity-runtime
Pamięci podręczne deduplikacji w pamięci i oparte na trwałym zapisieopenclaw/plugin-sdk/dedupe-runtime
Pomocnicy bezpiecznych ścieżek lokalnych plików/mediówopenclaw/plugin-sdk/file-access-runtime
Pobieranie świadome dyspozytoraopenclaw/plugin-sdk/runtime-fetch
Pomocnicy proxy i chronionego pobieraniaopenclaw/plugin-sdk/fetch-runtime
Typy zasad dyspozytora SSRFopenclaw/plugin-sdk/ssrf-dispatcher
Typy żądań/rozstrzygnięć zatwierdzeńopenclaw/plugin-sdk/approval-runtime
Ładunek odpowiedzi zatwierdzenia i pomocnicy poleceńopenclaw/plugin-sdk/approval-reply-runtime
Pomocnicy formatowania błędówopenclaw/plugin-sdk/error-runtime
Oczekiwanie na gotowość transportuopenclaw/plugin-sdk/transport-ready-runtime
Pomocnicy bezpiecznych tokenówopenclaw/plugin-sdk/secure-random-runtime
Ograniczona współbieżność zadań asynchronicznychopenclaw/plugin-sdk/concurrency-runtime
Koercja liczbowaopenclaw/plugin-sdk/number-runtime
Procesowo lokalna blokada asynchronicznaopenclaw/plugin-sdk/async-lock-runtime
Blokady plikówopenclaw/plugin-sdk/file-lock
Wbudowane pluginy są chronione przez skaner przed infra-runtime, więc kod repozytorium nie może cofnąć się do szerokiego barrela.
8

Migrate channel route helpers

Nowy kod tras kanału powinien używać openclaw/plugin-sdk/channel-route. Starsze nazwy klucza trasy i porównywalnego celu pozostają aliasami zgodności w okresie migracji, ale nowe pluginy powinny używać nazw tras, które bezpośrednio opisują zachowanie:
Stary pomocnikNowoczesny pomocnik
channelRouteIdentityKey(...)channelRouteDedupeKey(...)
channelRouteKey(...)channelRouteCompactKey(...)
ComparableChannelTargetChannelRouteParsedTarget
comparableChannelTargetsMatch(...)channelRouteTargetsMatchExact(...)
comparableChannelTargetsShareRoute(...)channelRouteTargetsShareConversation(...)
Nowoczesne pomocniki tras spójnie normalizują { channel, to, accountId, threadId } w natywnych zatwierdzeniach, tłumieniu odpowiedzi, deduplikacji przychodzącej, dostarczaniu Cron i routingu sesji.Nie dodawaj nowych użyć ChannelMessagingAdapter.parseExplicitTarget ani pomocników załadowanych tras opartych na parserze (parseExplicitTargetForLoadedChannel lub resolveRouteTargetForLoadedChannel) ani resolveChannelRouteTargetWithParser(...) z plugin-sdk/channel-route. Te hooki są przestarzałe i pozostają tylko dla starszych pluginów w okresie migracji. Nowe pluginy kanałów powinny używać messaging.targetResolver.resolveTarget(...) do normalizacji identyfikatora celu i awaryjnej obsługi chybienia katalogu, messaging.inferTargetChatType(...), gdy core potrzebuje wczesnego rodzaju peera, oraz messaging.resolveOutboundSessionRoute(...) dla natywnej dla dostawcy sesji i tożsamości wątku.
9

Build and test

pnpm build
pnpm test -- my-plugin/

Odwołanie do ścieżek importu

Ścieżka importuCelKluczowe eksporty
plugin-sdk/plugin-entryKanoniczny pomocnik punktu wejścia PlugindefinePluginEntry
plugin-sdk/coreStarszy zbiorczy reeksport definicji/konstruktorów punktów wejścia kanałudefineChannelPluginEntry, createChatChannelPlugin
plugin-sdk/config-schemaEksport głównego schematu konfiguracjiOpenClawSchema
plugin-sdk/provider-entryPomocnik punktu wejścia pojedynczego dostawcydefineSingleProviderPluginEntry
plugin-sdk/channel-coreSkoncentrowane definicje i konstruktory punktów wejścia kanałudefineChannelPluginEntry, defineSetupPluginEntry, createChatChannelPlugin, createChannelPluginBase
plugin-sdk/setupWspółdzielone pomocniki kreatora konfiguracjiTranslator konfiguracji, prompty listy dozwolonych, konstruktory stanu konfiguracji
plugin-sdk/setup-runtimePomocniki środowiska uruchomieniowego na czas konfiguracjicreateSetupTranslator, bezpieczne dla importu adaptery poprawek konfiguracji, pomocniki notatek wyszukiwania, promptResolvedAllowFrom, splitSetupEntries, delegowane proxy konfiguracji
plugin-sdk/setup-adapter-runtimePrzestarzały alias adaptera konfiguracjiUżyj plugin-sdk/setup-runtime
plugin-sdk/setup-toolsPomocniki narzędzi konfiguracjiformatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR
plugin-sdk/account-corePomocniki wielu kontPomocniki listy kont/konfiguracji/bramki akcji
plugin-sdk/account-idPomocniki identyfikatora kontaDEFAULT_ACCOUNT_ID, normalizacja identyfikatora konta
plugin-sdk/account-resolutionPomocniki wyszukiwania kontPomocniki wyszukiwania kont i domyślnego fallbacku
plugin-sdk/account-helpersWąskie pomocniki kontPomocniki listy kont/akcji konta
plugin-sdk/channel-setupAdaptery kreatora konfiguracjicreateOptionalChannelSetupSurface, createOptionalChannelSetupAdapter, createOptionalChannelSetupWizard, plus DEFAULT_ACCOUNT_ID, createTopLevelChannelDmPolicy, setSetupChannelEnabled, splitSetupEntries
plugin-sdk/channel-pairingPrymitywy parowania DMcreateChannelPairingController
plugin-sdk/channel-reply-pipelinePrefiks odpowiedzi, pisanie i okablowanie dostarczania źródłowegocreateChannelReplyPipeline, resolveChannelSourceReplyDeliveryMode
plugin-sdk/channel-config-helpersFabryki adapterów konfiguracji i pomocniki dostępu DMcreateHybridChannelConfigAdapter, resolveChannelDmAccess, resolveChannelDmAllowFrom, resolveChannelDmPolicy, normalizeChannelDmPolicy, normalizeLegacyDmAliases
plugin-sdk/channel-config-schemaKonstruktory schematów konfiguracjiWspółdzielone prymitywy schematu konfiguracji kanału i tylko ogólny konstruktor
plugin-sdk/bundled-channel-config-schemaDołączone schematy konfiguracjiTylko dołączone plugins utrzymywane przez OpenClaw; nowe plugins muszą definiować schematy lokalne dla Plugin
plugin-sdk/channel-config-schema-legacyPrzestarzałe dołączone schematy konfiguracjiTylko alias zgodności; użyj plugin-sdk/bundled-channel-config-schema dla utrzymywanych dołączonych plugins
plugin-sdk/telegram-command-configPomocniki konfiguracji poleceń TelegramNormalizacja nazw poleceń, przycinanie opisów, walidacja duplikatów/konfliktów
plugin-sdk/channel-policyRozwiązywanie zasad grup/DMresolveChannelGroupRequireMention
plugin-sdk/channel-lifecyclePrzestarzała fasada zgodnościUżyj plugin-sdk/channel-outbound
plugin-sdk/inbound-envelopePomocniki kopert przychodzącychWspółdzielone pomocniki tras i konstruktora kopert
plugin-sdk/channel-inboundPomocniki odbioru przychodzącegoBudowanie kontekstu, formatowanie, korzenie, uruchamiacze, przygotowane wysyłanie odpowiedzi i predykaty wysyłki
plugin-sdk/messaging-targetsPrzestarzała ścieżka importu parsowania celuUżyj plugin-sdk/channel-targets dla ogólnych pomocników parsowania celu, plugin-sdk/channel-route do porównywania tras oraz należących do Plugin messaging.targetResolver / messaging.resolveOutboundSessionRoute do rozwiązywania celu specyficznego dla dostawcy
plugin-sdk/outbound-mediaPomocniki mediów wychodzącychWspółdzielone ładowanie mediów wychodzących
plugin-sdk/outbound-send-depsPrzestarzała fasada zgodnościUżyj plugin-sdk/channel-outbound
plugin-sdk/channel-outboundPomocniki cyklu życia wiadomości wychodzącychAdaptery wiadomości, potwierdzenia odbioru, pomocniki trwałego wysyłania, pomocniki podglądu na żywo/streamingu, opcje odpowiedzi, pomocniki cyklu życia, tożsamość wychodząca i planowanie ładunku
plugin-sdk/channel-streamingPrzestarzała fasada zgodnościUżyj plugin-sdk/channel-outbound
plugin-sdk/outbound-runtimePrzestarzała fasada zgodnościUżyj plugin-sdk/channel-outbound
plugin-sdk/thread-bindings-runtimePomocniki wiązania wątkuPomocniki cyklu życia i adapterów wiązania wątku
plugin-sdk/agent-media-payloadStarsze pomocniki ładunku mediówKonstruktor ładunku mediów agenta dla starszych układów pól
plugin-sdk/channel-runtimePrzestarzały shim zgodnościTylko narzędzia środowiska uruchomieniowego starszych kanałów
plugin-sdk/channel-send-resultTypy wyników wysyłaniaTypy wyników odpowiedzi
plugin-sdk/runtime-storeTrwała pamięć PlugincreatePluginRuntimeStore
plugin-sdk/runtimeSzerokie pomocniki środowiska uruchomieniowegoPomocniki środowiska uruchomieniowego/logowania/kopii zapasowej/instalacji Plugin
plugin-sdk/runtime-envWąskie pomocniki środowiska uruchomieniowego envPomocniki loggera/środowiska uruchomieniowego env, limitu czasu, ponawiania i backoffu
plugin-sdk/plugin-runtimeWspółdzielone pomocniki środowiska uruchomieniowego PluginPomocniki poleceń/hooków/http/interaktywne Plugin
plugin-sdk/hook-runtimePomocniki potoku hookówWspółdzielone pomocniki potoku hooków Webhook/wewnętrznych
plugin-sdk/lazy-runtimeLeniwe pomocniki środowiska uruchomieniowegocreateLazyRuntimeModule, createLazyRuntimeMethod, createLazyRuntimeMethodBinder, createLazyRuntimeNamedExport, createLazyRuntimeSurface
plugin-sdk/process-runtimePomocniki procesówWspółdzielone pomocniki wykonywania
plugin-sdk/cli-runtimePomocniki środowiska uruchomieniowego CLIFormatowanie poleceń, oczekiwania, pomocniki wersji
plugin-sdk/gateway-runtimePomocniki GatewayKlient Gateway, pomocnik startu gotowy na pętlę zdarzeń, rozwiązywanie ogłaszanego hosta LAN i pomocniki poprawek stanu kanału
plugin-sdk/config-runtimePrzestarzały shim zgodności konfiguracjiPreferuj config-contracts, plugin-config-runtime, runtime-config-snapshot i config-mutation
plugin-sdk/telegram-command-configPomocniki poleceń TelegramStabilne względem fallbacku pomocniki walidacji poleceń Telegram, gdy powierzchnia kontraktu dołączonego Telegram jest niedostępna
plugin-sdk/approval-runtimePomocniki promptów zatwierdzaniaŁadunek zatwierdzania exec/Plugin, pomocniki możliwości/profili zatwierdzania, natywne pomocniki routingu/środowiska uruchomieniowego zatwierdzania i formatowanie ścieżek wyświetlania zatwierdzeń strukturalnych
plugin-sdk/approval-auth-runtimePomocniki autoryzacji zatwierdzaniaRozwiązywanie zatwierdzającego, autoryzacja akcji w tym samym czacie
plugin-sdk/approval-client-runtimePomocniki klienta zatwierdzaniaNatywne pomocniki profilu/filtra zatwierdzania exec
plugin-sdk/approval-delivery-runtimePomocniki dostarczania zatwierdzeńNatywne adaptery możliwości/dostarczania zatwierdzeń
plugin-sdk/approval-gateway-runtimePomocniki Gateway zatwierdzaniaWspółdzielony pomocnik rozwiązywania Gateway zatwierdzania
plugin-sdk/approval-handler-adapter-runtimePomocniki adapterów zatwierdzaniaLekkie pomocniki ładowania natywnych adapterów zatwierdzania dla gorących punktów wejścia kanału
plugin-sdk/approval-handler-runtimePomocniki obsługi zatwierdzaniaSzersze pomocniki środowiska uruchomieniowego obsługi zatwierdzania; preferuj węższe szwy adaptera/Gateway, gdy wystarczają
plugin-sdk/approval-native-runtimePomocniki celu zatwierdzaniaNatywne pomocniki wiązania celu/konta zatwierdzania
plugin-sdk/approval-reply-runtimePomocniki odpowiedzi zatwierdzaniaPomocniki ładunku odpowiedzi zatwierdzania exec/Plugin
plugin-sdk/channel-runtime-contextPomocniki kontekstu środowiska uruchomieniowego kanałuOgólne pomocniki rejestracji/pobierania/obserwowania kontekstu środowiska uruchomieniowego kanału
plugin-sdk/security-runtimePomocniki bezpieczeństwaWspółdzielone pomocniki zaufania, bramkowania DM, ograniczonych do korzenia plików/ścieżek, treści zewnętrznych i zbierania sekretów
plugin-sdk/ssrf-policyPomocniki zasad SSRFPomocniki listy dozwolonych hostów i zasad sieci prywatnych
plugin-sdk/ssrf-runtimePomocniki środowiska uruchomieniowego SSRFPrzypięty dispatcher, chroniony fetch, pomocniki zasad SSRF
plugin-sdk/system-event-runtimePomocniki zdarzeń systemowychenqueueSystemEvent, peekSystemEventEntries
plugin-sdk/heartbeat-runtimePomocniki HeartbeatPomocniki wybudzania, zdarzeń i widoczności Heartbeat
plugin-sdk/delivery-queue-runtimePomocniki kolejki dostarczaniadrainPendingDeliveries
plugin-sdk/channel-activity-runtimePomocniki aktywności kanałurecordChannelActivity
plugin-sdk/dedupe-runtimePomocniki deduplikacjiPamięci podręczne deduplikacji w pamięci i oparte na trwałej pamięci
plugin-sdk/file-access-runtimePomocniki dostępu do plikówPomocniki bezpiecznych ścieżek plików/mediów lokalnych
plugin-sdk/transport-ready-runtimePomocniki gotowości transportuwaitForTransportReady
plugin-sdk/exec-approvals-runtimePomocniki zasad zatwierdzania execloadExecApprovals, resolveExecApprovalsFromFile, ExecApprovalsFile
plugin-sdk/collection-runtimePomocniki ograniczonej pamięci podręcznejpruneMapToMaxSize
plugin-sdk/diagnostic-runtimePomocniki bramkowania diagnostycznegoisDiagnosticFlagEnabled, isDiagnosticsEnabled
plugin-sdk/error-runtimePomocniki formatowania błędówformatUncaughtError, isApprovalNotFoundError, pomocniki grafu błędów
plugin-sdk/fetch-runtimePomocniki opakowanego fetch/proxyresolveFetch, pomocniki proxy, pomocniki opcji EnvHttpProxyAgent
plugin-sdk/host-runtimePomocniki normalizacji hostanormalizeHostname, normalizeScpRemoteHost
plugin-sdk/retry-runtimePomocniki ponawianiaRetryConfig, retryAsync, uruchamiacze zasad
plugin-sdk/allow-fromFormatowanie listy dozwolonych i mapowanie wejściaformatAllowFromLowercase, mapAllowlistResolutionInputs
plugin-sdk/command-authPomocniki bramkowania poleceń i powierzchni poleceńresolveControlCommandGate, pomocniki autoryzacji nadawcy, pomocniki rejestru poleceń, w tym formatowanie dynamicznego menu argumentów
plugin-sdk/command-statusRenderery stanu/pomocy poleceńbuildCommandsMessage, buildCommandsMessagePaginated, buildHelpMessage
plugin-sdk/secret-inputParsowanie wejścia sekretuPomocniki wejścia sekretu
plugin-sdk/webhook-ingressPomocniki żądań WebhookNarzędzia celu Webhook
plugin-sdk/webhook-request-guardsPomocniki strażnika treści WebhookPomocniki odczytu/limitu treści żądania
plugin-sdk/reply-runtimeWspółdzielone środowisko uruchomieniowe odpowiedziWysyłka przychodząca, Heartbeat, planer odpowiedzi, dzielenie na fragmenty
plugin-sdk/reply-dispatch-runtimeWąskie pomocniki wysyłki odpowiedziFinalizacja, wysyłka dostawcy i pomocniki etykiet konwersacji
plugin-sdk/reply-historyPomocniki historii odpowiedzicreateChannelHistoryWindow; przestarzałe eksporty zgodności pomocników map, takie jak buildPendingHistoryContextFromMap, recordPendingHistoryEntry i clearHistoryEntriesIfEnabled
plugin-sdk/reply-referencePlanowanie referencji odpowiedzicreateReplyReferencePlanner
plugin-sdk/reply-chunkingPomocniki fragmentów odpowiedziPomocniki dzielenia tekstu/Markdown na fragmenty
plugin-sdk/session-store-runtimePomocniki magazynu sesjiPomocniki ścieżki magazynu i czasu updated-at
plugin-sdk/state-pathsPomocniki ścieżek stanuPomocniki katalogów stanu i OAuth
plugin-sdk/routingPomocnicy routingu/kluczy sesjiresolveAgentRoute, buildAgentSessionKey, resolveDefaultAgentBoundAccountId, pomocnicy normalizacji kluczy sesji
plugin-sdk/status-helpersPomocnicy statusu kanałuKonstruktory podsumowań statusu kanału/konta, wartości domyślne stanu runtime, pomocnicy metadanych problemów
plugin-sdk/target-resolver-runtimePomocnicy resolwera celuWspółdzieleni pomocnicy resolwera celu
plugin-sdk/string-normalization-runtimePomocnicy normalizacji ciągów znakówPomocnicy normalizacji slugów/ciągów znaków
plugin-sdk/request-urlPomocnicy URL-i żądańWyodrębnianie URL-i tekstowych z danych wejściowych podobnych do żądań
plugin-sdk/run-commandPomocnicy poleceń z limitem czasuUruchamianie poleceń z limitem czasu i znormalizowanymi stdout/stderr
plugin-sdk/param-readersCzytniki parametrówWspólne czytniki parametrów narzędzi/CLI
plugin-sdk/tool-payloadWyodrębnianie payloadu narzędziaWyodrębnianie znormalizowanych payloadów z obiektów wyniku narzędzia
plugin-sdk/tool-sendWyodrębnianie wysyłki narzędziaWyodrębnianie kanonicznych pól celu wysyłki z argumentów narzędzia
plugin-sdk/temp-pathPomocnicy ścieżek tymczasowychWspółdzieleni pomocnicy ścieżek tymczasowego pobierania
plugin-sdk/logging-corePomocnicy logowaniaLogger podsystemu i pomocnicy redakcji
plugin-sdk/markdown-table-runtimePomocnicy tabel MarkdownPomocnicy trybu tabel Markdown
plugin-sdk/reply-payloadTypy odpowiedzi wiadomościTypy payloadu odpowiedzi
plugin-sdk/provider-setupWyselekcjonowani pomocnicy konfiguracji lokalnego/samoobsługowego dostawcyPomocnicy wykrywania/konfiguracji dostawcy samoobsługowego
plugin-sdk/self-hosted-provider-setupUkierunkowani pomocnicy konfiguracji samoobsługowego dostawcy zgodnego z OpenAICi sami pomocnicy wykrywania/konfiguracji dostawcy samoobsługowego
plugin-sdk/provider-auth-runtimePomocnicy uwierzytelniania runtime dostawcyPomocnicy rozwiązywania kluczy API w runtime
plugin-sdk/provider-auth-api-keyPomocnicy konfiguracji klucza API dostawcyPomocnicy onboardingu/zapisu profilu dla kluczy API
plugin-sdk/provider-auth-resultPomocnicy wyniku uwierzytelniania dostawcyStandardowy konstruktor wyniku uwierzytelniania OAuth
plugin-sdk/provider-selection-runtimePomocnicy wyboru dostawcyWybór skonfigurowanego lub automatycznego dostawcy i scalanie surowej konfiguracji dostawcy
plugin-sdk/provider-env-varsPomocnicy zmiennych środowiskowych dostawcyPomocnicy wyszukiwania zmiennych środowiskowych uwierzytelniania dostawcy
plugin-sdk/provider-model-sharedWspółdzieleni pomocnicy modelu/odtwarzania dostawcyProviderReplayFamily, buildProviderReplayFamilyHooks, normalizeModelCompat, współdzielone konstruktory zasad odtwarzania, pomocnicy endpointów dostawcy i pomocnicy normalizacji identyfikatorów modeli
plugin-sdk/provider-catalog-sharedWspółdzieleni pomocnicy katalogu dostawcówfindCatalogTemplate, buildSingleProviderApiKeyCatalog, buildManifestModelProviderConfig, supportsNativeStreamingUsageCompat, applyProviderNativeStreamingUsageCompat
plugin-sdk/provider-onboardPoprawki onboardingu dostawcyPomocnicy konfiguracji onboardingu
plugin-sdk/provider-httpPomocnicy HTTP dostawcyOgólni pomocnicy możliwości HTTP/endpointów dostawcy, w tym pomocnicy formularzy multipart do transkrypcji audio
plugin-sdk/provider-web-fetchPomocnicy web-fetch dostawcyPomocnicy rejestracji/cache dostawcy web-fetch
plugin-sdk/provider-web-search-config-contractPomocnicy konfiguracji wyszukiwania WWW dostawcyWąscy pomocnicy konfiguracji/poświadczeń wyszukiwania WWW dla dostawców, którzy nie potrzebują okablowania włączania pluginu
plugin-sdk/provider-web-search-contractPomocnicy kontraktu wyszukiwania WWW dostawcyWąscy pomocnicy kontraktu konfiguracji/poświadczeń wyszukiwania WWW, tacy jak createWebSearchProviderContractFields, enablePluginInConfig, resolveProviderWebSearchPluginConfig oraz zakresowe settery/gettery poświadczeń
plugin-sdk/provider-web-searchPomocnicy wyszukiwania WWW dostawcyPomocnicy rejestracji/cache/runtime dostawcy wyszukiwania WWW
plugin-sdk/provider-toolsPomocnicy zgodności narzędzi/schematów dostawcyProviderToolCompatFamily, buildProviderToolCompatFamilyHooks oraz czyszczenie schematów + diagnostyka dla DeepSeek/Gemini/OpenAI
plugin-sdk/provider-usagePomocnicy użycia dostawcyfetchClaudeUsage, fetchGeminiUsage, fetchGithubCopilotUsage i inni pomocnicy użycia dostawcy
plugin-sdk/provider-streamPomocnicy wrapperów strumieni dostawcyProviderStreamFamily, buildProviderStreamFamilyHooks, composeProviderStreamWrappers, typy wrapperów strumieni oraz współdzieleni pomocnicy wrapperów Anthropic/Bedrock/DeepSeek V4/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot
plugin-sdk/provider-transport-runtimePomocnicy transportu dostawcyNatywni pomocnicy transportu dostawcy, tacy jak chroniony fetch, wyodrębnianie tekstu z wyników narzędzi, transformacje wiadomości transportu i zapisywalne strumienie zdarzeń transportu
plugin-sdk/keyed-async-queueUporządkowana kolejka asynchronicznaKeyedAsyncQueue
plugin-sdk/media-runtimeWspółdzieleni pomocnicy mediówPomocnicy pobierania/przekształcania/przechowywania mediów, sondowanie wymiarów wideo oparte na ffprobe oraz konstruktory payloadów mediów
plugin-sdk/media-generation-runtimeWspółdzieleni pomocnicy generowania mediówWspółdzieleni pomocnicy przełączania awaryjnego, wyboru kandydatów i komunikatów o brakującym modelu dla generowania obrazów/wideo/muzyki
plugin-sdk/media-understandingPomocnicy rozumienia mediówTypy dostawców rozumienia mediów oraz eksporty pomocników obrazów/audio dla dostawców
plugin-sdk/text-runtimePrzestarzały szeroki eksport zgodności tekstuUżyj string-coerce-runtime, text-chunking, text-utility-runtime i logging-core
plugin-sdk/text-chunkingPomocnicy dzielenia tekstu na fragmentyPomocnik dzielenia tekstu wychodzącego na fragmenty
plugin-sdk/speechPomocnicy mowyTypy dostawców mowy oraz pomocnicy dyrektyw, rejestru i walidacji dla dostawców, a także konstruktor TTS zgodny z OpenAI
plugin-sdk/speech-coreWspółdzielony rdzeń mowyTypy dostawców mowy, rejestr, dyrektywy, normalizacja
plugin-sdk/realtime-transcriptionPomocnicy transkrypcji w czasie rzeczywistymTypy dostawców, pomocnicy rejestru i współdzielony pomocnik sesji WebSocket
plugin-sdk/realtime-voicePomocnicy głosu w czasie rzeczywistymTypy dostawców, pomocnicy rejestru/rozwiązywania, pomocnicy sesji mostka, współdzielone kolejki mowy zwrotnej agenta, sterowanie głosem aktywnego uruchomienia, kondycja transkryptu/zdarzeń, tłumienie echa, dopasowywanie pytań konsultacyjnych, koordynacja wymuszonej konsultacji, śledzenie kontekstu tury, śledzenie aktywności wyjścia i pomocnicy szybkiej konsultacji kontekstu
plugin-sdk/image-generationPomocnicy generowania obrazówTypy dostawców generowania obrazów oraz pomocnicy zasobów obrazów/adresów URL danych i konstruktor dostawcy obrazów zgodny z OpenAI
plugin-sdk/image-generation-coreWspółdzielony rdzeń generowania obrazówTypy generowania obrazów, przełączanie awaryjne, uwierzytelnianie i pomocnicy rejestru
plugin-sdk/music-generationPomocnicy generowania muzykiTypy dostawców/żądań/wyników generowania muzyki
plugin-sdk/music-generation-coreWspółdzielony rdzeń generowania muzykiTypy generowania muzyki, pomocnicy przełączania awaryjnego, wyszukiwanie dostawcy i parsowanie referencji modelu
plugin-sdk/video-generationPomocnicy generowania wideoTypy dostawców/żądań/wyników generowania wideo
plugin-sdk/video-generation-coreWspółdzielony rdzeń generowania wideoTypy generowania wideo, pomocnicy przełączania awaryjnego, wyszukiwanie dostawcy i parsowanie referencji modelu
plugin-sdk/interactive-runtimePomocnicy interaktywnych odpowiedziNormalizacja/redukcja payloadu interaktywnej odpowiedzi
plugin-sdk/channel-config-primitivesPrymitywy konfiguracji kanałuWąskie prymitywy schematu konfiguracji kanału
plugin-sdk/channel-config-writesPomocnicy zapisu konfiguracji kanałuPomocnicy autoryzacji zapisu konfiguracji kanału
plugin-sdk/channel-plugin-commonWspółdzielony prelude kanałuWspółdzielone eksporty prelude pluginu kanału
plugin-sdk/channel-statusPomocnicy statusu kanałuWspółdzieleni pomocnicy snapshotów/podsumowań statusu kanału
plugin-sdk/allowlist-config-editPomocnicy konfiguracji listy dozwolonychPomocnicy edycji/odczytu konfiguracji listy dozwolonych
plugin-sdk/group-accessPomocnicy dostępu grupowegoWspółdzieleni pomocnicy decyzji o dostępie grupowym
plugin-sdk/direct-dm, plugin-sdk/direct-dm-accessPrzestarzałe fasady zgodnościUżyj plugin-sdk/channel-inbound
plugin-sdk/direct-dm-guard-policyPomocnicy ochrony bezpośrednich DMWąscy pomocnicy zasad ochrony przed kryptografią
plugin-sdk/extension-sharedWspółdzieleni pomocnicy rozszerzeńPrymitywy pomocników pasywnego kanału/statusu i ambient proxy
plugin-sdk/webhook-targetsPomocnicy celów WebhookRejestr celów Webhook i pomocnicy instalacji tras
plugin-sdk/webhook-pathPrzestarzały alias ścieżki webhookaUżyj plugin-sdk/webhook-ingress
plugin-sdk/web-mediaWspółdzieleni pomocnicy mediów WWWPomocnicy ładowania mediów zdalnych/lokalnych
plugin-sdk/zodPrzestarzały reeksport zgodności ZodImportuj zod z zod bezpośrednio
plugin-sdk/memory-coreDołączani pomocnicy memory-corePowierzchnia pomocników menedżera/konfiguracji/plików/CLI pamięci
plugin-sdk/memory-core-engine-runtimeFasada runtime silnika pamięciFasada runtime indeksu/wyszukiwania pamięci
plugin-sdk/memory-core-host-embedding-registryRejestr embeddingów pamięciLekkie pomocniki rejestru dostawców embeddingów pamięci
plugin-sdk/memory-core-host-engine-foundationSilnik foundation hosta pamięciEksporty silnika foundation hosta pamięci
plugin-sdk/memory-core-host-engine-embeddingsSilnik embeddingów hosta pamięciKontrakty embeddingów pamięci, dostęp do rejestru, dostawca lokalny oraz ogólni pomocnicy batch/zdalni; konkretni dostawcy zdalni żyją w swoich pluginach właścicielskich
plugin-sdk/memory-core-host-engine-qmdSilnik QMD hosta pamięciEksporty silnika QMD hosta pamięci
plugin-sdk/memory-core-host-engine-storageSilnik storage hosta pamięciEksporty silnika storage hosta pamięci
plugin-sdk/memory-core-host-multimodalPomocnicy multimodalni hosta pamięciPomocnicy multimodalni hosta pamięci
plugin-sdk/memory-core-host-queryPomocnicy zapytań hosta pamięciPomocnicy zapytań hosta pamięci
plugin-sdk/memory-core-host-secretPomocnicy sekretów hosta pamięciPomocnicy sekretów hosta pamięci
plugin-sdk/memory-core-host-eventsPrzestarzały alias zdarzeń pamięciUżyj plugin-sdk/memory-host-events
plugin-sdk/memory-core-host-statusPomocnicy statusu hosta pamięciPomocnicy statusu hosta pamięci
plugin-sdk/memory-core-host-runtime-cliRuntime CLI hosta pamięciPomocnicy runtime CLI hosta pamięci
plugin-sdk/memory-core-host-runtime-coreRuntime rdzenia hosta pamięciPomocnicy runtime rdzenia hosta pamięci
plugin-sdk/memory-core-host-runtime-filesPomocnicy plików/runtime hosta pamięciPomocnicy plików/runtime hosta pamięci
plugin-sdk/memory-host-coreAlias runtime rdzenia hosta pamięciNeutralny względem dostawcy alias pomocników runtime rdzenia hosta pamięci
plugin-sdk/memory-host-eventsAlias dziennika zdarzeń hosta pamięciNeutralny względem dostawcy alias pomocników dziennika zdarzeń hosta pamięci
plugin-sdk/memory-host-filesPrzestarzały alias plików/runtime pamięciUżyj plugin-sdk/memory-core-host-runtime-files
plugin-sdk/memory-host-markdownPomocnicy zarządzanego MarkdownWspółdzieleni pomocnicy zarządzanego Markdown dla pluginów sąsiadujących z pamięcią
plugin-sdk/memory-host-searchFasada wyszukiwania Active MemoryLeniwa fasada runtime menedżera wyszukiwania Active Memory
plugin-sdk/memory-host-statusPrzestarzały alias statusu hosta pamięciUżyj plugin-sdk/memory-core-host-status
plugin-sdk/testingNarzędzia testowePrzestarzały repozytoryjny barrel zgodności; użyj ukierunkowanych repozytoryjnych podścieżek testowych, takich jak plugin-sdk/plugin-test-runtime, plugin-sdk/channel-test-helpers, plugin-sdk/channel-target-testing, plugin-sdk/test-env i plugin-sdk/test-fixtures
Ta tabela jest celowo wspólnym podzbiorem migracji, a nie pełną powierzchnią SDK. Inwentarz punktów wejścia kompilatora znajduje się w scripts/lib/plugin-sdk-entrypoints.json; eksporty pakietu są generowane z publicznego podzbioru. Zarezerwowane pomocnicze styki dla dołączonych plugins zostały wycofane z publicznej mapy eksportów SDK z wyjątkiem jawnie udokumentowanych fasad zgodności, takich jak przestarzały shim plugin-sdk/discord zachowany dla opublikowanego pakietu @openclaw/discord@2026.3.13. Pomocniki specyficzne dla właściciela znajdują się w pakiecie właścicielskiego plugin; wspólne zachowanie hosta powinno przechodzić przez ogólne kontrakty SDK, takie jak plugin-sdk/gateway-runtime, plugin-sdk/security-runtime i plugin-sdk/plugin-config-runtime. Użyj najwęższego importu pasującego do zadania. Jeśli nie możesz znaleźć eksportu, sprawdź źródło w src/plugin-sdk/ albo zapytaj maintainerów, który ogólny kontrakt powinien go posiadać.

Aktywne wycofania

Węższe wycofania, które mają zastosowanie w całym SDK plugin, kontrakcie providera, powierzchni runtime i manifeście. Każde z nich nadal działa dzisiaj, ale zostanie usunięte w przyszłej wersji major. Wpis pod każdym elementem mapuje stare API na jego kanoniczny zamiennik.
Stare (openclaw/plugin-sdk/command-auth): buildCommandsMessage, buildCommandsMessagePaginated, buildHelpMessage.Nowe (openclaw/plugin-sdk/command-status): te same sygnatury, te same eksporty - tylko importowane z węższej podścieżki. command-auth reeksportuje je jako stuby zgodności.
// Before
import { buildHelpMessage } from "openclaw/plugin-sdk/command-auth";

// After
import { buildHelpMessage } from "openclaw/plugin-sdk/command-status";
Stare: resolveInboundMentionRequirement({ facts, policy }) i shouldDropInboundForMention(...) z openclaw/plugin-sdk/channel-inbound albo openclaw/plugin-sdk/channel-mention-gating.Nowe: resolveInboundMentionDecision({ facts, policy }) - zwraca pojedynczy obiekt decyzji zamiast dwóch rozdzielonych wywołań.Niżej położone plugins kanałów (Slack, Discord, Matrix, MS Teams) już się przełączyły.
openclaw/plugin-sdk/channel-runtime to shim zgodności dla starszych plugins kanałów. Nie importuj go w nowym kodzie; użyj openclaw/plugin-sdk/channel-runtime-context do rejestrowania obiektów runtime.Pomocniki channelActions* w openclaw/plugin-sdk/channel-actions są przestarzałe wraz z surowymi eksportami kanału “actions”. Udostępniaj capabilities przez semantyczną powierzchnię presentation zamiast tego - plugins kanałów deklarują, co renderują (karty, przyciski, selecty), a nie które surowe nazwy akcji akceptują.
Stare: fabryka tool() z openclaw/plugin-sdk/provider-web-search.Nowe: zaimplementuj createTool(...) bezpośrednio w plugin providera. OpenClaw nie potrzebuje już pomocnika SDK do rejestrowania wrappera narzędzia.
Stare: formatInboundEnvelope(...) (i ChannelMessageForAgent.channelEnvelope) do budowania płaskiej koperty promptu w plaintext z przychodzących wiadomości kanału.Nowe: BodyForAgent oraz ustrukturyzowane bloki kontekstu użytkownika. Plugins kanałów dołączają metadane routingu (wątek, temat, odpowiedź-do, reakcje) jako typowane pola zamiast konkatenować je w ciąg promptu. Pomocnik formatAgentEnvelope(...) nadal jest obsługiwany dla syntetyzowanych kopert kierowanych do asystenta, ale przychodzące koperty w plaintext są wycofywane.Dotknięte obszary: inbound_claim, message_received i każdy niestandardowy plugin kanału, który przetwarzał tekst channelEnvelope po fakcie.
Stare: api.on("deactivate", handler).Nowe: api.on("gateway_stop", handler). Zdarzenie i kontekst są tym samym kontraktem sprzątania przy zamykaniu; zmienia się tylko nazwa hooka.
// Before
api.on("deactivate", async (event, ctx) => {
  await stopPluginService(ctx);
});

// After
api.on("gateway_stop", async (event, ctx) => {
  await stopPluginService(ctx);
});
deactivate pozostaje podłączone jako przestarzały alias zgodności do czasu po 2026-08-16.
Stare: api.on("subagent_spawning", handler) zwracające threadBindingReady albo deliveryOrigin.Nowe: pozwól core przygotować powiązania subagentów thread: true przez adapter powiązań sesji kanału. Używaj api.on("subagent_spawned", handler) wyłącznie do obserwacji po uruchomieniu.
// Before
api.on("subagent_spawning", async () => ({
  status: "ok",
  threadBindingReady: true,
  deliveryOrigin: { channel: "discord", to: "channel:123", threadId: "456" },
}));

// After
api.on("subagent_spawned", async (event) => {
  await observeSubagentLaunch(event);
});
subagent_spawning, PluginHookSubagentSpawningEvent, PluginHookSubagentSpawningResult i SubagentLifecycleHookRunner.runSubagentSpawning(...) pozostają wyłącznie jako przestarzałe powierzchnie zgodności, gdy zewnętrzne plugins migrują.
Cztery aliasy typów wykrywania są teraz cienkimi wrapperami wokół typów z ery katalogu:
Stary aliasNowy typ
ProviderDiscoveryOrderProviderCatalogOrder
ProviderDiscoveryContextProviderCatalogContext
ProviderDiscoveryResultProviderCatalogResult
ProviderPluginDiscoveryProviderPluginCatalog
Dodatkowo starszy statyczny zbiór ProviderCapabilities - plugins providerów powinny używać jawnych hooków providera, takich jak buildReplayPolicy, normalizeToolSchemas i wrapStreamFn, zamiast statycznego obiektu.
Stare (trzy osobne hooki w ProviderThinkingPolicy): isBinaryThinking(ctx), supportsXHighThinking(ctx) i resolveDefaultThinkingLevel(ctx).Nowe: pojedyncze resolveThinkingProfile(ctx), które zwraca ProviderThinkingProfile z kanonicznym id, opcjonalnym label i rankingowaną listą poziomów. OpenClaw automatycznie obniża nieaktualne zapisane wartości według rangi profilu.Kontekst obejmuje provider, modelId, opcjonalnie scalone reasoning oraz opcjonalnie scalone fakty compat modelu. Plugins providerów mogą używać tych faktów katalogu, aby ujawniać profil specyficzny dla modelu tylko wtedy, gdy skonfigurowany kontrakt żądania go obsługuje.Zaimplementuj jeden hook zamiast trzech. Starsze hooki nadal działają w oknie wycofywania, ale nie są komponowane z wynikiem profilu.
Stare: implementowanie zewnętrznych hooków uwierzytelniania bez deklarowania providera w manifeście plugin.Nowe: zadeklaruj contracts.externalAuthProviders w manifeście plugin oraz zaimplementuj resolveExternalAuthProfiles(...).
{
  "contracts": {
    "externalAuthProviders": ["anthropic", "openai"]
  }
}
Stare pole manifestu: providerAuthEnvVars: { anthropic: ["ANTHROPIC_API_KEY"] }.Nowe: odzwierciedl to samo wyszukiwanie zmiennych env w setup.providers[].envVars w manifeście. Konsoliduje to metadane env dla setup/status w jednym miejscu i unika uruchamiania runtime plugin tylko po to, aby odpowiedzieć na zapytania o zmienne env.providerAuthEnvVars pozostaje obsługiwane przez adapter zgodności, dopóki okno wycofywania się nie zamknie.
Stare: trzy osobne wywołania - api.registerMemoryPromptSection(...), api.registerMemoryFlushPlan(...), api.registerMemoryRuntime(...).Nowe: jedno wywołanie w API memory-state - registerMemoryCapability(pluginId, { promptBuilder, flushPlanResolver, runtime }).Te same sloty, pojedyncze wywołanie rejestracji. Addytywne pomocniki promptu i korpusu (registerMemoryPromptSupplement, registerMemoryCorpusSupplement) nie są dotknięte.
Stare: api.registerMemoryEmbeddingProvider(...) plus contracts.memoryEmbeddingProviders.Nowe: api.registerEmbeddingProvider(...) plus contracts.embeddingProviders.Ogólny kontrakt providera embeddingów jest wielokrotnego użytku poza pamięcią i stanowi obsługiwaną ścieżkę dla nowych providerów. Specyficzne dla pamięci API rejestracji pozostaje podłączone jako przestarzała zgodność, gdy istniejący providerzy migrują. Inspekcja plugin zgłasza użycie poza dołączonymi plugins jako dług zgodności.
Dwa starsze aliasy typów nadal eksportowane z src/plugins/runtime/types.ts:
StareNowe
SubagentReadSessionParamsSubagentGetSessionMessagesParams
SubagentReadSessionResultSubagentGetSessionMessagesResult
Metoda runtime readSession jest przestarzała na rzecz getSessionMessages. Ta sama sygnatura; stara metoda wywołuje nową.
Stare: runtime.tasks.flow (liczba pojedyncza) zwracało aktywny akcesor przepływu zadań.Nowe: runtime.tasks.managedFlows utrzymuje zarządzany runtime mutacji TaskFlow dla plugins, które tworzą, aktualizują, anulują lub uruchamiają zadania podrzędne z przepływu. Użyj runtime.tasks.flows, gdy plugin potrzebuje tylko odczytów opartych na DTO.
// Before
const flow = api.runtime.tasks.flow.fromToolContext(ctx);
// After
const flow = api.runtime.tasks.managedFlows.fromToolContext(ctx);
Omówiono powyżej w sekcji “Jak migrować → Migrowanie osadzonych rozszerzeń wyników narzędzi do middleware”. Uwzględniono tutaj dla kompletności: usunięta ścieżka api.registerEmbeddedExtensionFactory(...) dostępna tylko dla osadzonego runnera została zastąpiona przez api.registerAgentToolResultMiddleware(...) z jawną listą runtime w contracts.agentToolResultMiddleware.
OpenClawSchemaType reeksportowany z openclaw/plugin-sdk jest teraz jednowierszowym aliasem dla OpenClawConfig. Preferuj kanoniczną nazwę.
// Before
import type { OpenClawSchemaType } from "openclaw/plugin-sdk";
// After
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-schema";
Wycofania na poziomie rozszerzeń (wewnątrz dołączonych plugins kanałów/providerów pod extensions/) są śledzone w ich własnych barrelach api.ts i runtime-api.ts. Nie wpływają one na kontrakty plugins firm trzecich i nie są tutaj wymienione. Jeśli korzystasz bezpośrednio z lokalnego barrela dołączonego plugin, przeczytaj komentarze o wycofaniach w tym barrelu przed aktualizacją.

Harmonogram usuwania

KiedyCo się dzieje
TerazPrzestarzałe powierzchnie emitują ostrzeżenia w czasie działania
Następne wydanie głównePrzestarzałe powierzchnie zostaną usunięte; pluginy, które nadal ich używają, przestaną działać
Wszystkie pluginy rdzeniowe zostały już zmigrowane. Zewnętrzne pluginy powinny przeprowadzić migrację przed następnym wydaniem głównym.

Tymczasowe wyciszanie ostrzeżeń

Ustaw te zmienne środowiskowe podczas pracy nad migracją:
OPENCLAW_SUPPRESS_PLUGIN_SDK_COMPAT_WARNING=1 openclaw gateway run
OPENCLAW_SUPPRESS_EXTENSION_API_WARNING=1 openclaw gateway run
To tymczasowa furtka awaryjna, nie trwałe rozwiązanie.

Powiązane