Plugin SDK reference
Plugin-Einrichtung und -Konfiguration
Referenz für Plugin-Paketierung (package.json-Metadaten), Manifeste (openclaw.plugin.json), Einrichtungseinträge und Konfigurationsschemas.
Paketmetadaten
Ihr package.json benötigt ein openclaw-Feld, das dem Plugin-System mitteilt, was Ihr Plugin bereitstellt:
Kanal-Plugin
{ "name": "@myorg/openclaw-my-channel", "version": "1.0.0", "type": "module", "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "channel": { "id": "my-channel", "label": "Mein Kanal", "blurb": "Kurzbeschreibung des Kanals." } }}Provider-Plugin / ClawHub-Baseline
{ "name": "@myorg/openclaw-my-plugin", "version": "1.0.0", "type": "module", "dependencies": { "typebox": "1.1.39" }, "peerDependencies": { "openclaw": ">=2026.3.24-beta.2" }, "openclaw": { "extensions": ["./index.ts"], "compat": { "pluginApi": ">=2026.3.24-beta.2", "minGatewayVersion": "2026.3.24-beta.2" }, "build": { "openclawVersion": "2026.3.24-beta.2", "pluginSdkVersion": "2026.3.24-beta.2" } }}openclaw-Felder
extensionsstring[]Einstiegspunktdateien (relativ zum Paketstammverzeichnis). Gültige Quelleinträge für die Entwicklung in Workspaces und Git-Checkouts.
runtimeExtensionsstring[]Erstellte JavaScript-Gegenstücke für extensions, die bevorzugt werden, wenn OpenClaw ein installiertes npm-Paket lädt. Siehe SDK-Einstiegspunkte zur Auflösungsreihenfolge von Quell- und erstellten Dateien.
setupEntrystringLeichtgewichtiger Einstieg nur für die Einrichtung (optional).
runtimeSetupEntrystringErstelltes JavaScript-Gegenstück für setupEntry. Erfordert, dass auch setupEntry festgelegt ist.
pluginobject{ id, label }-Fallback-Identität des Plugins, die verwendet wird, wenn ein Plugin keine Kanal-/Provider-Metadaten besitzt, aus denen eine ID oder Bezeichnung abgeleitet werden kann.
channelobjectMetadaten des Kanalkatalogs für Einrichtung, Auswahl, Schnellstart und Statusoberflächen.
installobjectInstallationshinweise: npmSpec, localPath, defaultChoice, minHostVersion, expectedIntegrity, allowInvalidConfigRecovery, requiredPlatformPackages.
startupobjectKennzeichen für das Startverhalten.
compatobjectVon diesem Plugin unterstützter pluginApi-Versionsbereich. Für externe Veröffentlichungen auf ClawHub erforderlich.
openclaw.channel
openclaw.channel sind leichtgewichtige Paketmetadaten für die Kanalerkennung und Einrichtungsoberflächen, bevor die Laufzeit geladen wird.
Kanaleigene Einrichtungsfelder
Kanal-Plugins sollten Einrichtungsfelder einmalig im Laufzeitcode mit defineChannelSetupContract(...) definieren und die entsprechende serialisierbare Projektion unter openclaw.channel.setup.fields veröffentlichen. Die Laufzeitdefinition leitet den Plugin-lokalen Eingabetyp ab, analysiert sowohl geführte als auch nicht interaktive Werte und hält kanalspezifische Schlüssel aus den Kerntypen heraus. Mithilfe der Paketmetadaten können openclaw channels add <channel-id> --help und openclaw channels add --channel <channel-id> --help ausschließlich die Optionen des ausgewählten Kanals ermitteln, ohne das Plugin zu laden.
export const setupContract = defineChannelSetupContract({ fields: { endpoint: { kind: "string", cli: { flags: "--endpoint <url>", description: "Dienstendpunkt" }, }, transport: { kind: "choice", choices: ["native", "container"], cli: { flags: "--transport <kind>", description: "Transportverantwortlicher" }, }, }, adapter: { applyAccountConfig: ({ cfg, input }) => ({ ...cfg, channels: { ...cfg.channels, example: input }, }), },});{ "openclaw": { "channel": { "id": "example", "setup": { "fields": [ { "key": "endpoint", "kind": "string", "cli": { "flags": "--endpoint <url>", "description": "Dienstendpunkt" } }, { "key": "transport", "kind": "choice", "choices": ["native", "container"], "cli": { "flags": "--transport <kind>", "description": "Transportverantwortlicher" } } ] } } }}Unterstützte Feldarten sind string, boolean, integer, string-list und choice. Verwenden Sie sensitive: true für Anmeldedaten. Jeder Feldschlüssel muss dem in camelCase geschriebenen Attributnamen seines langen CLI-Flags entsprechen, einschließlich einer etwaigen negierten Form, beispielsweise apiToken für --api-token. Boolesche Felder können cli.negatedFlags hinzufügen, wenn sowohl positive als auch --no-*-Formen benötigt werden. channel, account und die Kontoanzeige name bleiben die gemeinsame Steuerungshülle.
Der veröffentlichte setup/ChannelSetupInput-Adapter bleibt für bestehende externe Plugins verfügbar. Neue Plugins sollten setupContract bereitstellen; OpenClaw bevorzugt diesen immer, wenn beide vorhanden sind.
| Feld | Typ | Bedeutung |
|---|---|---|
id |
string |
Kanonische Kanal-ID. |
label |
string |
Primäre Kanalbezeichnung. |
selectionLabel |
string |
Auswahl-/Einrichtungsbezeichnung, wenn sie von label abweichen soll. |
detailLabel |
string |
Sekundäre Detailbezeichnung für umfangreichere Kanalkataloge und Statusoberflächen. |
docsPath |
string |
Dokumentationspfad für Einrichtungs- und Auswahllinks. |
docsLabel |
string |
Überschriebene Bezeichnung für Dokumentationslinks, wenn sie von der Kanal-ID abweichen soll. |
blurb |
string |
Kurze Onboarding-/Katalogbeschreibung. |
order |
number |
Sortierreihenfolge in Kanalkatalogen. |
aliases |
string[] |
Zusätzliche Suchaliase für die Kanalauswahl. |
preferOver |
string[] |
Plugin-/Kanal-IDs mit niedrigerer Priorität, die dieser Kanal übertreffen soll. |
systemImage |
string |
Optionaler Symbol-/Systembildname für Kanalkataloge der Benutzeroberfläche. |
selectionDocsPrefix |
string |
Präfixtext vor Dokumentationslinks in Auswahloberflächen. |
selectionDocsOmitLabel |
boolean |
Den Dokumentationspfad direkt anstelle eines beschrifteten Dokumentationslinks im Auswahltext anzeigen. |
selectionExtras |
string[] |
Zusätzliche kurze Zeichenfolgen, die an den Auswahltext angehängt werden. |
markdownCapable |
boolean |
Kennzeichnet den Kanal für Entscheidungen zur ausgehenden Formatierung als Markdown-fähig. |
exposure |
object |
Sichtbarkeitssteuerung des Kanals für Einrichtung, konfigurierte Listen und Dokumentationsoberflächen. |
quickstartAllowFrom |
boolean |
Nimmt diesen Kanal in den standardmäßigen Schnellstart-allowFrom-Einrichtungsablauf auf. |
forceAccountBinding |
boolean |
Erfordert eine explizite Kontobindung, selbst wenn nur ein Konto vorhanden ist. |
preferSessionLookupForAnnounceTarget |
boolean |
Bevorzugt die Sitzungssuche beim Auflösen von Ankündigungszielen für diesen Kanal. |
setup |
object |
Serialisierbare kanaleigene Einrichtungsfelder für die verzögerte Ermittlung von CLI-Optionen. |
Beispiel:
{ "openclaw": { "channel": { "id": "my-channel", "label": "Mein Kanal", "selectionLabel": "Mein Kanal (selbst gehostet)", "detailLabel": "Bot für meinen Kanal", "docsPath": "/channels/my-channel", "docsLabel": "my-channel", "blurb": "Webhook-basierte, selbst gehostete Chat-Integration.", "order": 80, "aliases": ["mc"], "preferOver": ["my-channel-legacy"], "selectionDocsPrefix": "Anleitung:", "selectionExtras": ["Markdown"], "markdownCapable": true, "exposure": { "configured": true, "setup": true, "docs": true }, "quickstartAllowFrom": true } }}exposure unterstützt:
configured: den Kanal in konfigurierten/statusähnlichen Auflistungsoberflächen einschließensetup: den Kanal in interaktiven Einrichtungs-/Konfigurationsauswahlen einschließendocs: den Kanal in Dokumentations-/Navigationsoberflächen als öffentlich sichtbar kennzeichnen
openclaw.install
openclaw.install sind Paketmetadaten, keine Manifestmetadaten.
| Feld | Typ | Bedeutung |
|---|---|---|
clawhubSpec |
string |
Kanonische ClawHub-Spezifikation für Installations-/Aktualisierungs- und Onboarding-Abläufe mit bedarfsgesteuerter Installation. |
npmSpec |
string |
Kanonische npm-Spezifikation für Ausweichabläufe bei Installation und Aktualisierung. |
localPath |
string |
Lokaler Entwicklungspfad oder gebündelter Installationspfad. |
defaultChoice |
"clawhub" | "npm" | "local" |
Bevorzugte Installationsquelle, wenn mehrere Quellen verfügbar sind. |
minHostVersion |
string |
Niedrigste unterstützte OpenClaw-Version, >=x.y.z oder >=x.y.z-prerelease. |
expectedIntegrity |
string |
Erwartete npm-Dist-Integritätszeichenfolge, üblicherweise sha512-..., für angeheftete Installationen. |
allowInvalidConfigRecovery |
boolean |
Ermöglicht Abläufen zur Neuinstallation gebündelter Plugins die Wiederherstellung nach bestimmten Fehlern durch veraltete Konfigurationen. |
requiredPlatformPackages |
string[] |
Erforderliche plattformspezifische npm-Aliasse, die während der npm-Installation überprüft werden. |
Onboarding-Verhalten
Das interaktive Onboarding verwendet openclaw.install für Oberflächen zur bedarfsgesteuerten Installation: Wenn Ihr Plugin vor dem Laden der Laufzeit Provider-Authentifizierungsoptionen oder Metadaten für Kanaleinrichtung und -katalog bereitstellt, kann das Onboarding zur Installation über ClawHub, npm oder einen lokalen Pfad auffordern, das Plugin installieren oder aktivieren und anschließend den ausgewählten Ablauf fortsetzen. ClawHub-Optionen verwenden clawhubSpec und werden bevorzugt, sofern vorhanden; npm-Optionen erfordern vertrauenswürdige Katalogmetadaten mit einer Registry-npmSpec (exakte Versionen und expectedIntegrity sind optionale Festlegungen, die bei Installation und Aktualisierung durchgesetzt werden, sofern gesetzt). Halten Sie „was angezeigt werden soll“ in openclaw.plugin.json und „wie es installiert wird“ in package.json.
Durchsetzung von minHostVersion
Wenn minHostVersion gesetzt ist, wird die Angabe sowohl bei der Installation als auch beim Laden der Manifest-Registry für nicht gebündelte Plugins durchgesetzt. Ältere Hosts überspringen externe Plugins; ungültige Versionszeichenfolgen werden abgelehnt. Bei gebündelten Quell-Plugins wird davon ausgegangen, dass sie dieselbe Version wie der Host-Checkout haben.
Angeheftete npm-Installationen
Behalten Sie bei angehefteten npm-Installationen die exakte Version in npmSpec bei und fügen Sie die erwartete Artefaktintegrität hinzu:
{ "openclaw": { "install": { "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3", "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY", "defaultChoice": "npm" } }}Geltungsbereich von allowInvalidConfigRecovery
allowInvalidConfigRecovery ist keine allgemeine Umgehung für fehlerhafte Konfigurationen. Die Option dient ausschließlich der eng begrenzten Wiederherstellung gebündelter Plugins und ermöglicht es der Neuinstallation oder Einrichtung, bekannte Überbleibsel von Aktualisierungen zu reparieren, etwa einen fehlenden Pfad zu einem gebündelten Plugin oder einen veralteten channels.<id>-Eintrag für dasselbe Plugin. Wenn die Konfiguration aus anderen Gründen fehlerhaft ist, schlägt die Installation weiterhin nach dem Fail-Closed-Prinzip fehl und weist den Betreiber an, openclaw doctor --fix auszuführen.
Verzögertes vollständiges Laden
Kanal-Plugins können das verzögerte Laden wie folgt aktivieren:
{ "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "startup": { "deferConfiguredChannelFullLoadUntilAfterListen": true } }}Wenn diese Option aktiviert ist, lädt OpenClaw während der Startphase vor dem Lauschen nur setupEntry, auch bei bereits konfigurierten Kanälen. Der vollständige Einstiegspunkt wird geladen, nachdem der Gateway mit dem Lauschen begonnen hat.
Wenn Ihr Einrichtungs-/vollständiger Einstiegspunkt Gateway-RPC-Methoden registriert, verwenden Sie dafür ein Plugin-spezifisches Präfix. Reservierte zentrale Administrator-Namensräume (config.*, exec.approvals.*, wizard.*, update.*) bleiben dem Kern vorbehalten und werden immer zu operator.admin normalisiert.
Plugin-Manifest
Jedes native Plugin muss eine openclaw.plugin.json im Paketstammverzeichnis bereitstellen. OpenClaw verwendet sie, um die Konfiguration zu validieren, ohne Plugin-Code auszuführen.
{ "id": "my-plugin", "name": "Mein Plugin", "description": "Fügt OpenClaw Funktionen von Mein Plugin hinzu", "configSchema": { "type": "object", "additionalProperties": false, "properties": { "webhookSecret": { "type": "string", "description": "Geheimnis zur Webhook-Verifizierung" } } }}Fügen Sie für Kanal-Plugins channels hinzu (Provider-Plugins fügen providers hinzu):
{ "id": "my-channel", "channels": ["my-channel"], "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}Auch Plugins ohne Konfiguration müssen ein Schema bereitstellen. Ein leeres Schema ist gültig:
{ "id": "my-plugin", "configSchema": { "type": "object", "additionalProperties": false }}Die vollständige Schemareferenz finden Sie unter Plugin-Manifest.
Veröffentlichung auf ClawHub
Skills und Plugin-Pakete verwenden separate ClawHub-Veröffentlichungsbefehle. Verwenden Sie für Plugin-Pakete den paketspezifischen Befehl:
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginEinrichtungseinstiegspunkt
setup-entry.ts ist eine schlanke Alternative zu index.ts, die OpenClaw lädt, wenn nur Einrichtungsoberflächen benötigt werden (Onboarding, Konfigurationsreparatur, Prüfung deaktivierter Kanäle):
// setup-entry.ts export default defineSetupPluginEntry(myChannelPlugin);Dadurch wird vermieden, dass umfangreicher Laufzeitcode (Kryptografiebibliotheken, CLI-Registrierungen, Hintergrunddienste) während der Einrichtungsabläufe geladen wird.
Gebündelte Workspace-Kanäle, die einrichtungssichere Exporte in Sidecar-Modulen aufbewahren, können defineBundledChannelSetupEntry(...) aus openclaw/plugin-sdk/channel-entry-contract anstelle von defineSetupPluginEntry(...) verwenden. Dieser gebündelte Vertrag unterstützt außerdem einen optionalen runtime-Export, sodass die Laufzeitverdrahtung während der Einrichtung schlank und explizit bleiben kann.
Wann OpenClaw setupEntry anstelle des vollständigen Einstiegspunkts verwendet
- Der Kanal ist deaktiviert, benötigt jedoch Einrichtungs-/Onboarding-Oberflächen.
- Der Kanal ist aktiviert, aber nicht konfiguriert.
- Das verzögerte Laden ist aktiviert (
deferConfiguredChannelFullLoadUntilAfterListen).
Was setupEntry registrieren muss
- Das Kanal-Plugin-Objekt (über
defineSetupPluginEntry). - Alle vor dem Lauschen des Gateways erforderlichen HTTP-Routen.
- Alle während des Starts benötigten Gateway-Methoden.
Diese Gateway-Methoden für den Start sollten weiterhin reservierte zentrale Administrator-Namensräume wie config.* oder update.* vermeiden.
Was setupEntry NICHT enthalten sollte
- CLI-Registrierungen.
- Hintergrunddienste.
- Umfangreiche Laufzeitimporte (Kryptografie, SDKs).
- Gateway-Methoden, die erst nach dem Start benötigt werden.
Schmale Importe für Einrichtungshilfen
Bevorzugen Sie für häufig ausgeführte, ausschließlich der Einrichtung dienende Pfade die schmalen Schnittstellen für Einrichtungshilfen gegenüber dem umfassenderen plugin-sdk/setup-Dachmodul, wenn Sie nur einen Teil der Einrichtungsoberfläche benötigen:
| Importpfad | Verwendungszweck | Wichtige Exporte |
|---|---|---|
plugin-sdk/setup-runtime |
Laufzeithilfen für die Einrichtung, die in setupEntry / beim verzögerten Kanalstart verfügbar bleiben |
createSetupTranslator, createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy |
plugin-sdk/setup-tools |
Hilfen für Einrichtungs-/Installations-CLI, Archive und Dokumentation | formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR |
Verwenden Sie die umfassendere plugin-sdk/setup-Schnittstelle, wenn Sie den vollständigen gemeinsamen Einrichtungswerkzeugkasten benötigen, einschließlich Hilfen für Konfigurations-Patches wie moveSingleAccountChannelSectionToDefaultAccount(...).
Verwenden Sie createSetupTranslator(...) für feste Texte des Einrichtungsassistenten. Dabei wird der erste nicht leere Wert aus OPENCLAW_LOCALE, LC_ALL, LC_MESSAGES und LANG in dieser Reihenfolge verwendet; anschließend wird auf Englisch zurückgegriffen. Setzen Sie OPENCLAW_LOCALE=en, um Englisch ausdrücklich zu erzwingen. Bewahren Sie Plugin-spezifische Einrichtungstexte im Plugin-eigenen Code auf und verwenden Sie gemeinsame Katalogschlüssel nur für allgemeine Einrichtungsbeschriftungen, Statustexte und offizielle Einrichtungstexte gebündelter Plugins.
Die Adapter für Einrichtungs-Patches bleiben beim Import für häufig ausgeführte Pfade geeignet. Die Suche nach der Vertragsoberfläche für die gebündelte Heraufstufung eines Einzelkontos erfolgt verzögert, sodass der Import von plugin-sdk/setup-runtime die Erkennung gebündelter Vertragsoberflächen nicht vorzeitig lädt, bevor der Adapter tatsächlich verwendet wird.
Kanaleigene Eingabefelder für die Einrichtung
ChannelSetupInput ist ein generischer Umschlag, den Einrichtungsaufrufer und Kanal-
Plugins gemeinsam verwenden. Seine dauerhaft typisierten Felder sind name, token, tokenFile,
useEnv, allowFrom und defaultTo. Zusätzliche Plugin-eigene Schlüssel können weiterhin
im Laufzeiteingabeobjekt vorhanden sein, der gemeinsame Typ deklariert jedoch keine
Indexsignatur. Jedes Plugin muss seine eigenen Einrichtungsfelder deklarieren und eingrenzen oder
sie an der Adaptergrenze mit einem Plugin-eigenen Schema validieren:
type AcmeSetupInput = ChannelSetupInput & { workspaceId?: string; webhookUrl?: string;}; export const acmeSetupAdapter: ChannelSetupAdapter = { applyAccountConfig: ({ cfg, input }) => { const setupInput = input as AcmeSetupInput; return { ...cfg, channels: { ...cfg.channels, acme: { token: setupInput.token, workspaceId: setupInput.workspaceId, webhookUrl: setupInput.webhookUrl, }, }, }; },};Kanalspezifische Felder, die zuvor direkt auf
ChannelSetupInput deklariert wurden, bleiben vorübergehend typisiert, um die Kompatibilität mit externem Quellcode zu gewährleisten.
Sie sind veraltet. Bei einer Registry-Überprüfung am 2026-07-22 von 426 veröffentlichten, außerhalb des Repositorys verwalteten
Kanal-Plugins wurden 21 Felder ohne Leser entfernt und 22 mit bekannten
Lesern beibehalten. Jedes beibehaltene Feld wird gelöscht, sobald kein veröffentlichtes Plugin es mehr liest;
eine Versionsgrenze ist nicht erforderlich. Neue und gebündelte Plugins dürfen sich nicht auf diese
Ebene verlassen; deklarieren Sie die Felder, deren Eigentümer sie sind, lokal.
Kanaleigene Überführung eines Einzelkontos
Wenn ein Kanal von einer Einzelkonto-Konfiguration auf oberster Ebene auf channels.<id>.accounts.* umgestellt wird, verschiebt das standardmäßige gemeinsame Verhalten die überführten kontobezogenen Werte nach accounts.default.
Jedes Kanal-Plugin kann diese Überführung über seinen Setup-Adapter erweitern oder einschränken:
singleAccountKeysToMove: zusätzliche Schlüssel auf oberster Ebene, die in das überführte Konto verschoben werden sollennamedAccountPromotionKeys: wenn bereits benannte Konten vorhanden sind, werden nur diese Schlüssel in das überführte Konto verschoben; gemeinsame Richtlinien-/Zustellungsschlüssel verbleiben im KanalstammresolveSingleAccountPromotionTarget(...): legt fest, welches bestehende Konto die überführten Werte erhält
Das Vorhandensein von singleAccountKeysToMove kennzeichnet den Überführungsvertrag als vollständig. Deklarieren Sie das Feld auch dann, wenn es sich um ein leeres Array handelt, um die Überführung veralteter Schlüssel zu deaktivieren. Adapter, die das Feld auslassen, behalten für bereits veröffentlichte Plugins eine lesergestützte Überführungsebene aus der Zeit vor der Deklaration bei. Bei der Registry-Überprüfung am 2026-07-22 wurden 23 Schlüssel ohne veröffentlichte Abhängige entfernt und sechs gängige Schlüssel sowie der ausschließlich für das Setup verwendete Schlüssel rooms beibehalten. Jeder beibehaltene Schlüssel wird gelöscht, sobald seine veröffentlichten Leser zu Deklarationen migriert wurden; eine Versionsgrenze ist nicht erforderlich.
Deklarieren Sie openclaw.setupFeatures.configPromotion: true im Paketmanifest des Plugins, wenn Doctor diese Deklarationen aus dem schlanken gebündelten Setup-Artefakt laden muss. Die ausschließlich für das Setup vorgesehene Plugin-Oberfläche und das vollständige Kanal-Plugin müssen dieselben Deklarationen bereitstellen.
Wenn Sie moveSingleAccountChannelSectionToDefaultAccount(...) mit einem bereits aufgelösten Plugin aufrufen, übergeben Sie dessen Setup-Adapter als setupSurface. Vom Aufrufer bereitgestellte Setup-Oberflächen haben Vorrang vor geladenen und gebündelten Suchmechanismen, wodurch bereichsgebundene oder ausschließlich für das Setup vorgesehene Plugins unabhängig von der globalen Registrierung bleiben.
Konfigurationsschema
Die Plugin-Konfiguration wird anhand des JSON-Schemas in Ihrem Manifest validiert. Benutzer konfigurieren Plugins über:
{ plugins: { entries: { "my-plugin": { config: { webhookSecret: "abc123", }, }, }, },}Ihr Plugin erhält diese Konfiguration während der Registrierung als api.pluginConfig.
Verwenden Sie für kanalspezifische Konfigurationen stattdessen den Abschnitt für die Kanalkonfiguration:
{ channels: { "my-channel": { token: "bot-token", allowFrom: ["user1", "user2"], }, },}Erstellen von Schemas für Kanalkonfigurationen
Verwenden Sie buildChannelConfigSchema, um ein Zod-Schema in den von Plugin-eigenen Konfigurationsartefakten verwendeten ChannelConfigSchema-Wrapper umzuwandeln:
const accountSchema = z.object({ token: z.string().optional(), allowFrom: z.array(z.string()).optional(), accounts: z.object({}).catchall(z.any()).optional(), defaultAccount: z.string().optional(),}); const configSchema = buildChannelConfigSchema(accountSchema);Wenn Sie den Vertrag bereits als JSON-Schema oder TypeBox erstellen, verwenden Sie den direkten Helfer, damit OpenClaw die Konvertierung von Zod in JSON-Schema auf Metadatenpfaden überspringen kann:
const configSchema = buildJsonChannelConfigSchema( Type.Object({ token: Type.Optional(Type.String()), allowFrom: Type.Optional(Type.Array(Type.String())), }),);Für Drittanbieter-Plugins bleibt das Plugin-Manifest der Vertrag für den Kaltpfad: Spiegeln Sie das generierte JSON-Schema in openclaw.plugin.json#channelConfigs, damit Konfigurationsschema-, Setup- und UI-Oberflächen channels.<id> untersuchen können, ohne Laufzeitcode zu laden.
Setup-Assistenten
Kanal-Plugins können interaktive Setup-Assistenten für openclaw onboard bereitstellen. Der Assistent ist ein ChannelSetupWizard-Objekt auf dem ChannelPlugin:
const setupWizard: ChannelSetupWizard = { channel: "my-channel", status: { configuredLabel: "Connected", unconfiguredLabel: "Not configured", resolveConfigured: ({ cfg }) => Boolean((cfg.channels as any)?.["my-channel"]?.token), }, credentials: [ { inputKey: "token", providerHint: "my-channel", credentialLabel: "Bot token", preferredEnvVar: "MY_CHANNEL_BOT_TOKEN", envPrompt: "Use MY_CHANNEL_BOT_TOKEN from environment?", keepPrompt: "Keep current token?", inputPrompt: "Enter your bot token:", inspect: ({ cfg, accountId }) => { const token = (cfg.channels as any)?.["my-channel"]?.token; return { accountConfigured: Boolean(token), hasConfiguredValue: Boolean(token), }; }, }, ],};ChannelSetupWizard unterstützt außerdem textInputs, dmPolicy, allowFrom, groupAccess, prepare, finalize und mehr. Ein vollständiges gebündeltes Beispiel finden Sie unter src/setup-core.ts des Discord-Plugins.
Gemeinsame allowFrom-Eingabeaufforderungen
Verwenden Sie für Eingabeaufforderungen zu DM-Zulassungslisten, die nur den standardmäßigen Ablauf note -> prompt -> parse -> merge -> patch benötigen, vorzugsweise die gemeinsamen Setup-Helfer createPromptParsedAllowFromForAccount(...) und createTopLevelChannelParsedAllowFromPrompt(...) aus openclaw/plugin-sdk/setup.
Standardstatus der Kanaleinrichtung
Verwenden Sie für Statusblöcke der Kanaleinrichtung, die sich nur durch Beschriftungen, Bewertungen und optionale zusätzliche Zeilen unterscheiden, vorzugsweise createStandardChannelSetupStatus(...) aus openclaw/plugin-sdk/setup, anstatt dasselbe status-Objekt in jedem Plugin manuell zu erstellen.
Optionale Oberfläche zur Kanaleinrichtung
Verwenden Sie für optionale Setup-Oberflächen, die nur in bestimmten Kontexten angezeigt werden sollen, createOptionalChannelSetupSurface aus openclaw/plugin-sdk/channel-setup:
import { createOptionalChannelSetupSurface } from "openclaw/plugin-sdk/channel-setup"; const setupSurface = createOptionalChannelSetupSurface({ channel: "my-channel", label: "My Channel", npmSpec: "@myorg/openclaw-my-channel", docsPath: "/channels/my-channel",});// Returns { setupAdapter, setupWizard }plugin-sdk/channel-setup stellt außerdem die untergeordneten Builder createOptionalChannelSetupAdapter(...) und createOptionalChannelSetupWizard(...) bereit, wenn Sie nur eine Hälfte dieser optionalen Installationsoberfläche benötigen.
Der generierte optionale Adapter/Assistent schlägt bei tatsächlichen Schreibvorgängen der Konfiguration sicher geschlossen fehl. Für validateInput, applyAccountConfig und finalize wird dieselbe Meldung über die erforderliche Installation wiederverwendet; außerdem wird ein Dokumentationslink angehängt, wenn docsPath gesetzt ist.
Binärdateigestützte Setup-Helfer
Verwenden Sie für binärdateigestützte Setup-UIs vorzugsweise die gemeinsamen delegierten Helfer, anstatt dieselbe Verknüpfungslogik für Binärdatei und Status in jeden Kanal zu kopieren:
createDetectedBinaryStatus(...)für Statusblöcke, die sich nur durch Beschriftungen, Hinweise, Bewertungen und Binärdateierkennung unterscheidencreateCliPathTextInput(...)für pfadgestützte TexteingabencreateDelegatedSetupWizardProxy(...), wennsetupEntryStatus-, Vorbereitungs- oder Abschlussverhalten verzögert an einen umfangreicheren vollständigen Assistenten weiterleiten musscreateDelegatedTextInputShouldPrompt(...), wennsetupEntrylediglich einetextInputs[*].shouldPrompt-Entscheidung delegieren muss
Veröffentlichen und Installieren
Externe Plugins: Veröffentlichen Sie sie auf ClawHub und installieren Sie sie anschließend:
npm
openclaw plugins install @myorg/openclaw-my-pluginReine Paketspezifikationen werden während der Umstellung beim Start von npm installiert, es sei denn, der Name entspricht einer gebündelten oder offiziellen Plugin-ID; in diesem Fall verwendet OpenClaw stattdessen die lokale/offizielle Kopie. Verwenden Sie clawhub:, npm:, git: oder npm-pack: für eine deterministische Quellenauswahl – siehe Plugins verwalten.
Nur ClawHub
openclaw plugins install clawhub:@myorg/openclaw-my-pluginnpm-Paketspezifikation
Verwenden Sie npm, wenn ein Paket noch nicht zu ClawHub verschoben wurde oder wenn Sie während der Migration einen direkten npm-Installationspfad benötigen:
openclaw plugins install npm:@myorg/openclaw-my-pluginPlugins im Repository: Platzieren Sie sie im gebündelten Plugin-Workspace-Baum; sie werden während des Builds automatisch erkannt.
Gebündelte Paketmetadaten werden explizit angegeben und beim Start des Gateway nicht aus dem erstellten JavaScript abgeleitet. Laufzeitabhängigkeiten gehören in das Plugin-Paket, dessen Eigentümer sie sind; der Start einer paketierten OpenClaw-Installation repariert oder spiegelt niemals Plugin-Abhängigkeiten.
Verwandte Themen
- Plugins erstellen — schrittweise Einführung
- Plugin-Manifest — vollständige Referenz zum Manifestschema
- SDK-Einstiegspunkte —
definePluginEntryunddefineChannelPluginEntry