Plugin SDK reference

Plugin-Einrichtung und -Konfiguration

Referenz für Plugin-Paketierung (package.json-Metadaten), Manifeste (openclaw.plugin.json), Einrichtungseinträge und Konfigurationsschemas.

Paketmetadaten

Ihre package.json benötigt ein openclaw-Feld, das dem Plugin-System mitteilt, was Ihr Plugin bereitstellt:

Channel plugin

json
{  "name": "@myorg/openclaw-my-channel",  "version": "1.0.0",  "type": "module",  "openclaw": {    "extensions": ["./index.ts"],    "setupEntry": "./setup-entry.ts",    "channel": {      "id": "my-channel",      "label": "My Channel",      "blurb": "Short description of the channel."    }  }}

Provider plugin / ClawHub baseline

openclaw-clawhub-package.json
{  "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 Paket-Root).

setupEntrystring

Leichtgewichtiger Einstieg nur für die Einrichtung (optional).

channelobject

Kanalkatalog-Metadaten für Einrichtungs-, Auswahl-, Schnellstart- und Statusoberflächen.

providersstring[]

Von diesem Plugin registrierte Provider-IDs.

installobject

Installationshinweise: npmSpec, localPath, defaultChoice, minHostVersion, expectedIntegrity, allowInvalidConfigRecovery.

startupobject

Flags für das Startverhalten.

openclaw.channel

openclaw.channel sind schlanke Paketmetadaten für die Kanalerkennung und Einrichtungsoberflächen, bevor die Laufzeit lädt.

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 Überschreibt die für Dokumentationslinks verwendete Bezeichnung, 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-/System-Image-Name für Kanal-UI-Kataloge.
selectionDocsPrefix string Präfixtext vor Dokumentationslinks in Auswahloberflächen.
selectionDocsOmitLabel boolean Zeigt den Dokumentationspfad direkt statt eines beschrifteten Dokumentationslinks im Auswahltext an.
selectionExtras string[] Zusätzliche kurze Zeichenfolgen, die im Auswahltext angehängt werden.
markdownCapable boolean Markiert den Kanal als Markdown-fähig für Entscheidungen zur ausgehenden Formatierung.
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, auch wenn nur ein Konto vorhanden ist.
preferSessionLookupForAnnounceTarget boolean Bevorzugt die Sitzungssuche beim Auflösen von Ankündigungszielen für diesen Kanal.

Beispiel:

json
{  "openclaw": {    "channel": {      "id": "my-channel",      "label": "My Channel",      "selectionLabel": "My Channel (self-hosted)",      "detailLabel": "My Channel Bot",      "docsPath": "/channels/my-channel",      "docsLabel": "my-channel",      "blurb": "Webhook-based self-hosted chat integration.",      "order": 80,      "aliases": ["mc"],      "preferOver": ["my-channel-legacy"],      "selectionDocsPrefix": "Guide:",      "selectionExtras": ["Markdown"],      "markdownCapable": true,      "exposure": {        "configured": true,        "setup": true,        "docs": true      },      "quickstartAllowFrom": true    }  }}

exposure unterstützt:

  • configured: Kanal in konfigurierten/statusähnlichen Listenoberflächen einschließen
  • setup: Kanal in interaktive Einrichtungs-/Konfigurationsauswahlen einschließen
  • docs: Kanal in Dokumentations-/Navigationsoberflächen als öffentlich markieren

openclaw.install

openclaw.install sind Paketmetadaten, keine Manifestmetadaten.

Feld Typ Bedeutung
clawhubSpec string Kanonische ClawHub-Spezifikation für Installations-/Aktualisierungs- und Onboarding-Install-on-Demand-Abläufe.
npmSpec string Kanonische npm-Spezifikation für Installations-/Aktualisierungs-Fallback-Abläufe.
localPath string Lokaler Entwicklungs- oder gebündelter Installationspfad.
defaultChoice "clawhub" | "npm" | "local" Bevorzugte Installationsquelle, wenn mehrere Quellen verfügbar sind.
minHostVersion string Minimal unterstützte OpenClaw-Version in der Form >=x.y.z oder >=x.y.z-prerelease.
expectedIntegrity string Erwartete npm-Dist-Integritätszeichenfolge, normalerweise sha512-..., für angeheftete Installationen.
allowInvalidConfigRecovery boolean Ermöglicht Neuinstallationsabläufen gebündelter Plugins die Wiederherstellung nach bestimmten veralteten Konfigurationsfehlern.
requiredPlatformPackages string[] Erforderliche plattformspezifische npm-Aliase, die während der npm-Installation geprüft werden.
Onboarding behavior

Interaktives Onboarding verwendet openclaw.install auch für Install-on-Demand-Oberflächen. Wenn Ihr Plugin Provider-Authentifizierungsoptionen oder Kanaleinrichtungs-/Katalogmetadaten verfügbar macht, bevor die Laufzeit lädt, kann das Onboarding diese Option anzeigen, zur ClawHub-, npm- oder lokalen Installation auffordern, das Plugin installieren oder aktivieren und dann mit dem ausgewählten Ablauf fortfahren. ClawHub-Onboarding-Optionen verwenden clawhubSpec und werden bevorzugt, wenn vorhanden; npm-Optionen erfordern vertrauenswürdige Katalogmetadaten mit einer Registry-npmSpec; exakte Versionen und expectedIntegrity sind optionale npm-Pins. Wenn expectedIntegrity vorhanden ist, erzwingen Installations-/Aktualisierungsabläufe sie für npm. Bewahren Sie die „was anzeigen“-Metadaten in openclaw.plugin.json und die „wie installieren“-Metadaten in package.json auf.

minHostVersion enforcement

Wenn minHostVersion gesetzt ist, erzwingen sowohl Installation als auch nicht gebündeltes Laden aus der Manifest-Registry diese Version. Ältere Hosts überspringen externe Plugins; ungültige Versionszeichenfolgen werden abgelehnt. Gebündelte Quell-Plugins gelten als mit dem Host-Checkout gleich versioniert.

Pinned npm installs

Für angeheftete npm-Installationen behalten Sie die exakte Version in npmSpec bei und fügen die erwartete Artefaktintegrität hinzu:

json
{  "openclaw": {    "install": {      "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3",      "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY",      "defaultChoice": "npm"    }  }}
allowInvalidConfigRecovery scope

allowInvalidConfigRecovery ist keine allgemeine Umgehung für defekte Konfigurationen. Es ist nur für eng begrenzte Wiederherstellung gebündelter Plugins gedacht, damit Neuinstallation/Einrichtung bekannte Upgrade-Reste wie einen fehlenden gebündelten Plugin-Pfad oder einen veralteten channels.<id>-Eintrag für dasselbe Plugin reparieren kann. Wenn die Konfiguration aus anderen Gründen defekt ist, schlägt die Installation weiterhin geschlossen fehl und weist den Operator an, openclaw doctor --fix auszuführen.

Aufgeschobenes vollständiges Laden

Kanal-Plugins können das aufgeschobene Laden aktivieren mit:

json
{  "openclaw": {    "extensions": ["./index.ts"],    "setupEntry": "./setup-entry.ts",    "startup": {      "deferConfiguredChannelFullLoadUntilAfterListen": true    }  }}

Wenn aktiviert, lädt OpenClaw während der Startphase vor dem Listen nur setupEntry, auch für bereits konfigurierte Kanäle. Der vollständige Einstieg wird geladen, nachdem der Gateway zu lauschen beginnt.

Wenn Ihr Einrichtungs-/vollständiger Einstieg Gateway-RPC-Methoden registriert, halten Sie sie auf einem Plugin-spezifischen Präfix. Reservierte Core-Admin-Namespaces (config.*, exec.approvals.*, wizard.*, update.*) bleiben Core-eigen und werden immer zu operator.admin aufgelöst.

Plugin-Manifest

Jedes native Plugin muss ein openclaw.plugin.json im Paket-Root ausliefern. OpenClaw verwendet dies, um die Konfiguration zu validieren, ohne Plugin-Code auszuführen.

json
{  "id": "my-plugin",  "name": "My Plugin",  "description": "Adds My Plugin capabilities to OpenClaw",  "configSchema": {    "type": "object",    "additionalProperties": false,    "properties": {      "webhookSecret": {        "type": "string",        "description": "Webhook verification secret"      }    }  }}

Fügen Sie für Kanal-Plugins kind und channels hinzu:

json
{  "id": "my-channel",  "kind": "channel",  "channels": ["my-channel"],  "configSchema": {    "type": "object",    "additionalProperties": false,    "properties": {}  }}

Auch Plugins ohne Konfiguration müssen ein Schema ausliefern. Ein leeres Schema ist gültig:

json
{  "id": "my-plugin",  "configSchema": {    "type": "object",    "additionalProperties": false  }}

Siehe Plugin-Manifest für die vollständige Schema-Referenz.

ClawHub-Veröffentlichung

Verwenden Sie für Plugin-Pakete den paketspezifischen ClawHub-Befehl:

bash
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-plugin

Setup-Einstiegspunkt

Die Datei setup-entry.ts ist eine schlanke Alternative zu index.ts, die OpenClaw lädt, wenn nur Setup-Oberflächen benötigt werden (Onboarding, Konfigurationsreparatur, Prüfung deaktivierter Kanäle).

typescript
// setup-entry.ts  export default defineSetupPluginEntry(myChannelPlugin);

Dadurch wird vermieden, dass umfangreicher Runtime-Code (Kryptobibliotheken, CLI-Registrierungen, Hintergrunddienste) während Setup-Abläufen geladen wird.

Gebündelte Workspace-Kanäle, die setup-sichere Exporte in Sidecar-Modulen halten, können statt defineSetupPluginEntry(...) defineBundledChannelSetupEntry(...) aus openclaw/plugin-sdk/channel-entry-contract verwenden. Dieser gebündelte Vertrag unterstützt außerdem einen optionalen runtime-Export, damit die Runtime-Verdrahtung zur Setup-Zeit schlank und explizit bleiben kann.

Wann OpenClaw setupEntry statt des vollständigen Einstiegspunkts verwendet
  • Der Kanal ist deaktiviert, benötigt aber Setup-/Onboarding-Oberflächen.
  • Der Kanal ist aktiviert, aber nicht konfiguriert.
  • Verzögertes Laden ist aktiviert (deferConfiguredChannelFullLoadUntilAfterListen).
Was setupEntry registrieren muss
  • Das Kanal-Plugin-Objekt (über defineSetupPluginEntry).
  • Alle HTTP-Routen, die vor dem Gateway-Listen erforderlich sind.
  • Alle Gateway-Methoden, die während des Starts benötigt werden.

Diese Startup-Gateway-Methoden sollten weiterhin reservierte Core-Admin-Namensräume wie config.* oder update.* vermeiden.

Was setupEntry NICHT enthalten sollte
  • CLI-Registrierungen.
  • Hintergrunddienste.
  • Umfangreiche Runtime-Importe (Krypto, SDKs).
  • Gateway-Methoden, die erst nach dem Start benötigt werden.

Schmale Setup-Hilfsimporte

Bevorzugen Sie für heiße reine Setup-Pfade die schmalen Setup-Hilfs-Seams gegenüber dem breiteren plugin-sdk/setup-Umbrella, wenn Sie nur einen Teil der Setup-Oberfläche benötigen:

Importpfad Verwenden für Wichtige Exporte
plugin-sdk/setup-runtime Runtime-Helfer zur Setup-Zeit, die in setupEntry / beim verzögerten Kanalstart verfügbar bleiben createSetupTranslator, createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy
plugin-sdk/setup-adapter-runtime veralteter Kompatibilitätsalias; verwenden Sie plugin-sdk/setup-runtime createEnvPatchedAccountSetupAdapter
plugin-sdk/setup-tools Setup-/Installations-CLI-/Archiv-/Dokumentationshelfer formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR

Verwenden Sie den breiteren plugin-sdk/setup-Seam, wenn Sie die vollständige gemeinsame Setup-Toolbox einschließlich Konfigurations-Patch-Helfern wie moveSingleAccountChannelSectionToDefaultAccount(...) benötigen.

Verwenden Sie createSetupTranslator(...) für feste Texte des Setup-Assistenten. Er folgt der CLI-Assistenten-Locale (OPENCLAW_LOCALE, dann System-Locale-Variablen) und fällt auf Englisch zurück. Halten Sie Plugin-spezifischen Setup-Text in Plugin-eigenem Code und verwenden Sie gemeinsame Katalogschlüssel nur für allgemeine Setup-Labels, Statustexte und offizielle Setup-Texte gebündelter Plugins.

Die Setup-Patch-Adapter bleiben beim Import für Hot Paths sicher. Ihre gebündelte Contract-Surface-Suche für Single-Account-Promotion ist lazy, sodass der Import von plugin-sdk/setup-runtime die gebündelte Contract-Surface-Ermittlung nicht vorab lädt, bevor der Adapter tatsächlich verwendet wird.

Kanal-eigene Single-Account-Promotion

Wenn ein Kanal von einer Single-Account-Konfiguration auf oberster Ebene auf channels.<id>.accounts.* aktualisiert, verschiebt das gemeinsame Standardverhalten hochgestufte account-bezogene Werte nach accounts.default.

Gebündelte Kanäle können diese Promotion über ihre Setup-Contract-Surface einschränken oder überschreiben:

  • singleAccountKeysToMove: zusätzliche Schlüssel auf oberster Ebene, die in den hochgestuften Account verschoben werden sollen
  • namedAccountPromotionKeys: wenn benannte Accounts bereits vorhanden sind, werden nur diese Schlüssel in den hochgestuften Account verschoben; gemeinsame Policy-/Delivery-Schlüssel bleiben am Kanal-Root
  • resolveSingleAccountPromotionTarget(...): wählt aus, welcher vorhandene Account hochgestufte Werte erhält

Konfigurationsschema

Die Plugin-Konfiguration wird gegen das JSON Schema in Ihrem Manifest validiert. Benutzer konfigurieren Plugins über:

json5
{  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 Konfiguration stattdessen den Kanal-Konfigurationsabschnitt:

json5
{  channels: {    "my-channel": {      token: "bot-token",      allowFrom: ["user1", "user2"],    },  },}

Kanal-Konfigurationsschemas erstellen

Verwenden Sie buildChannelConfigSchema, um ein Zod-Schema in den ChannelConfigSchema-Wrapper zu konvertieren, der von Plugin-eigenen Konfigurationsartefakten verwendet wird:

typescript
  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 verfassen, verwenden Sie den direkten Helfer, damit OpenClaw die Zod-zu-JSON-Schema-Konvertierung auf Metadatenpfaden überspringen kann:

typescript
  const configSchema = buildJsonChannelConfigSchema(  Type.Object({    token: Type.Optional(Type.String()),    allowFrom: Type.Optional(Type.Array(Type.String())),  }),);

Für Drittanbieter-Plugins bleibt der Cold-Path-Vertrag weiterhin das Plugin-Manifest: Spiegeln Sie das generierte JSON Schema in openclaw.plugin.json#channelConfigs, damit Konfigurationsschema, Setup und UI-Oberflächen channels.<id> prüfen können, ohne Runtime-Code 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:

typescript
 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),        };      },    },  ],};

Der Typ ChannelSetupWizard unterstützt credentials, textInputs, dmPolicy, allowFrom, groupAccess, prepare, finalize und mehr. Vollständige Beispiele finden Sie in gebündelten Plugin-Paketen (zum Beispiel im Discord-Plugin src/channel.setup.ts).

Gemeinsame allowFrom-Prompts

Bevorzugen Sie für DM-Allowlist-Prompts, die nur den Standardablauf note -> prompt -> parse -> merge -> patch benötigen, die gemeinsamen Setup-Helfer aus openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...), createTopLevelChannelParsedAllowFromPrompt(...) und createNestedChannelParsedAllowFromPrompt(...).

Standardmäßiger Kanal-Setup-Status

Bevorzugen Sie für Kanal-Setup-Statusblöcke, die sich nur nach Labels, Scores und optionalen Zusatzzeilen unterscheiden, createStandardChannelSetupStatus(...) aus openclaw/plugin-sdk/setup, statt dasselbe status-Objekt in jedem Plugin von Hand zu erstellen.

Optionale Kanal-Setup-Oberfläche

Verwenden Sie für optionale Setup-Oberflächen, die nur in bestimmten Kontexten erscheinen sollen, createOptionalChannelSetupSurface aus openclaw/plugin-sdk/channel-setup:

typescript
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 niedrigeren 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 echten Konfigurationsschreibvorgängen geschlossen fehl. Er verwendet dieselbe Meldung zur erforderlichen Installation über validateInput, applyAccountConfig und finalize hinweg wieder und hängt einen Dokumentationslink an, wenn docsPath gesetzt ist.

Setup-Helfer mit Binary-Unterstützung

Bevorzugen Sie für Binary-gestützte Setup-UIs die gemeinsamen delegierten Helfer, statt denselben Binary-/Status-Code in jeden Kanal zu kopieren:

  • createDetectedBinaryStatus(...) für Statusblöcke, die sich nur durch Labels, Hinweise, Scores und binäre Erkennung unterscheiden
  • createCliPathTextInput(...) für pfadgestützte Texteingaben
  • createDelegatedSetupWizardStatusResolvers(...), createDelegatedPrepare(...), createDelegatedFinalize(...) und createDelegatedResolveConfigured(...), wenn setupEntry bei Bedarf verzögert an einen umfangreicheren vollständigen Assistenten weiterleiten muss
  • createDelegatedTextInputShouldPrompt(...), wenn setupEntry nur eine textInputs[*].shouldPrompt-Entscheidung delegieren muss

Veröffentlichen und Installieren

Externe Plugins: In ClawHub veröffentlichen, dann installieren:

npm

bash
openclaw plugins install @myorg/openclaw-my-plugin

Paketangaben ohne Präfix installieren während der Startumstellung von npm.

Nur ClawHub

bash
openclaw plugins install clawhub:@myorg/openclaw-my-plugin

npm-Paketangabe

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:

bash
openclaw plugins install npm:@myorg/openclaw-my-plugin

Plugins im Repository: Legen Sie sie unter dem gebündelten Plugin-Workspace-Baum ab; sie werden während des Builds automatisch erkannt.

Benutzer können installieren:

bash
openclaw plugins install <package-name>

Gebündelte Paketmetadaten sind explizit und werden beim Gateway-Start nicht aus gebautem JavaScript abgeleitet. Laufzeitabhängigkeiten gehören in das Plugin-Paket, dem sie gehören; der Start des paketierten OpenClaw repariert oder spiegelt Plugin-Abhängigkeiten nie.

Verwandte Themen

Was this useful?
On this page

On this page