Channel-Plugins erstellen
Diese Anleitung führt Sie durch das Erstellen eines Channel-Plugins, das OpenClaw mit einer Messaging-Plattform verbindet. Am Ende haben Sie einen funktionierenden Kanal mit DM-Sicherheit, Kopplung, Antwort-Threading und ausgehender Nachrichtenübermittlung.Wenn Sie noch nie ein OpenClaw-Plugin erstellt haben, lesen Sie zuerst
Erste Schritte, um die grundlegende Paket-
struktur und die Manifest-Einrichtung kennenzulernen.
So funktionieren Channel-Plugins
Channel-Plugins benötigen keine eigenen Send/Edit/React-Tools. OpenClaw behält ein gemeinsam genutztesmessage-Tool im Core. Ihr Plugin verwaltet:
- Konfiguration — Account-Auflösung und Einrichtungsassistent
- Sicherheit — DM-Richtlinie und Allowlists
- Kopplung — DM-Freigabeablauf
- Sitzungsgrammatik — wie providerspezifische Konversations-IDs auf Basis-Chats, Thread-IDs und Parent-Fallbacks abgebildet werden
- Ausgehend — Senden von Text, Medien und Umfragen an die Plattform
- Threading — wie Antworten in Threads organisiert werden
:thread:-Bookkeeping und die Verteilung.
Wenn Ihre Plattform zusätzlichen Geltungsbereich in Konversations-IDs speichert, behalten Sie dieses Parsing
im Plugin mit messaging.resolveSessionConversation(...). Das ist der
kanonische Hook für die Abbildung von rawId auf die Basis-Konversations-ID, optionale Thread-
ID, explizite baseConversationId und alle parentConversationCandidates.
Wenn Sie parentConversationCandidates zurückgeben, behalten Sie deren Reihenfolge von der
engsten Parent-Ebene bis zur breitesten/Basis-Konversation bei.
Gebündelte Plugins, die dieselbe Analyse benötigen, bevor die Channel-Registry gestartet wird,
können außerdem eine Top-Level-Datei session-key-api.ts mit einem passenden
Export resolveSessionConversation(...) bereitstellen. Der Core verwendet diese Bootstrap-sichere Oberfläche
nur dann, wenn die Runtime-Plugin-Registry noch nicht verfügbar ist.
messaging.resolveParentConversationCandidates(...) bleibt als
Legacy-Kompatibilitäts-Fallback verfügbar, wenn ein Plugin nur Parent-Fallbacks zusätzlich
zur allgemeinen/raw ID benötigt. Wenn beide Hooks vorhanden sind, verwendet der Core
zuerst resolveSessionConversation(...).parentConversationCandidates und greift nur dann
auf resolveParentConversationCandidates(...) zurück, wenn der kanonische Hook
sie auslässt.
Freigaben und Channel-Fähigkeiten
Die meisten Channel-Plugins benötigen keinen freigabespezifischen Code.- Der Core verwaltet
/approveim selben Chat, gemeinsam genutzte Payloads für Freigabe-Buttons und allgemeine Fallback-Zustellung. - Bevorzugen Sie ein einzelnes
approvalCapability-Objekt im Channel-Plugin, wenn der Kanal freigabespezifisches Verhalten benötigt. approvalCapability.authorizeActorActionundapprovalCapability.getActionAvailabilityStatesind die kanonische Auth-Oberfläche für Freigaben.- Verwenden Sie
outbound.shouldSuppressLocalPayloadPromptoderoutbound.beforeDeliverPayloadfür channelspezifisches Payload-Lebenszyklusverhalten wie das Ausblenden doppelter lokaler Freigabeaufforderungen oder das Senden von Tippindikatoren vor der Zustellung. - Verwenden Sie
approvalCapability.deliverynur für natives Freigabe-Routing oder Fallback-Unterdrückung. - Verwenden Sie
approvalCapability.rendernur dann, wenn ein Kanal wirklich benutzerdefinierte Freigabe-Payloads anstelle des gemeinsam genutzten Renderers benötigt. - Wenn ein Kanal aus bestehender Konfiguration stabile owner-ähnliche DM-Identitäten ableiten kann, verwenden Sie
createResolvedApproverActionAuthAdapterausopenclaw/plugin-sdk/approval-runtime, um/approveim selben Chat einzuschränken, ohne freigabespezifische Core-Logik hinzuzufügen. - Wenn ein Kanal eine native Freigabezustellung benötigt, konzentrieren Sie den Channel-Code auf Zielnormalisierung und Transport-Hooks. Verwenden Sie
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolver,createApproverRestrictedNativeApprovalCapabilityundcreateChannelNativeApprovalRuntimeausopenclaw/plugin-sdk/approval-runtime, damit der Core Anforderungsfilterung, Routing, Deduplizierung, Ablauf und Gateway-Abonnement verwaltet. - Native Freigabekanäle müssen sowohl
accountIdals auchapprovalKinddurch diese Helfer routen.accountIdhält mehrkontenbasierte Freigaberichtlinien auf das richtige Bot-Konto begrenzt, undapprovalKindhält das Verhalten für Exec- vs. Plugin-Freigaben für den Kanal verfügbar, ohne fest codierte Verzweigungen im Core. - Behalten Sie die Art der zugestellten Freigabe-ID über den gesamten Ablauf hinweg unverändert bei. Native Clients sollten das Routing von Exec- vs. Plugin-Freigaben nicht aus channelspezifischem Status erraten oder umschreiben.
- Unterschiedliche Freigabearten können absichtlich verschiedene native Oberflächen bereitstellen.
Aktuelle gebündelte Beispiele:
- Slack lässt natives Freigabe-Routing sowohl für Exec- als auch für Plugin-IDs zu.
- Matrix behält natives DM-/Channel-Routing nur für Exec-Freigaben bei und belässt
Plugin-Freigaben auf dem gemeinsam genutzten
/approve-Pfad im selben Chat.
createApproverRestrictedNativeApprovalAdapterexistiert weiterhin als Kompatibilitäts-Wrapper, aber neuer Code sollte den Capability-Builder bevorzugen undapprovalCapabilityim Plugin bereitstellen.
openclaw/plugin-sdk/approval-auth-runtimeopenclaw/plugin-sdk/approval-client-runtimeopenclaw/plugin-sdk/approval-delivery-runtimeopenclaw/plugin-sdk/approval-native-runtimeopenclaw/plugin-sdk/approval-reply-runtime
openclaw/plugin-sdk/setup-runtime,
openclaw/plugin-sdk/setup-adapter-runtime,
openclaw/plugin-sdk/reply-runtime,
openclaw/plugin-sdk/reply-dispatch-runtime,
openclaw/plugin-sdk/reply-reference und
openclaw/plugin-sdk/reply-chunking bevorzugen, wenn Sie die breitere Dach-
Oberfläche nicht benötigen.
Speziell für Setup gilt:
openclaw/plugin-sdk/setup-runtimeumfasst die Runtime-sicheren Setup-Helfer: importsichere Setup-Patch-Adapter (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), Ausgabe von Lookup-Hinweisen,promptResolvedAllowFrom,splitSetupEntriesund die delegierten Setup-Proxy-Builderopenclaw/plugin-sdk/setup-adapter-runtimeist die schmale env-bewusste Adapter- Oberfläche fürcreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupumfasst die optionalen Installations-Setup- Builder plus einige Setup-sichere Primitive:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,createOptionalChannelSetupWizard,DEFAULT_ACCOUNT_ID,createTopLevelChannelDmPolicy,setSetupChannelEnabledundsplitSetupEntries- verwenden Sie die breitere Oberfläche
openclaw/plugin-sdk/setupnur dann, wenn Sie auch die schwergewichtigeren gemeinsam genutzten Setup-/Konfigurationshelfer benötigen, wie etwamoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...). Der generierte
Adapter/Assistent schlägt bei Konfigurationsschreibvorgängen und Finalisierung sicher fehl und verwendet
dieselbe Meldung „Installation erforderlich“ für Validierung, Finalisierung und Text mit Docs-Link
erneut.
Für andere Hot-Channel-Pfade sollten Sie die schmalen Helfer gegenüber breiteren Legacy-
Oberflächen bevorzugen:
openclaw/plugin-sdk/account-core,openclaw/plugin-sdk/account-id,openclaw/plugin-sdk/account-resolutionundopenclaw/plugin-sdk/account-helpersfür Mehrkonten-Konfiguration und Fallback auf Standardkontoopenclaw/plugin-sdk/inbound-envelopeundopenclaw/plugin-sdk/inbound-reply-dispatchfür eingehende Route/Envelope und Verdrahtung für Aufzeichnen und Verteilenopenclaw/plugin-sdk/messaging-targetsfür Ziel-Parsing/-Abgleichopenclaw/plugin-sdk/outbound-mediaundopenclaw/plugin-sdk/outbound-runtimefür Medienladen sowie ausgehende Identitäts-/Sendedelegatenopenclaw/plugin-sdk/thread-bindings-runtimefür Lebenszyklus von Thread-Bindings und Adapter-Registrierungopenclaw/plugin-sdk/agent-media-payloadnur dann, wenn weiterhin ein Legacy-Layout für Agent-/Medien-Payload-Felder erforderlich istopenclaw/plugin-sdk/telegram-command-configfür Telegram-Normalisierung von benutzerdefinierten Befehlen, Validierung von Duplikaten/Konflikten und einen fallback-stabilen Vertrag für die Befehls-Konfiguration
Anleitung
Paket und Manifest
Erstellen Sie die Standard-Plugin-Dateien. Das Feld
channel in package.json ist
das Merkmal, das dieses Plugin zu einem Channel-Plugin macht. Die vollständige Oberfläche für Paketmetadaten
finden Sie unter Plugin-Setup und -Konfiguration:Das Channel-Plugin-Objekt erstellen
Das Interface
ChannelPlugin verfügt über viele optionale Adapter-Oberflächen. Beginnen Sie mit
dem Minimum — id und setup — und ergänzen Sie Adapter nach Bedarf.Erstellen Sie src/channel.ts:src/channel.ts
Was createChatChannelPlugin für Sie erledigt
Was createChatChannelPlugin für Sie erledigt
Statt Low-Level-Adapter-Interfaces manuell zu implementieren, übergeben Sie
deklarative Optionen, und der Builder setzt sie zusammen:
Sie können auch rohe Adapter-Objekte statt deklarativer Optionen übergeben,
wenn Sie vollständige Kontrolle benötigen.
| Option | Was verdrahtet wird |
|---|---|
security.dm | Auf Konfigurationsfeldern basierender, begrenzter DM-Sicherheits-Resolver |
pairing.text | Textbasierter DM-Kopplungsablauf mit Codeaustausch |
threading | Resolver für Reply-to-Modus (fest, kontobezogen oder benutzerdefiniert) |
outbound.attachedResults | Sendefunktionen, die Ergebnis-Metadaten zurückgeben (Nachrichten-IDs) |
Den Entry-Point verdrahten
Erstellen Sie Platzieren Sie Channel-eigene CLI-Deskriptoren in
index.ts:index.ts
registerCliMetadata(...), damit OpenClaw
sie in der Root-Hilfe anzeigen kann, ohne die vollständige Channel-Runtime zu aktivieren,
während normale vollständige Ladevorgänge dieselben Deskriptoren weiterhin für die echte Befehls-
registrierung übernehmen. Behalten Sie registerFull(...) für nur zur Runtime gehörende Aufgaben bei.
Wenn registerFull(...) Gateway-RPC-Methoden registriert, verwenden Sie ein
pluginspezifisches Präfix. Core-Admin-Namespaces (config.*,
exec.approvals.*, wizard.*, update.*) bleiben reserviert und werden immer
zu operator.admin aufgelöst.
defineChannelPluginEntry übernimmt die Aufteilung des Registrierungsmodus automatisch. Siehe
Entry-Points für alle
Optionen.Einen Setup-Entry hinzufügen
Erstellen Sie OpenClaw lädt dies anstelle des vollständigen Entry-Points, wenn der Kanal deaktiviert
oder nicht konfiguriert ist. Dadurch wird vermieden, während Setup-Abläufen schweren Runtime-Code zu laden.
Details finden Sie unter Setup und Konfiguration.
setup-entry.ts für leichtgewichtiges Laden während des Onboardings:setup-entry.ts
Eingehende Nachrichten verarbeiten
Ihr Plugin muss Nachrichten von der Plattform empfangen und an
OpenClaw weiterleiten. Das typische Muster ist ein Webhook, der die Anfrage verifiziert und
sie über den Inbound-Handler Ihres Kanals verteilt:
Die Verarbeitung eingehender Nachrichten ist channelspezifisch. Jedes Channel-Plugin verwaltet
seine eigene Inbound-Pipeline. Sehen Sie sich gebündelte Channel-Plugins
an (zum Beispiel das Microsoft Teams- oder Google Chat-Plugin-Paket), um echte Muster zu sehen.
Testen
Schreiben Sie colocated Tests in Gemeinsam genutzte Test-Helfer finden Sie unter Testing.
src/channel.test.ts:src/channel.test.ts
Dateistruktur
Fortgeschrittene Themen
Threading-Optionen
Feste, kontobezogene oder benutzerdefinierte Antwortmodi
Integration des Message-Tools
describeMessageTool und Action-Erkennung
Zielauflösung
inferTargetChatType, looksLikeId, resolveTarget
Runtime-Helfer
TTS, STT, Medien, Subagent über api.runtime
Einige gebündelte Helper-Oberflächen existieren weiterhin für die Wartung gebündelter Plugins und
Kompatibilität. Sie sind nicht das empfohlene Muster für neue Channel-Plugins;
bevorzugen Sie die allgemeinen Channel-/Setup-/Reply-/Runtime-Subpaths aus der gemeinsamen SDK-
Oberfläche, es sei denn, Sie warten diese gebündelte Plugin-Familie direkt.
Nächste Schritte
- Provider-Plugins — wenn Ihr Plugin auch Modelle bereitstellt
- SDK-Überblick — vollständige Referenz für Subpath-Importe
- SDK-Testing — Test-Utilities und Vertragstests
- Plugin-Manifest — vollständiges Manifest-Schema