Plugin SDK reference
Plugin-Einrichtung und -Konfiguration
Referenz für Plugin-Paketierung (package.json-Metadaten), Manifeste (openclaw.plugin.json), Setup-Einträge und Konfigurationsschemas.
Paketmetadaten
Ihre package.json benötigt ein openclaw-Feld, das dem Plugin-System mitteilt, was Ihr Plugin bereitstellt:
Channel 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": "My Channel", "blurb": "Short description of the channel." } }}Provider plugin / ClawHub baseline
{ "name": "@myorg/openclaw-my-plugin", "version": "1.0.0", "type": "module", "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 zur Paketwurzel).
setupEntrystringLeichtgewichtiger reiner Setup-Einstieg (optional).
channelobjectKanal-Katalogmetadaten für Setup-, Auswahl-, Schnellstart- und Statusoberflächen.
providersstring[]Provider-IDs, die von diesem Plugin registriert werden.
installobjectInstallationshinweise: npmSpec, localPath, defaultChoice, minHostVersion, expectedIntegrity, allowInvalidConfigRecovery.
startupobjectFlags für das Startverhalten.
openclaw.channel
openclaw.channel sind einfache Paketmetadaten für Kanalerkennung und Setup-Oberflächen, bevor die Laufzeit geladen wird.
| Feld | Typ | Bedeutung |
|---|---|---|
id |
string |
Kanonische Kanal-ID. |
label |
string |
Primäre Kanalbezeichnung. |
selectionLabel |
string |
Auswahl-/Setup-Bezeichnung, wenn sie sich von label unterscheiden soll. |
detailLabel |
string |
Sekundäre Detailbezeichnung für umfangreichere Kanalkataloge und Statusoberflächen. |
docsPath |
string |
Dokumentationspfad für Setup- und Auswahllinks. |
docsLabel |
string |
Überschreibt die für Dokumentationslinks verwendete Bezeichnung, wenn sie sich von der Kanal-ID unterscheiden soll. |
blurb |
string |
Kurze Onboarding-/Katalogbeschreibung. |
order |
number |
Sortierreihenfolge in Kanalkatalogen. |
aliases |
string[] |
Zusätzliche Suchaliases 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 Kanal-UI-Kataloge. |
selectionDocsPrefix |
string |
Präfixtext vor Dokumentationslinks in Auswahloberflächen. |
selectionDocsOmitLabel |
boolean |
Zeigt in Auswahltexten den Dokumentationspfad direkt statt eines beschrifteten Dokumentationslinks. |
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 |
Steuert die Sichtbarkeit des Kanals für Setup-, konfigurierte Listen- und Dokumentationsoberflächen. |
quickstartAllowFrom |
boolean |
Bindet diesen Kanal in den standardmäßigen Schnellstart-Setup-Flow allowFrom ein. |
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. |
Beispiel:
{ "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: nimmt den Kanal in konfigurierte/statusartige Listenoberflächen aufsetup: nimmt den Kanal in interaktive Setup-/Konfigurationsauswahlen aufdocs: markiert den Kanal als öffentlich sichtbar in Dokumentations-/Navigationsoberflächen
openclaw.install
openclaw.install sind Paketmetadaten, keine Manifestmetadaten.
| Feld | Typ | Bedeutung |
|---|---|---|
clawhubSpec |
string |
Kanonische ClawHub-Spezifikation für Installations-/Update- und Onboarding-Install-on-Demand-Flows. |
npmSpec |
string |
Kanonische npm-Spezifikation für Installations-/Update-Fallback-Flows. |
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 im Format >=x.y.z oder >=x.y.z-prerelease. |
expectedIntegrity |
string |
Erwartete npm-Dist-Integritätszeichenfolge, normalerweise sha512-..., für gepinnte Installationen. |
allowInvalidConfigRecovery |
boolean |
Ermöglicht Neuinstallations-Flows gebündelter Plugins, bestimmte veraltete Konfigurationsfehler zu beheben. |
requiredPlatformPackages |
string[] |
Erforderliche plattformspezifische npm-Aliases, die während der npm-Installation verifiziert werden. |
Onboarding behavior
Interaktives Onboarding verwendet openclaw.install ebenfalls für Install-on-Demand-Oberflächen. Wenn Ihr Plugin Provider-Authentifizierungsoptionen oder Kanal-Setup-/Katalogmetadaten bereitstellt, bevor die Laufzeit geladen wird, kann das Onboarding diese Option anzeigen, zur Auswahl von ClawHub, npm oder lokaler Installation auffordern, das Plugin installieren oder aktivieren und dann mit dem ausgewählten Flow 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-/Update-Flows sie für npm. Halten Sie die Metadaten dazu, „was angezeigt werden soll“, in openclaw.plugin.json und die Metadaten dazu, „wie es installiert wird“, in package.json.
minHostVersion enforcement
Wenn minHostVersion gesetzt ist, erzwingen sowohl die Installation als auch das Laden der nicht gebündelten Manifest-Registry diese Version. Ältere Hosts überspringen externe Plugins; ungültige Versionszeichenfolgen werden abgelehnt. Gebündelte Quell-Plugins gelten als mit dem Host-Checkout gemeinsam versioniert.
Pinned npm installs
Behalten Sie für gepinnte 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" } }}allowInvalidConfigRecovery scope
allowInvalidConfigRecovery ist kein allgemeiner Bypass für defekte Konfigurationen. Es ist nur für die eng begrenzte Wiederherstellung gebündelter Plugins vorgesehen, damit Neuinstallation/Setup bekannte Upgrade-Reste wie einen fehlenden gebündelten Plugin-Pfad oder einen veralteten channels.<id>-Eintrag für dasselbe Plugin reparieren können. 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.
Verzögertes vollständiges Laden
Kanal-Plugins können verzögertes Laden aktivieren mit:
{ "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "startup": { "deferConfiguredChannelFullLoadUntilAfterListen": true } }}Wenn aktiviert, lädt OpenClaw während der Startphase vor dem Lauschen nur setupEntry, selbst für bereits konfigurierte Kanäle. Der vollständige Einstieg wird geladen, nachdem der Gateway begonnen hat zu lauschen.
Wenn Ihr Setup-/vollständiger Einstieg Gateway-RPC-Methoden registriert, behalten Sie sie unter einem Plugin-spezifischen Präfix. Reservierte Core-Admin-Namensräume (config.*, exec.approvals.*, wizard.*, update.*) bleiben Core-eigen und werden immer zu operator.admin aufgelöst.
Plugin-Manifest
Jedes native Plugin muss eine openclaw.plugin.json in der Paketwurzel ausliefern. OpenClaw verwendet diese Datei, um Konfiguration zu validieren, ohne Plugin-Code auszuführen.
{ "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:
{ "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:
{ "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:
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginSetup-Einstieg
Die Datei setup-entry.ts ist eine leichtgewichtige Alternative zu index.ts, die OpenClaw lädt, wenn nur Setup-Oberflächen benötigt werden (Onboarding, Konfigurationsreparatur, Inspektion deaktivierter Kanäle).
// setup-entry.ts export default defineSetupPluginEntry(myChannelPlugin);Dadurch wird vermieden, dass während Setup-Abläufen umfangreicher Laufzeitcode geladen wird (Kryptobibliotheken, CLI-Registrierungen, Hintergrunddienste).
Gebündelte Workspace-Kanäle, die setup-sichere Exporte in Sidecar-Modulen halten, können defineBundledChannelSetupEntry(...) aus openclaw/plugin-sdk/channel-entry-contract statt defineSetupPluginEntry(...) verwenden. Dieser gebündelte Vertrag unterstützt außerdem einen optionalen runtime-Export, damit die Laufzeitverdrahtung zur Setup-Zeit leichtgewichtig und explizit bleiben kann.
Wann OpenClaw setupEntry statt des vollständigen Einstiegs 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 Start-Gateway-Methoden sollten weiterhin reservierte Kern-Admin-Namespaces wie config.* oder update.* vermeiden.
Was setupEntry NICHT enthalten sollte
- CLI-Registrierungen.
- Hintergrunddienste.
- Umfangreiche Laufzeitimporte (Krypto, SDKs).
- Gateway-Methoden, die erst nach dem Start benötigt werden.
Schmale Setup-Helper-Importe
Für heiße reine Setup-Pfade sollten Sie die schmalen Setup-Helper-Seams dem breiteren Umbrella plugin-sdk/setup vorziehen, wenn Sie nur einen Teil der Setup-Oberfläche benötigen:
| Importpfad | Verwenden Sie ihn für | Wichtige Exporte |
|---|---|---|
plugin-sdk/setup-runtime |
Laufzeit-Helper 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-/Doku-Helper | formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR |
Verwenden Sie den breiteren Seam plugin-sdk/setup, wenn Sie die vollständige gemeinsame Setup-Toolbox einschließlich Konfigurations-Patch-Helpern wie moveSingleAccountChannelSectionToDefaultAccount(...) benötigen.
Verwenden Sie createSetupTranslator(...) für feste Texte des Setup-Assistenten. Es folgt der
CLI-Assistenten-Locale (OPENCLAW_LOCALE, dann System-Locale-Variablen) und fällt
auf Englisch zurück. Halten Sie Plugin-spezifische Setup-Texte 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. Ihr gebündelter Single-Account-Promotion-Vertragsoberflächen-Lookup ist lazy, daher lädt der Import von plugin-sdk/setup-runtime die gebündelte Vertragsoberflächen-Erkennung nicht sofort, bevor der Adapter tatsächlich verwendet wird.
Kanalgesteuerte Single-Account-Promotion
Wenn ein Kanal von einer Single-Account-Konfiguration auf oberster Ebene auf channels.<id>.accounts.* aktualisiert wird, besteht das standardmäßige gemeinsame Verhalten darin, heraufgestufte kontospezifische Werte nach accounts.default zu verschieben.
Gebündelte Kanäle können diese Promotion über ihre Setup-Vertragsoberfläche einschränken oder überschreiben:
singleAccountKeysToMove: zusätzliche Schlüssel auf oberster Ebene, die in das heraufgestufte Konto verschoben werden sollennamedAccountPromotionKeys: wenn benannte Konten bereits existieren, werden nur diese Schlüssel in das heraufgestufte Konto verschoben; gemeinsame Richtlinien-/Auslieferungsschlüssel bleiben im Kanal-RootresolveSingleAccountPromotionTarget(...): wählt aus, welches vorhandene Konto heraufgestufte Werte erhält
Konfigurationsschema
Plugin-Konfiguration wird anhand des JSON Schema 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 Konfiguration stattdessen den Kanal-Konfigurationsabschnitt:
{ channels: { "my-channel": { token: "bot-token", allowFrom: ["user1", "user2"], }, },}Kanal-Konfigurationsschemas erstellen
Verwenden Sie buildChannelConfigSchema, um ein Zod-Schema in den ChannelConfigSchema-Wrapper umzuwandeln, der von Plugin-eigenen Konfigurationsartefakten verwendet wird:
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 Helper, damit OpenClaw auf Metadatenpfaden die Zod-zu-JSON-Schema-Konvertierung überspringen kann:
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 nach openclaw.plugin.json#channelConfigs, damit Konfigurationsschema, Setup und UI-Oberflächen channels.<id> inspizieren 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), }; }, }, ],};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
Für DM-Allowlist-Prompts, die nur den Standardablauf note -> prompt -> parse -> merge -> patch benötigen, sollten Sie die gemeinsamen Setup-Helper aus openclaw/plugin-sdk/setup bevorzugen: createPromptParsedAllowFromForAccount(...), createTopLevelChannelParsedAllowFromPrompt(...) und createNestedChannelParsedAllowFromPrompt(...).
Standardstatus für Kanal-Setup
Für Statusblöcke des Kanal-Setups, die nur nach Labels, Scores und optionalen Zusatzzeilen variieren, sollten Sie createStandardChannelSetupStatus(...) aus openclaw/plugin-sdk/setup bevorzugen, statt dasselbe status-Objekt in jedem Plugin selbst zu erstellen.
Optionale Kanal-Setup-Oberfläche
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 Low-Level-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 Installations-erforderlich-Meldung über validateInput, applyAccountConfig und finalize hinweg wieder und hängt einen Doku-Link an, wenn docsPath gesetzt ist.
Binary-gestützte Setup-Helper
Für Binary-gestützte Setup-UIs sollten Sie die gemeinsamen delegierten Helper bevorzugen, statt dieselbe Binary-/Status-Verklebung in jeden Kanal zu kopieren:
createDetectedBinaryStatus(...)für Statusblöcke, die nur nach Labels, Hinweisen, Scores und Binary-Erkennung variierencreateCliPathTextInput(...)für pfadgestützte TexteingabencreateDelegatedSetupWizardStatusResolvers(...),createDelegatedPrepare(...),createDelegatedFinalize(...)undcreateDelegatedResolveConfigured(...), wennsetupEntrylazy an einen umfangreicheren vollständigen Assistenten weiterleiten musscreateDelegatedTextInputShouldPrompt(...), wennsetupEntrynur eine Entscheidung fürtextInputs[*].shouldPromptdelegieren muss
Veröffentlichen und Installieren
Externe Plugins: Veröffentlichen Sie in ClawHub, installieren Sie dann:
npm
openclaw plugins install @myorg/openclaw-my-pluginPaketangaben ohne Präfix werden während der Einführungsumstellung von npm installiert.
ClawHub only
openclaw plugins install clawhub:@myorg/openclaw-my-pluginnpm package spec
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: Legen Sie sie im Workspace-Baum der gebündelten Plugins ab; sie werden beim Build automatisch erkannt.
Benutzer können installieren:
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 eines paketierten OpenClaw repariert oder spiegelt Plugin-Abhängigkeiten niemals.
Verwandte Themen
- Plugins erstellen — Schritt-für-Schritt-Leitfaden für den Einstieg
- Plugin-Manifest — vollständige Referenz zum Manifest-Schema
- SDK-Einstiegspunkte —
definePluginEntryunddefineChannelPluginEntry