Plugin maintainer reference
Plugin-SDK-Migration
OpenClaw hat eine umfassende Abwärtskompatibilitätsschicht durch eine moderne Plugin- Architektur ersetzt, die aus kleinen, fokussierten Imports aufgebaut ist. Wenn Ihr Plugin vor dieser Änderung entstand, führt dieser Leitfaden es zu den aktuellen Verträgen über.
Was sich geändert hat
Mehrere sehr weit gefasste Import-Oberflächen ermöglichten Plugins früher den Zugriff auf fast alles über einen einzigen Einstiegspunkt:
openclaw/plugin-sdkundopenclaw/plugin-sdk/compat– exportierten Dutzende Hilfsfunktionen erneut, während das fokussierte SDK entwickelt wurde. Beide Wurzeln wurden inzwischen entfernt; importieren Sie stattdessen einen dokumentierten Unterpfad.openclaw/plugin-sdk/infra-runtime– ein umfassendes Barrel, das System- ereignisse, Heartbeat-Zustand, Zustellwarteschlangen, Fetch-/Proxy-Hilfsfunktionen, Dateihilfen, Genehmigungstypen und nicht zusammengehörige Dienstprogramme vermischte.openclaw/plugin-sdk/config-runtime– ein umfassendes Konfigurations-Barrel, das nur für sein späteres Kompatibilitätsfenster beibehalten wurde; direkte Hilfsfunktionen zum Laden und Schreiben zur Laufzeit wurden entfernt.openclaw/extension-api– eine entfernte Brücke, die Plugins direkten Zugriff auf hostseitige Hilfsfunktionen wie den eingebetteten Agent-Runner gewährte.api.registerEmbeddedExtensionFactory(...)– ein entfernter, ausschließlich für den eingebetteten Runner bestimmter Hook, der Ereignisse des eingebetteten Runners wietool_resultbeobachtete. Verwenden Sie stattdessen Middleware für Agent- Werkzeugergebnisse (siehe Erweiterungen für eingebettete Werkzeugergebnisse zu Middleware migrieren).
Das SDK-Stammverzeichnis, das Kompatibilitäts-Barrel, die Erweiterungsbrücke und die Factory
für eingebettete Erweiterungen wurden entfernt. infra-runtime und config-runtime bleiben nur für ihre
separat dokumentierten späteren Zeitfenster bestehen; neue Plugins sollten fokussierte Unterpfade verwenden.
OpenClaw entfernt oder interpretiert dokumentiertes Plugin-Verhalten nicht in derselben Änderung neu, die einen Ersatz einführt. Inkompatible Vertragsänderungen durchlaufen zunächst einen Kompatibilitätsadapter, Diagnosen, Dokumentation und ein Veraltungszeitfenster. Das gilt für SDK-Imports, Manifestfelder, Einrichtungs-APIs, Hooks und das Registrierungsverhalten zur Laufzeit.
Warum
- Langsamer Start – der Import einer Hilfsfunktion lud Dutzende nicht zusammengehöriger Module.
- Zirkuläre Abhängigkeiten – umfassende Re-Exporte erleichterten das Erzeugen von Importzyklen.
- Unklare API-Oberfläche – stabile Exporte ließen sich nicht von internen unterscheiden.
Jedes openclaw/plugin-sdk/<subpath> ist jetzt ein kleines, eigenständiges Modul mit
einem dokumentierten Vertrag.
Auch ältere Provider-Komfortschnittstellen für gebündelte Kanäle wurden entfernt –
kanalspezifische Hilfsabkürzungen waren private Annehmlichkeiten des Mono-Repos und keine
stabilen Plugin-Verträge. Verwenden Sie stattdessen schmale, generische SDK-Unterpfade. Behalten Sie
innerhalb des Arbeitsbereichs gebündelter Plugins Provider-eigene Hilfsfunktionen im jeweiligen
api.ts oder runtime-api.ts dieses Plugins:
- Anthropic behält Claude-spezifische Stream-Hilfsfunktionen in seiner eigenen
api.ts- /contract-api.ts-Schnittstelle. - OpenAI behält Provider-Builder, Hilfsfunktionen für Standardmodelle und Builder für Echtzeit-Provider
in seinem eigenen
api.ts. - OpenRouter behält den Provider-Builder und Hilfsfunktionen für Onboarding und Konfiguration in seinem eigenen
api.ts.
Kompatibilitätsrichtlinie
Kompatibilitätsarbeiten für externe Plugins erfolgen in dieser Reihenfolge:
- Fügen Sie den neuen Vertrag hinzu.
- Erhalten Sie das alte Verhalten über einen Kompatibilitätsadapter.
- Geben Sie eine Diagnose oder Warnung aus, die den alten Pfad und seinen Ersatz nennt.
- Decken Sie beide Pfade mit Tests ab.
- Dokumentieren Sie die Veraltung und den Migrationspfad.
- Entfernen Sie den alten Pfad erst nach dem angekündigten Migrationszeitraum, üblicherweise in einem Major- Release.
Wenn ein Manifestfeld weiterhin akzeptiert wird, verwenden Sie es weiter, bis Dokumentation und Diagnosen etwas anderes angeben. Neuer Code sollte den dokumentierten Ersatz bevorzugen; bestehende Plugins dürfen bei gewöhnlichen Minor-Releases nicht ausfallen.
Kompatibilität der Einrichtung veröffentlichter Kanäle
Über 2026.7.1 veröffentlichte Pakete für Slack, Discord, Signal und Microsoft Teams
importieren kanalspezifische Konfigurationsschemas aus
openclaw/plugin-sdk/bundled-channel-config-schema. Die veröffentlichten Pakete für Slack und
Discord importieren außerdem createLegacyCompatChannelDmPolicy und
promptLegacyChannelAllowFromForAccount aus
openclaw/plugin-sdk/setup-runtime.
Diese Exporte bleiben als veraltete Kompatibilitätsadapter zur Laufzeit verfügbar.
Neue und erneut veröffentlichte Plugins sollten ihre Konfigurationsschemas und Einrichtungsrichtlinien
lokal verwalten und dafür generische Primitive aus channel-config-schema und
setup-runtime verwenden. Die Kompatibilitätsexporte dürfen erst entfernt werden, wenn die
unterstützten Mindestversionen der veröffentlichten Pakete sie nicht mehr importieren.
Kompatibilität der Eingabefelder für die Kanaleinrichtung
ChannelSetupInput behält jetzt dauerhaft nur noch den kanalübergreifenden Einrichtungsrahmen
typisiert. Kanalspezifische Felder bleiben in einer veralteten Kompatibilitäts-
ebene typisiert, damit vorhandene externe Plugins weiterhin kompiliert werden, während Plugin-Autoren diese
Felder in Plugin-lokale Eingabetypen für die Einrichtung verschieben.
OpenClaw veröffentlicht keine Major-Releases. Eine Registry-Prüfung vom 2026-07-22 untersuchte 426 veröffentlichte, außerhalb des Repositorys verwaltete Kanal-Plugins und entfernte 21 Felder ohne Leser. Die 22 beibehaltenen Felder haben jeweils einen bekannten veröffentlichten Leser. Jedes weitere Feld wird gelöscht, sobald es von keinem veröffentlichten Plugin mehr gelesen wird; die beibehaltene Menge schrumpft, während Plugin-Autoren zu Plugin-lokalen Eingabetypen für die Einrichtung migrieren.
Dieselbe Prüfung entfernte 23 ältere, nicht deklarierte Schlüssel für die Adapter-Hochstufung ohne
veröffentlichte Abhängige. Sechs gebräuchliche Schlüssel und der nur für die Einrichtung bestimmte Schlüssel rooms bleiben bestehen.
Auch diese Menge schrumpft, während veröffentlichte Plugins singleAccountKeysToMove deklarieren.
Der gemeinsame Typ besitzt keine Indexsignatur. Plugin-eigene Schlüssel können weiterhin in Eingabeobjekten zur Laufzeit vorhanden sein; deklarieren Sie sie in einer Plugin-lokalen Schnittmenge oder grenzen Sie sie über das Einrichtungsschema des zuständigen Plugins ein.
code |
owner |
replacement |
Bedingung für die Entfernung |
|---|---|---|---|
plugin-sdk-channel-setup-input-fields |
channel |
Bilden Sie eine Schnittmenge aus ChannelSetupInput und einem Plugin-lokalen Typ, der die Felder des zuständigen Kanals deklariert |
Löschen Sie ein Feld, wenn die Registry-Prüfung veröffentlichter Plugins keinen Leser findet |
Die ältere Ebene zur Hochstufung nicht deklarierter Adapter folgt derselben
lesergesteuerten Richtlinie. Deklarieren Sie singleAccountKeysToMove, einschließlich eines leeren Arrays, wenn das
Plugin keine zusätzlichen Hochstufungsschlüssel benötigt, damit der gemeinsame Fallback Schlüssel für
Schlüssel außer Betrieb genommen werden kann.
Leser überprüfen
- Blättern Sie mit jedem
nextCursordurchhttps://clawhub.ai/api/v1/packages?family=code-plugin&limit=100und behalten Sie Pakete bei, derencategorieschannelsenthalten. - Fügen Sie npm-Kandidaten aus
npm search --json --searchlimit=1000 "openclaw channel plugin"hinzu. Fügen Sie reine Quellcode-Kandidaten aus GitHub-Codesuchen nachopenclaw/plugin-sdk/channel-setup,openclaw/plugin-sdk/setupundopenclaw/plugin-sdk/corehinzu. - Ermitteln Sie für jeden Kandidaten die neueste veröffentlichte Version. Führen Sie
npm pack <package>@<version> --json --pack-destination <temp-dir>aus, entpacken Sie sie und untersuchen Sie den ausgeliefertendist-JavaScript-Code und die Deklarationen auf direkte oder destrukturierte Feldzugriffe. Laden Sie das ClawHub-Artefakt herunter, wenn ein Paket keine npm-Veröffentlichung besitzt. - Erfassen Sie Paket, Version, Feld oder Hochstufungsschlüssel und die übereinstimmende Datei. Ein Feld oder Schlüssel darf nur gelöscht werden, wenn kein veröffentlichtes Plugin-Artefakt darauf zugreift. Halten Sie die Lesernamen in den Codekommentaren neben den Listen der beibehaltenen Felder und Schlüssel mit der Prüfung synchron.
Dies ist ausschließlich ein Kompatibilitätsdatensatz für Quellcode und Typen. Er besitzt keinen Adapter zur Laufzeit und keinen Eintrag in der Kompatibilitäts-Registry, da Eingabeobjekte für die Einrichtung und das Einrichtungs- verhalten zur Laufzeit unverändert bleiben.
Prüfen Sie die aktuelle Migrationswarteschlange mit pnpm plugins:boundary-report:
| Flag | Wirkung |
|---|---|
--summary (oder pnpm plugins:boundary-report:summary) |
Kompakte Anzahlen statt vollständiger Details. |
--json |
Maschinenlesbarer Bericht. |
--owner <id> |
Auf ein Plugin oder einen Kompatibilitätsverantwortlichen filtern. |
--fail-on-cross-owner |
Bei reservierten SDK-Imports über Verantwortlichkeitsgrenzen hinweg mit einem Exit-Code ungleich null beenden. |
--fail-on-eligible-compat |
Mit einem Exit-Code ungleich null beenden, wenn das Datum removeAfter eines veralteten Kompatibilitätsdatensatzes überschritten wurde. |
--fail-on-unclassified-unused-reserved |
Bei ungenutzten reservierten SDK-Shims mit einem Exit-Code ungleich null beenden. |
pnpm plugins:boundary-report:ci wird mit allen drei Fehler-Flags ausgeführt. Veraltete
Datensätze besitzen normalerweise ein ausdrückliches Datum removeAfter statt eines vagen „nächsten
Major-Releases“. Bei einem Datensatz, dessen Verantwortlicher noch kein Datum genehmigt hat, fehlt
removeAfter; er erscheint als no-date und kann niemals entfernt werden.
Der Bericht gruppiert veraltete Datensätze nach Datum, zählt lokale Code-/Dokumentationsreferenzen,
zeigt reservierte SDK-Imports über Verantwortlichkeitsgrenzen hinweg an und fasst die private
SDK-Brücke des Speicher-Hosts zusammen. Reservierte SDK-Unterpfade müssen eine nachverfolgte Nutzung durch den Verantwortlichen aufweisen;
ungenutzte reservierte Exporte sollten aus dem öffentlichen SDK entfernt werden.
Veraltete Medienprojektion
Der Kompatibilitätsdatensatz media-legacy-projection deckt die alten parallelen
Medienfelder, Payload-Builder, Metadatenaliase für Hooks und Namen von Medienvorlagen
ab. Das genehmigte Datum removeAfter ist 2026-10-01 (zwei Release-Zyklen,
nachdem die Facts-First-Ersatzlösungen ausgeliefert wurden). Die Entfernung erfordert zu diesem Zeitpunkt zusätzlich eine
saubere Prüfung veröffentlichter Plugin-Artefakte; migrieren Sie vor diesem Datum.
Ersetzen Sie für den Kanaleingang die Singular-/Pluralformen MediaPath, MediaUrl,
MediaType, MediaPaths, MediaUrls, MediaTypes,
MediaTranscribedIndexes, MediaWorkspaceDir und MediaStaged durch geordnete
Fakten:
const media = toInboundMediaFacts([ { path: saved.path, url: nativeUrl, contentType: saved.contentType, messageId },]); const ctx = finalizeInboundContext({ Body: caption, media });Verwenden Sie event.media in den Hooks inbound_claim und message_received. Wenn entfernte
Medien nicht lokal bereitgestellt wurden, verwenden Sie event.originalMedia für Identität und Diagnosen
und warten Sie auf event.media; event.mediaStagingPending kennzeichnet diesen
Zustand. Lesen Sie die veralteten Singular-/Plural-Eigenschaften nicht aus
event.metadata.
Ersetzen Sie für CLI-Medienmodelle {{MediaPath}}, {{MediaUrl}}, {{MediaType}}
und {{MediaDir}} durch {{AttachmentPath}}, {{AttachmentUrl}},
{{AttachmentContentType}} und {{AttachmentDir}}. Verwenden Sie
{{AttachmentIndex}}, wenn die Position des Anhangs relevant ist.
Importieren Sie für die Richtlinie zum Lesen lokaler Medien getAgentScopedMediaLocalRoots(...) oder
getAgentScopedMediaLocalRootsForSources(...) aus
openclaw/plugin-sdk/media-local-roots. Die
openclaw/plugin-sdk/agent-media-payload-Fassade und ihre
buildAgentMediaPayload(...)-Projektion sind veraltet.
Migration
Hilfsfunktionen zum Laden/Schreiben der Laufzeitkonfiguration migrieren
Gebündelte Plugins sollten api.runtime.config.loadConfig() und
api.runtime.config.writeConfigFile(...) nicht mehr direkt aufrufen. Bevorzugen Sie die Konfiguration, die bereits
an den aktiven Aufrufpfad übergeben wurde. Langlebige Handler, die den
aktuellen Prozess-Snapshot benötigen, können api.runtime.config.current() verwenden. Langlebige
Agent-Werkzeuge sollten ctx.getRuntimeConfig() innerhalb von execute lesen, damit ein Werkzeug,
das vor dem Schreiben einer Konfiguration erstellt wurde, dennoch die aktualisierte Konfiguration sieht.
Konfigurationsschreibvorgänge erfolgen über die transaktionale Hilfsfunktion mit einer ausdrücklichen Richtlinie für die Zeit nach dem Schreiben:
await api.runtime.config.mutateConfigFile({ afterWrite: { mode: "auto" }, mutate(draft) { draft.plugins ??= {}; },});Verwenden Sie afterWrite: { mode: "restart", reason: "..." }, wenn die Änderung
einen sauberen Neustart des Gateways erfordert, und afterWrite: { mode: "none", reason: "..." }
nur, wenn der Aufrufer für die Nachbereitung verantwortlich ist und den
Neuladungsplaner bewusst unterdrückt. Mutationsergebnisse enthalten eine typisierte Zusammenfassung followUp für
Tests und Protokollierung; das Gateway bleibt für die Durchführung oder
Planung des Neustarts verantwortlich.
loadConfig und writeConfigFile wurden aus der Plugin-
Laufzeit entfernt. Gebündelte Plugins und Laufzeitcode des Repositorys werden durch
pnpm check:deprecated-api-usage und
pnpm check:no-runtime-action-load-config geschützt: Neue Verwendung in
produktivem Plugin-Code schlägt sofort fehl, direkte Konfigurationsschreibvorgänge schlagen fehl, Gateway-Servermethoden müssen
den Laufzeit-Snapshot der Anfrage verwenden, Laufzeit-Hilfsfunktionen für das Senden, Aktionen und Clients von Kanälen
müssen die Konfiguration von ihrer Schnittstellengrenze erhalten, und langlebige Laufzeitmodule
erlauben keine umgebungsbezogenen Aufrufe von loadConfig().
Neuer Plugin-Code sollte das allgemeine Barrel openclaw/plugin-sdk/config-runtime
vermeiden. Verwenden Sie den spezifischen Unterpfad für die jeweilige Aufgabe:
| Bedarf | Import |
|---|---|
Konfigurationstypen wie OpenClawConfig |
openclaw/plugin-sdk/config-contracts |
| Konfigurationssuche am Plugin-Einstiegspunkt | api.pluginConfig |
| Zusammenführen von Konfigurationen | Plugin-lokale Logik an der Konfigurationsgrenze |
| Lesen des aktuellen Laufzeit-Snapshots | openclaw/plugin-sdk/runtime-config-snapshot |
| Konfigurationsschreibvorgänge | openclaw/plugin-sdk/config-mutation |
| Hilfsfunktionen für den Sitzungsspeicher | openclaw/plugin-sdk/session-store-runtime |
| Markdown-Tabellenkonfiguration | openclaw/plugin-sdk/markdown-table-runtime |
| Laufzeit-Hilfsfunktionen für Gruppenrichtlinien | openclaw/plugin-sdk/runtime-group-policy |
| Auflösung geheimer Eingaben | openclaw/plugin-sdk/secret-input-runtime |
| Modell-/Sitzungsüberschreibungen | openclaw/plugin-sdk/model-session-runtime |
Gebündelte Plugins und ihre Tests werden per Scanner gegen das allgemeine Barrel geschützt, damit Importe und Mocks lokal auf das benötigte Verhalten beschränkt bleiben. Das Barrel besteht für externe Kompatibilität weiterhin, neuer Code sollte jedoch nicht davon abhängen.
Eingebettete Erweiterungen für Werkzeugergebnisse auf Middleware migrieren
Gebündelte Plugins müssen die ausschließlich für eingebettete Runner vorgesehenen
Handler für Werkzeugergebnisse api.registerEmbeddedExtensionFactory(...) durch
laufzeitneutrale Middleware ersetzen:
// OpenClaw-Laufzeitwerkzeuge und dynamische Werkzeuge der Codex-Laufzeit (das Ergebnis kann// transformiert werden). Ergebnisse nativer Codex-Werkzeuge werden zur Beobachtung ebenfalls weitergeleitet,// ihre transformierte Ausgabe erreicht das Modell jedoch nie: Der Vertrag des Codex-// PostToolUse-Hooks kann die Antwort eines nativen Werkzeugs nicht ersetzen.api.registerAgentToolResultMiddleware(async (event) => { return compactToolResult(event);}, { runtimes: ["openclaw", "codex"],});Aktualisieren Sie gleichzeitig das Plugin-Manifest:
{ "contracts": { "agentToolResultMiddleware": ["openclaw", "codex"] }}Installierte Plugins können ebenfalls Middleware für Werkzeugergebnisse registrieren, wenn sie ausdrücklich
aktiviert ist und jede Ziel-Laufzeit in
contracts.agentToolResultMiddleware deklariert ist. Nicht deklarierte Middleware-
Registrierungen installierter Plugins werden abgelehnt.
Native Genehmigungshandler auf Fähigkeitsfakten migrieren
Genehmigungsfähige Kanal-Plugins stellen natives Genehmigungsverhalten über
approvalCapability.nativeRuntime sowie die gemeinsame Registry für den Laufzeitkontext
bereit:
- Ersetzen Sie
approvalCapability.handler.loadRuntime(...)durchapprovalCapability.nativeRuntime. - Verlagern Sie genehmigungsspezifische Authentifizierung/Zustellung von der veralteten Verkabelung
plugin.auth/plugin.approvalszuapprovalCapability. ChannelPlugin.approvalswurde aus dem öffentlichen Vertrag für Kanal-Plugins entfernt; verschieben Sie Felder für Zustellung, native Funktionen und Rendering nachapprovalCapability.plugin.authbleibt ausschließlich für Anmelde-/Abmeldeabläufe von Kanälen bestehen; der Kern liest dort keine Genehmigungs-Authentifizierungs-Hooks mehr.- Registrieren Sie kanaleigene Laufzeitobjekte (Clients, Tokens, Bolt-Apps)
über
openclaw/plugin-sdk/channel-runtime-context. - Senden Sie aus nativen Genehmigungshandlern keine Plugin-eigenen Hinweise zur Umleitung; der Kern ist anhand der tatsächlichen Zustellungsergebnisse für Hinweise über anderweitige Weiterleitung verantwortlich.
- Wenn Sie
channelRuntimeancreateChannelManager(...)übergeben, stellen Sie eine echte OberflächecreatePluginRuntime().channelbereit – partielle Stubs werden abgelehnt.
Informationen zum aktuellen Aufbau der Genehmigungsfähigkeiten finden Sie unter Kanal-Plugins.
Fallback-Verhalten von Windows-Wrappern prüfen
Wenn Ihr Plugin openclaw/plugin-sdk/windows-spawn verwendet, schlagen nicht aufgelöste Windows-
Wrapper .cmd/.bat nun geschlossen fehl, sofern Sie nicht ausdrücklich
allowShellFallback: true übergeben:
// Vorherconst program = applyWindowsSpawnProgramPolicy({ candidate }); // Nachherconst program = applyWindowsSpawnProgramPolicy({ candidate, // Legen Sie dies nur für vertrauenswürdige Kompatibilitätsaufrufer fest, die einen // über die Shell vermittelten Fallback bewusst akzeptieren. allowShellFallback: true,});Wenn Ihr Aufrufer nicht bewusst auf den Shell-Fallback angewiesen ist, setzen Sie
allowShellFallback nicht und behandeln Sie stattdessen den ausgelösten Fehler.
Veraltete Importe finden
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/Durch gezielte Importe ersetzen
Jeder Export der alten Oberfläche ist einem bestimmten modernen Importpfad zugeordnet:
// Vorher (veraltete Abwärtskompatibilitätsschicht)import { createChannelReplyPipeline, createPluginRuntimeStore, resolveControlCommandGate,} from "openclaw/plugin-sdk/compat"; // Nachher (moderne gezielte Importe)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";Verwenden Sie für hostseitige Hilfsfunktionen die injizierte Plugin-Laufzeit, statt direkt zu importieren:
// Vorher (veraltete extension-api-Brücke)import { runEmbeddedAgent } from "openclaw/extension-api";const result = await runEmbeddedAgent({ sessionId, prompt }); // Nachher (injizierte Laufzeit)const result = await api.runtime.agent.runEmbeddedAgent({ sessionId, prompt });Dasselbe Muster gilt für andere veraltete Brücken-Hilfsfunktionen:
| Alter Import | Modernes Äquivalent |
|---|---|
resolveAgentDir |
api.runtime.agent.resolveAgentDir |
resolveAgentWorkspaceDir |
api.runtime.agent.resolveAgentWorkspaceDir |
resolveAgentIdentity |
api.runtime.agent.resolveAgentIdentity |
resolveThinkingDefault |
api.runtime.agent.resolveThinkingDefault |
resolveAgentTimeoutMs |
api.runtime.agent.resolveAgentTimeoutMs |
ensureAgentWorkspace |
api.runtime.agent.ensureAgentWorkspace |
| Hilfsfunktionen für den Sitzungsspeicher | api.runtime.agent.session.* |
Allgemeine infra-runtime-Importe ersetzen
openclaw/plugin-sdk/infra-runtime besteht für externe
Kompatibilität weiterhin, neuer Code sollte jedoch die tatsächlich benötigte spezifische Oberfläche
importieren:
| Bedarf | Import |
|---|---|
| Hilfsfunktionen für die Systemereigniswarteschlange | openclaw/plugin-sdk/system-event-runtime |
| Hilfsfunktionen für Aktivierung, Ereignisse und Sichtbarkeit von Heartbeat | openclaw/plugin-sdk/heartbeat-runtime |
| Abarbeitung der Warteschlange ausstehender Zustellungen | openclaw/plugin-sdk/delivery-queue-runtime |
| Telemetrie der Kanalaktivität | openclaw/plugin-sdk/channel-activity-runtime |
| Speicherinterne und persistent gestützte Deduplizierungs-Caches | openclaw/plugin-sdk/dedupe-runtime |
| Sichere Hilfsfunktionen für lokale Datei-/Medienpfade | openclaw/plugin-sdk/file-access-runtime |
| Dispatcher-berücksichtigender Abruf | openclaw/plugin-sdk/runtime-fetch |
| Hilfsfunktionen für Proxy- und geschützte Abrufe | openclaw/plugin-sdk/fetch-runtime |
| Typen für SSRF-Dispatcher-Richtlinien | openclaw/plugin-sdk/ssrf-dispatcher |
| Typen für Genehmigungsanfragen/-entscheidungen | openclaw/plugin-sdk/approval-runtime |
| Hilfsfunktionen für Nutzdaten und Befehle von Genehmigungsantworten | openclaw/plugin-sdk/approval-reply-runtime |
| Hilfsfunktionen zur Fehlerformatierung | openclaw/plugin-sdk/error-runtime |
| Warten auf Transportbereitschaft | openclaw/plugin-sdk/transport-ready-runtime |
| Hilfsfunktionen für sichere Tokens | openclaw/plugin-sdk/secure-random-runtime |
| Begrenzte Nebenläufigkeit asynchroner Aufgaben | openclaw/plugin-sdk/concurrency-runtime |
| Pflichtwertprüfungen für beweisbare Invarianten | openclaw/plugin-sdk/expect-runtime |
| Numerische Typumwandlung | openclaw/plugin-sdk/number-runtime |
| Prozesslokale asynchrone Sperre | openclaw/plugin-sdk/async-lock-runtime |
| Dateisperren | openclaw/plugin-sdk/file-lock |
Gebündelte Plugins werden per Scanner gegen infra-runtime geschützt, damit Repository-Code
nicht auf das allgemeine Barrel zurückfällt.
Hilfsfunktionen für Kanalrouten migrieren
Neuer Code für Kanalrouten verwendet openclaw/plugin-sdk/channel-route. Die älteren
Namen der Routenschlüssel bleiben als Kompatibilitätsaliase erhalten:
| Alte Hilfsfunktion | Moderne Hilfsfunktion |
|---|---|
channelRouteIdentityKey(...) |
channelRouteDedupeKey(...) |
channelRouteKey(...) |
channelRouteCompactKey(...) |
Die modernen Routen-Hilfsfunktionen normalisieren { channel, to, accountId, threadId }
konsistent für native Genehmigungen, Antwortunterdrückung, Deduplizierung eingehender Nachrichten,
Cron-Zustellung und Sitzungsrouting.
Fügen Sie keine neuen Verwendungen von ChannelMessagingAdapter.parseExplicitTarget oder
resolveChannelRouteTargetWithParser(...) aus
plugin-sdk/channel-route hinzu – diese sind veraltet und bleiben nur für ältere
Plugins erhalten. Neue Kanal-Plugins sollten
messaging.targetResolver.resolveTarget(...) für die Normalisierung von Ziel-IDs
und den Fallback bei fehlendem Verzeichniseintrag,
messaging.inferTargetChatType(...), wenn der Kern frühzeitig einen Peer-Typ benötigt,
und messaging.resolveOutboundSessionRoute(...) für Provider-native
Sitzungs- und Thread-Identitäten verwenden.
Erstellen und testen
pnpm buildpnpm test my-plugin/Referenz für Importpfade
Die öffentliche Exportzuordnung des Pakets ist die maßgebliche Quelle für importierbare SDK-
Unterpfade. Verwenden Sie die thematischen SDK-Leitfäden, die in der SDK-Übersicht
verlinkt sind, und bevorzugen Sie den spezifischsten dokumentierten öffentlichen Unterpfad. Das Compiler-Inventar in
scripts/lib/plugin-sdk-entrypoints.json enthält außerdem private lokale Einträge, die
zum Erstellen gebündelter Plugins verwendet werden; ihre dortige Präsenz macht sie nicht zu öffentlichen Paketexporten.
Diese Tabelle zeigt die übliche Teilmenge für Migrationen, nicht die vollständige SDK-Oberfläche. Das
Inventar der Compiler-Einstiegspunkte befindet sich in scripts/lib/plugin-sdk-entrypoints.json;
Paketexporte werden aus der öffentlichen Teilmenge generiert.
Reservierte Hilfsschnittstellen für gebündelte Plugins wurden aus der öffentlichen SDK-
Exportzuordnung entfernt, mit Ausnahme ausdrücklich dokumentierter Kompatibilitätsfassaden wie dem
veralteten Shim plugin-sdk/discord, das für externe Plugins beibehalten wird, die weiterhin
das veröffentlichte Paket @openclaw/discord direkt importieren. Eigentümerspezifische
Hilfsfunktionen befinden sich innerhalb des jeweils zuständigen Plugin-Pakets; gemeinsames Hostverhalten wird
über generische SDK-Verträge wie plugin-sdk/gateway-runtime,
plugin-sdk/security-runtime und die injizierte Plugin-API bereitgestellt.
Verwenden Sie den spezifischsten Import, der zur Aufgabe passt. Wenn Sie einen Export nicht finden können,
prüfen Sie den Quellcode unter src/plugin-sdk/ oder fragen Sie die Maintainer, welcher generische
Vertrag dafür zuständig sein sollte.
Entfernte Kompatibilitätsoberflächen
Bei der Bereinigung im Juli 2026 wurden das Stamm-SDK und die Compat-Barrels, die Extension-API- Brücke, die abgelaufenen SDK-Unterpfadaliase, ungenutzte SDK-Unterpfade und die öffentlichen Exporte für ausschließlich gebündelte SDK-Module entfernt. Ausschließlich gebündelte Module bleiben ihren Repository-Eigentümern über private lokale Build-Zuordnungen verfügbar; sie können nicht aus dem veröffentlichten Paket importiert werden.
Prozessglobale Veröffentlichung von API-Providern
registerApiProvider(...) und unregisterApiProviders(...) wurden aus
openclaw/plugin-sdk/llm entfernt. Sie veröffentlichten API-Transporte im prozessglobalen
Zustand, den lebenszyklusverwaltete Modelllaufzeiten anschließend in jede vorbereitete
Registry kopieren mussten.
Provider-Plugins sollten Textinferenz-Provider über
api.registerProvider(...) registrieren. Hosteigener Code und Tests, die eine
ApiRegistry erstellen, sollten direkt in dieser Registry registrieren, damit die Zuständigkeit für den Provider
und dessen Abbau auf die vorbereitete Laufzeit beschränkt bleiben.
Privates Testing-Barrel
openclaw/plugin-sdk/testing war Repository-lokal und von ausgelieferten Paketartefakten
ausgeschlossen, daher wurde es vor seinem removeAfter-Datum am 2026-07-28 entfernt. Repository-
Tests verwenden spezifische Unterpfade wie plugin-sdk/plugin-test-runtime,
plugin-sdk/channel-test-helpers, plugin-sdk/channel-target-testing,
plugin-sdk/test-env und plugin-sdk/test-fixtures.
Migrationsreferenz
Diese Zuordnungen decken sowohl die im Juli 2026 entfernten Oberflächen als auch die in späteren Zeitfenstern aktiven Veraltungen ab. Eine Zuordnung ist eine Migrationsanleitung und kein Nachweis dafür, dass die alte Oberfläche weiterhin verfügbar ist; den aktuellen Status finden Sie im Kompatibilitätsregister und im Zeitplan für Entfernungen.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJIaWxmc2Z1bmt0aW9uZW4gZsO8ciBjb21tYW5kLWF1dGgtSGlsZmUgLQ
command-status">
Alt (openclaw/plugin-sdk/command-auth): buildCommandsMessage,
buildCommandsMessagePaginated, buildHelpMessage.
Neu (openclaw/plugin-sdk/command-status): dieselben Signaturen, importiert
aus dem enger gefassten Unterpfad. Die Kompatibilitäts-Re-Exporte von command-auth
wurden entfernt.
// Vorherimport { buildHelpMessage } from "openclaw/plugin-sdk/command-auth"; // Nachherimport { buildHelpMessage } from "openclaw/plugin-sdk/command-status";OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJIaWxmc2Z1bmt0aW9uZW4gZsO8ciBNZW50aW9uLUdhdGluZyAt
resolveInboundMentionDecision">
Alt: resolveMentionGating(params) und
resolveMentionGatingWithBypass(params) aus
openclaw/plugin-sdk/channel-inbound oder
openclaw/plugin-sdk/channel-mention-gating.
Neu: resolveInboundMentionDecision({ facts, policy }) – ein Entscheidungsobjekt
anstelle zweier getrennter Aufrufformen.
Übernommen für Discord, iMessage, Matrix, MS Teams, QQBot, Signal,
Telegram, WhatsApp und Zalo. Slacks eigenes app_mention-Ereignismodell
verwendet diese Hilfsfunktion nicht.
Channel-Runtime-Shim und Hilfsfunktionen für Channel-Aktionen
openclaw/plugin-sdk/channel-runtime wurde entfernt. Verwenden Sie
openclaw/plugin-sdk/channel-runtime-context, um Runtime-Objekte zu registrieren.
Die nativen Hilfsfunktionen für Nachrichtenschemas in openclaw/plugin-sdk/channel-actions
wurden zusammen mit den unstrukturierten „actions“-Channel-Exporten entfernt. Stellen Sie Fähigkeiten
stattdessen über die semantische Oberfläche presentation bereit – Channel-Plugins
deklarieren, was sie darstellen (Karten, Schaltflächen, Auswahlelemente), statt welche unstrukturierten
Aktionsnamen sie akzeptieren.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJXZWJzdWNoLVByb3ZpZGVyLUhpbGZzZnVua3Rpb24gdG9vbCgpIC0
createTool() im Plugin">
Alt: tool()-Factory aus openclaw/plugin-sdk/provider-web-search.
Neu: Implementieren Sie createTool(...) direkt im Provider-Plugin.
OpenClaw benötigt die SDK-Hilfsfunktion nicht mehr, um den Tool-Wrapper zu registrieren.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJDaGFubmVsLVVtc2NobMOkZ2UgaW0gS2xhcnRleHQgLQ
BodyForAgent">
Alt: api.runtime.channel.reply.formatInboundEnvelope(...) (und das
Feld channelEnvelope bei eingehenden Nachrichtenobjekten), um aus eingehenden
Channel-Nachrichten einen flachen Prompt-Umschlag im Klartext zu erstellen.
Neu: BodyForAgent plus strukturierte Benutzerkontextblöcke. Channel-
Plugins fügen Routing-Metadaten (Thread, Thema, Antwortbezug, Reaktionen) als
typisierte Felder hinzu, statt sie zu einer Prompt-Zeichenfolge zusammenzufügen. Die
Hilfsfunktion formatAgentEnvelope(...) wird für synthetisch erzeugte,
an den Assistenten gerichtete Umschläge weiterhin unterstützt, eingehende Klartextumschläge werden jedoch
abgeschafft.
Betroffene Bereiche: inbound_claim, message_received und jedes benutzerdefinierte
Channel-Plugin, das den alten Umschlagtext nachverarbeitet hat.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJkZWFjdGl2YXRlLUhvb2sgLQ
gateway_stop">
Alt: api.on("deactivate", handler).
Neu: api.on("gateway_stop", handler). Derselbe Vertrag für die Bereinigung beim Herunterfahren;
nur der Hook-Name ändert sich.
// Vorherapi.on("deactivate", async (event, ctx) => { await stopPluginService(ctx);}); // Nachherapi.on("gateway_stop", async (event, ctx) => { await stopPluginService(ctx);});deactivate bleibt als veralteter Kompatibilitätsalias eingebunden, bis er
nach dem 2026-08-16 entfernt wird.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJzdWJhZ2VudF9zcGF3bmluZy1Ib29rIC0
Thread-Bindung im Kern">
Alt: api.on("subagent_spawning", handler), das
threadBindingReady oder deliveryOrigin zurückgibt.
Neu: Lassen Sie den Kern thread: true-Subagent-Bindungen über den
Adapter für Channel-Sitzungsbindungen vorbereiten. Verwenden Sie api.on("subagent_spawned", handler)
nur zur Beobachtung nach dem Start.
// Vorherapi.on("subagent_spawning", async () => ({ status: "ok", threadBindingReady: true, deliveryOrigin: { channel: "discord", to: "channel:123", threadId: "456" },})); // Nachherapi.on("subagent_spawned", async (event) => { await observeSubagentLaunch(event);});subagent_spawning, PluginHookSubagentSpawningEvent,
PluginHookSubagentSpawningResult und
SubagentLifecycleHookRunner.runSubagentSpawning(...) bleiben nur als
veraltete Kompatibilitätsoberflächen bestehen, während externe Plugins migrieren, und werden
nach dem 2026-08-30 entfernt.
"Provider-Ermittlungstypen
| Alter Alias | Neuer Typ |
|---|---|
ProviderDiscoveryOrder |
ProviderCatalogOrder |
ProviderDiscoveryContext |
ProviderCatalogContext |
ProviderDiscoveryResult |
ProviderCatalogResult |
ProviderPluginDiscovery |
ProviderPluginCatalog |
Die Aliasse und die veraltete statische Sammlung ProviderCapabilities wurden
entfernt. Provider-Plugins
sollten explizite Provider-Hooks wie buildReplayPolicy,
normalizeToolSchemas und wrapStreamFn statt eines statischen Objekts verwenden.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJIb29rcyBmw7xyIERlbmstUmljaHRsaW5pZW4gLQ
resolveThinkingProfile">
Alt (drei separate Hooks in ProviderThinkingPolicy):
isBinaryThinking(ctx), supportsXHighThinking(ctx) und
resolveDefaultThinkingLevel(ctx).
Neu: ein einzelnes resolveThinkingProfile(ctx), das ein
ProviderThinkingProfile mit dem kanonischen id, optionalem label und einer
nach Rang geordneten Stufenliste zurückgibt. OpenClaw stuft veraltete gespeicherte Werte automatisch
anhand des Profilrangs herunter.
Der Kontext enthält provider, modelId, optional zusammengeführte reasoning-
sowie optional zusammengeführte Modellfakten aus compat. Provider-Plugins können diese
Katalogfakten verwenden, um ein modellspezifisches Profil nur dann bereitzustellen, wenn der konfigurierte
Anfragevertrag dies unterstützt.
Implementieren Sie einen statt drei Hooks. Die alten Hooks wurden entfernt.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJFeHRlcm5lIEF1dGhlbnRpZml6aWVydW5ncy1Qcm92aWRlciAt contracts.externalAuthProviders"> Alt: Implementierung externer Authentifizierungs-Hooks, ohne den Provider im Plugin-Manifest zu deklarieren.
Neu: Deklarieren Sie contracts.externalAuthProviders im Plugin-Manifest
und implementieren Sie resolveExternalAuthProfiles(...).
{ "contracts": { "externalAuthProviders": ["anthropic", "openai"] }}OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJOYWNoc2NobGFnZW4gdm9uIFByb3ZpZGVyLVVtZ2VidW5nc3ZhcmlhYmxlbiAt
setup.providers[].envVars">
Altes Manifestfeld: providerAuthEnvVars: { anthropic: ["ANTHROPIC_API_KEY"] }.
Neu: Spiegeln Sie dieselbe Suche nach Umgebungsvariablen in setup.providers[].envVars
im Manifest. Dadurch werden Umgebungsmetadaten für Einrichtung und Status an einer Stelle zusammengeführt
und es wird vermieden, die Plugin-Runtime nur zum Beantworten von Abfragen nach Umgebungsvariablen zu starten.
providerAuthEnvVars wird nicht mehr akzeptiert.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJSZWdpc3RyaWVydW5nIGRlcyBNZW1vcnktUGx1Z2lucyAt
registerMemoryCapability">
Alt: drei separate Aufrufe – api.registerMemoryPromptSection(...),
api.registerMemoryFlushPlan(...), api.registerMemoryRuntime(...).
Neu: ein Aufruf in der Memory-State-API –
registerMemoryCapability(pluginId, { promptBuilder, flushPlanResolver, runtime }).
Dieselben Slots, ein einzelner Registrierungsaufruf. Additive Hilfsfunktionen für Prompts und Korpora
(registerMemoryPromptSupplement, registerMemoryCorpusSupplement) sind
nicht betroffen.
API für Memory-Embedding-Provider
Alt: api.registerMemoryEmbeddingProvider(...) plus
contracts.memoryEmbeddingProviders.
Neu: api.registerEmbeddingProvider(...) plus
contracts.embeddingProviders.
Der generische Vertrag für Embedding-Provider ist außerhalb von Memory wiederverwendbar und stellt den unterstützten Pfad für neue Provider dar. Die Memory-spezifische Registrierungs-API bleibt als veraltete Kompatibilitätsoberfläche eingebunden, während bestehende Provider migrieren. Die Plugin-Prüfung meldet die Verwendung durch nicht gebündelte Plugins als Kompatibilitätsschuld.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJVbnN0cnVrdHVyaWVydGUgQ2hhbm5lbC1TZW5kZWVyZ2Vibmlzc2UgLQ
OutboundDeliveryResult">
Alt: { ok, messageId, error } über
ChannelSendRawResult zurückgeben und mit
createRawChannelSendResultAdapter(...) normalisieren.
Neu: Geben Sie OutboundDeliveryResult-Felder zurück und fügen Sie den Channel mit
createAttachedChannelResultAdapter(...) hinzu. Fehlgeschlagene Sendevorgänge sollten eine Ausnahme auslösen,
statt eine Fehlerzeichenfolge zurückzugeben. Der unstrukturierte Ergebnistyp bleibt bis
zur nächsten Hauptversion des Plugin-SDK verfügbar.
Typen für Subagent-Sitzungsnachrichten umbenannt
Zwei alte Typaliasse werden weiterhin aus src/plugins/runtime/types.ts exportiert:
| Alt | Neu |
|---|---|
SubagentReadSessionParams |
SubagentGetSessionMessagesParams |
SubagentReadSessionResult |
SubagentGetSessionMessagesResult |
Die Runtime-Methode readSession ist zugunsten von
getSessionMessages veraltet. Dieselbe Signatur; die alte Methode leitet den Aufruf an die
neue weiter.
Entfernte APIs für Sitzungs- und Transkriptdateien
Die Umstellung von Sitzungen und Transkripten auf SQLite entfernt oder veraltet Plugin-seitige APIs,
die aktive sessions.json-Speicher, JSONL-Transkriptpfade oder Listen
von Sitzungsdateien offengelegt haben. Runtime-Plugins sollten Sitzungsidentitäten und SDK-Runtime-
Hilfsfunktionen verwenden, statt aktive Dateien aufzulösen oder zu verändern.
| Zu migrierende Oberfläche | Ersatz |
|---|---|
Veraltete loadSessionStore(...), updateSessionStore(...) und resolveSessionStoreEntry(...) |
getSessionEntry(...), listSessionEntries(...) und Sitzungsmutationen auf Zeilenebene. |
Veraltetes resolveSessionFilePath(...) |
Sitzungsidentität (sessionKey, sessionId und SDK-Runtime-Hilfsfunktionen für Ziele) sowie Gateway-Methoden, die auf der aktuellen Sitzung arbeiten. |
Entferntes saveSessionStore(...) |
Gateway-eigene Sitzungs-Runtime-APIs; Plugin-Code sollte Sitzungszustand über dokumentierte Runtime-/Kontexthilfsfunktionen anfordern oder verändern, statt die aktive Speicherdatei zu schreiben. |
Entfernte resolveSessionTranscriptPathInDir(...) und resolveAndPersistSessionFile(...) |
Sitzungsidentität und Gateway-Methoden, die auf der aktuellen Sitzung arbeiten. |
readLatestAssistantTextFromSessionTranscript(...) |
Identitätsbasierte Transkriptleser, die vom aktuellen Runtime-Kontext bereitgestellt werden, oder Gateway-Verlaufs-/Sitzungsmethoden, wenn sich das Plugin außerhalb des Eigentümerpfads des Transkripts befindet. |
SessionTranscriptUpdate.sessionFile |
SessionTranscriptUpdate.target mit agentId, sessionKey und sessionId. |
Memory-Synchronisierungseingaben wie sessionFiles |
Vom Host bereitgestellte identitätsbasierte Transkript-/Sitzungsquellen; durchsuchen Sie für aktive Sitzungen keine aktiven JSONL-Dateien. |
Runtime-Optionen namens transcriptPath oder sessionFile für aktive Sitzungen |
sessionTarget/Runtime-Zielobjekte, die eine speicherneutrale Sitzungsidentität enthalten. |
Alte JSONL-Transkriptdateien bleiben als Import-, Archiv-, Export- und Support-Artefakte gültig. Sie sind nicht länger der dauerhafte Runtime-Vertrag für aktive Sitzungen.
Offizielle Plugins, die mit v2026.7.1-beta.5 veröffentlicht wurden, importierten die vier
oben genannten veralteten Hilfsfunktionen. openclaw/plugin-sdk/session-store-runtime erhält
genau diese Brücke bis zum 2026-10-12; neue Plugins müssen die Ersatzlösungen verwenden.
resolveStorePath(...) bleibt eine unterstützte SDK-Hilfsfunktion und ist nicht Teil
dieser Veraltung.
openclaw plugins inspect --all --runtime meldet nicht gebündelte Plugins, deren
Ladefehler oder Diagnosen weiterhin auf diese entfernten Datei-APIs verweisen. Der
Beratungsdurchlauf @openclaw/plugin-inspector muss Version 0.3.17 oder
neuer verwenden, damit Scans externer Pakete vor der Veröffentlichung auch Sitzungs-Hilfsfunktionen
für den gesamten Speicher, Hilfsfunktionen für Sitzungsdateipfade, alte Transkriptdateiziele und
Low-Level-Transkripthilfsfunktionen kennzeichnen.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJydW50aW1lLnRhc2tzLmZsb3cgLQ
runtime.tasks.managedFlows">
Alt: runtime.tasks.flow (Singular) gab einen aktiven TaskFlow-
Zugriff zurück.
Neu: runtime.tasks.managedFlows behält die verwaltete TaskFlow-Mutations-
Runtime für Plugins bei, die untergeordnete Aufgaben aus einem Ablauf erstellen, aktualisieren, abbrechen oder
ausführen. Verwenden Sie runtime.tasks.flows, wenn das Plugin nur DTO-basierte
Lesezugriffe benötigt.
// Vorherconst flow = api.runtime.tasks.flow.fromToolContext(ctx);// Nachherconst flow = api.runtime.tasks.managedFlows.fromToolContext(ctx);Die veralteten Aliasse wurden im Juli 2026 entfernt.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJFaW5nZWJldHRldGUgRXJ3ZWl0ZXJ1bmdzLUZhY3RvcnlzIC0
Middleware für Agent-Tool-Ergebnisse">
Dies wird oben unter Migration behandelt. Der Vollständigkeit
halber wird es hier ebenfalls aufgeführt: Der entfernte, ausschließlich für
eingebettete Runner bestimmte Pfad api.registerEmbeddedExtensionFactory(...) wird durch
api.registerAgentToolResultMiddleware(...) mit einer expliziten Runtime-Liste
in contracts.agentToolResultMiddleware ersetzt.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJBbGlhcyBPcGVuQ2xhd1NjaGVtYVR5cGUgLQ
OpenClawConfig">
Der Root-SDK-Alias OpenClawSchemaType wurde entfernt. Verwenden Sie den
kanonischen Namen OpenClawConfig.
// Vorherimport type { OpenClawSchemaType } from "openclaw/plugin-sdk";// Nachherimport type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";Migration von Talk und Echtzeit-Sprachkommunikation
Code für Echtzeit-Sprachkommunikation, Telefonie, Meetings und Browser-Talk verwendet
gemeinsam einen Talk-Sitzungscontroller, der von openclaw/plugin-sdk/realtime-voice exportiert wird. Der
Controller verwaltet den gemeinsamen Talk-Ereignisumschlag, den Zustand des aktiven Gesprächsbeitrags,
den Erfassungszustand, den Zustand der Audioausgabe, den jüngsten Ereignisverlauf und die
Ablehnung veralteter Gesprächsbeiträge. Provider-Plugins verwalten anbieterspezifische
Echtzeitsitzungen. Browser-Meeting-Plugins verwenden openclaw/plugin-sdk/meeting-runtime für Sitzungs-,
Browser-, Audio-, Node-Host-, Agent-Consult- und Sprachanrufmechanismen und implementieren
anschließend MeetingPlatformAdapter für URL-Regeln, DOM-Skripte, die Zuordnung manueller Aktionen,
Untertitel, Erstellung und Einwahlpläne. Plattform-REST-APIs, OAuth, Artefakte, Selektoren und
Wire-Namen verbleiben im Plugin. Browser-Berechtigungspläne erhalten die angeforderte Meeting-URL,
damit jede Plattform ausschließlich ihre genau unterstützten Ursprünge freigeben kann.
Sitzungs-Runtimes müssen außerdem die plattformspezifische Live-Funktionsfähigkeit nach dem
bestätigten Verlassen des Browsers normalisieren; historische Transkriptfelder dürfen erhalten
bleiben, aber die Bereitschaft von Untertiteln und Audio darf nach dem Verlassen nicht aktiv bleiben.
Alle gebündelten Oberflächen werden mit dem gemeinsamen Controller ausgeführt: Browser-Relay,
Übergabe verwalteter Räume, Echtzeit-Sprachanrufe, Streaming-STT für Sprachanrufe, Google
Meet-Echtzeitkommunikation und natives Push-to-Talk. Der Gateway kündigt in
hello-ok.features.events einen Live-Talk-Ereigniskanal an: talk.event.
Neuer Code sollte createTalkEventSequencer(...) nicht direkt aufrufen, außer wenn
ein Low-Level-Adapter oder eine Test-Fixture implementiert wird. Verwenden Sie den gemeinsamen
Controller, damit auf einen Gesprächsbeitrag begrenzte Ereignisse nicht ohne Gesprächsbeitrags-ID
ausgegeben werden können, veraltete Aufrufe von turnEnd /
turnCancel keinen neueren aktiven Gesprächsbeitrag löschen können und Ereignisse im
Lebenszyklus der Audioausgabe über Telefonie, Meetings, Browser-Relay, die Übergabe verwalteter
Räume und native Talk-Clients hinweg konsistent bleiben.
Die Form der öffentlichen API:
// Vom Gateway verwaltete Talk-Sitzungs-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 }); // Vom Client verwaltete Provider-Sitzungs-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" });Browsereigene WebRTC-/Provider-WebSocket-Sitzungen verwenden talk.client.create,
da der Browser die Provider-Aushandlung und den Medientransport verwaltet, während der
Gateway Anmeldedaten, Anweisungen und Tool-Richtlinien verwaltet. talk.session.* ist
die gemeinsame, vom Gateway verwaltete Oberfläche für Gateway-Relay-Echtzeitkommunikation,
Gateway-Relay-Transkription und native STT-/TTS-Sitzungen in verwalteten Räumen.
Veraltete Konfigurationen, die Echtzeitselektoren neben talk.provider /
talk.providers platzieren, sollten mit openclaw doctor --fix repariert werden;
die Talk-Runtime interpretiert die Sprach-/TTS-Provider-Konfiguration nicht als
Echtzeit-Provider-Konfiguration neu.
Die unterstützten Kombinationen von talk.session.create sind bewusst begrenzt:
| Modus | Transport | Logik | Verantwortlich | Hinweise |
|---|---|---|---|---|
realtime |
gateway-relay |
agent-consult |
Gateway | Vollduplex-Provider-Audio, das über den Gateway übertragen wird; Tool-Aufrufe werden durch das Agent-Consult-Tool geleitet. |
transcription |
gateway-relay |
none |
Gateway | Nur Streaming-STT; Aufrufer senden Eingangsaudio und empfangen Transkriptereignisse. |
stt-tts |
managed-room |
agent-consult |
Nativer Raum/Client | Push-to-Talk- und Walkie-Talkie-artige Räume, in denen der Client Erfassung/Wiedergabe und der Gateway den Gesprächsbeitragszustand verwaltet. |
stt-tts |
managed-room |
direct-tools |
Nativer Raum/Client | Ausschließlich für Administratoren bestimmter Raummodus für vertrauenswürdige Erstanbieter-Oberflächen, die Gateway-Tool-Aktionen direkt ausführen. |
Methodenzuordnung für Leser, die von den älteren Familien talk.realtime.* /
talk.transcription.* / talk.handoff.* migrieren (alle entfernt):
| Alt | Neu |
|---|---|
talk.realtime.session |
talk.client.create |
talk.realtime.toolCall |
talk.client.toolCall |
talk.realtime.relayAudio |
talk.session.appendAudio |
talk.realtime.relayCancel |
talk.session.cancelOutput oder talk.session.cancelTurn |
talk.realtime.relayToolResult |
talk.session.submitToolResult |
talk.realtime.relayStop |
talk.session.close |
talk.transcription.session |
talk.session.create({ mode: "transcription" }) |
talk.transcription.relayAudio |
talk.session.appendAudio |
talk.transcription.relayCancel |
talk.session.cancelTurn |
talk.transcription.relayStop |
talk.session.close |
talk.handoff.create |
talk.session.create({ transport: "managed-room" }) |
talk.handoff.join |
talk.session.join |
talk.handoff.revoke |
talk.session.close |
Das einheitliche Steuerungsvokabular ist ebenfalls bewusst begrenzt:
| Methode | Gilt für | Vertrag |
|---|---|---|
talk.session.appendAudio |
realtime/gateway-relay, transcription/gateway-relay |
Einen Base64-PCM-Audioblock an die Provider-Sitzung anhängen, die derselben Gateway-Verbindung gehört. |
talk.session.startTurn |
stt-tts/managed-room |
Einen Benutzer-Gesprächsbeitrag in einem verwalteten Raum beginnen. |
talk.session.endTurn |
stt-tts/managed-room |
Den aktiven Gesprächsbeitrag nach der Validierung auf einen veralteten Gesprächsbeitrag beenden. |
talk.session.cancelTurn |
alle vom Gateway verwalteten Sitzungen | Aktive Erfassungs-, Provider-, Agent- und TTS-Arbeit für einen Gesprächsbeitrag abbrechen. |
talk.session.cancelOutput |
realtime/gateway-relay |
Die Audioausgabe des Assistenten stoppen, ohne den Benutzer-Gesprächsbeitrag zwangsläufig zu beenden. |
talk.session.submitToolResult |
realtime/gateway-relay |
Einen Provider-Tool-Aufruf nach einer durch seine Bridge bereitgestellten asynchronen Fertigstellung abschließen; options.willContinue für eine Zwischenausgabe oder, sofern unterstützt, options.suppressResponse übergeben, um eine weitere Assistentenantwort zu vermeiden. |
talk.session.steer |
agentengestützte Talk-Sitzungen | Gesprochene Steuerbefehle vom Typ status, steer, cancel oder followup an den aktiven eingebetteten Lauf senden, der aus der Talk-Sitzung aufgelöst wurde. |
talk.session.close |
alle einheitlichen Sitzungen | Relay-Sitzungen stoppen oder den Zustand verwalteter Räume widerrufen und anschließend die einheitliche Sitzungs-ID verwerfen. |
Führen Sie keine Provider- oder Plattformsonderfälle im Kern ein, damit dies funktioniert. Der Kern verwaltet die Semantik von Talk-Sitzungen. Provider-Plugins verwalten die Einrichtung anbieterspezifischer Sitzungen. Voice-Call und Google Meet verwalten Telefonie-/Meeting-Adapter. Browser- und native Apps verwalten die Geräteerfassungs-/Wiedergabe-UX.
Zeitplan für die Entfernung
| Wann | Was geschieht |
|---|---|
| Jetzt | Veraltete Oberflächen, die Warnungen unterstützen, geben Laufzeitwarnungen aus; Repository-Prüfungen weisen veraltete SDK-Importe aus dem Kern und gebündelten Plugins zurück. |
| Ausstehende Entscheidung des Verantwortlichen | Datumslose Einträge bleiben veraltet und können nicht entfernt werden, bis ihr Verantwortlicher ein removeAfter-Datum veröffentlicht. |
Das removeAfter-Datum jedes Kompatibilitätseintrags |
Diese spezifische Oberfläche kann entfernt werden; nach Ablauf des Datums lässt pnpm plugins:boundary-report --fail-on-eligible-compat die CI fehlschlagen. |
| Nächste Hauptversion | Datierte Oberflächen dürfen erst nach ihrem removeAfter-Datum entfernt werden; datumslose Einträge erfordern weiterhin die Genehmigung des Verantwortlichen und ein veröffentlichtes Datum. |
Für die nachfolgend verbleibenden öffentlichen SDK-Unterpfade gelten registrierungsgestützte Entfernungszeiträume. Die Zeilen vom 30. Juli wurden nach ihrer frühzeitigen, von den Maintainern genehmigten Bereinigung entfernt: Nicht verwendete Unterpfade wurden gelöscht, frühere Kompatibilitätsaliase wurden gelöscht und ausschließlich für gebündelte Plugins bestimmte Module wurden zu privaten lokalen Build-Zuordnungen herabgestuft.
removeAfter |
Stufe | SDK-Unterpfade |
|---|---|---|
2026-08-15 |
Frühere Kompatibilitätsveraltungen | agent-config-primitives, channel-logging, channel-secret-runtime, channel-streaming, group-access, inbound-reply-dispatch, matrix, text-runtime, zod |
2026-09-01 |
Frühere Kompatibilitätsveraltungen | channel-lifecycle, channel-message, channel-reply-pipeline, config-runtime, infra-runtime |
2026-10-01 |
Legacy-Projektion für Medien | agent-media-payload sowie die nicht zu Unterpfaden gehörenden MsgContext Media*-Felder, Builder für eingehende Medien-Payloads von Kanälen, buildMediaPayload, Hook-Medienaliase und {{Media*}}-Vorlagen |
Alle Kern-Plugins wurden bereits migriert. Externe Plugins sollten
vor der nächsten Hauptversion migriert werden. Führen Sie pnpm plugins:boundary-report aus, um zu sehen, welche
Kompatibilitätseinträge für die von Ihrem Plugin verwendeten Oberflächen am frühesten fällig sind.
Warnungen vorübergehend unterdrücken
OPENCLAW_SUPPRESS_PLUGIN_SDK_COMPAT_WARNING=1 openclaw gateway runOPENCLAW_SUPPRESS_EXTENSION_API_WARNING=1 openclaw gateway runDies ist ein vorübergehender Ausweg, keine dauerhafte Lösung.
Verwandte Themen
- Erste Schritte - Erstellen Sie Ihr erstes Plugin
- SDK-Übersicht - vollständige Importreferenz für Unterpfade
- Kanal-Plugins - Kanal-Plugins erstellen
- Provider-Plugins - Provider-Plugins erstellen
- Plugin-Interna - ausführlicher Einblick in die Architektur
- Plugin-Manifest - Referenz zum Manifest-Schema