Plugins
Plugin-Einrichtung und Konfiguration
Referenz für Plugin-Paketierung (package.json-Metadaten), Manifeste (openclaw.plugin.json), Setup-Einträge und Konfigurationsschemata.
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 zum Paketstamm).
setupEntrystringLeichter, nur für das Setup vorgesehener Eintrag (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 schlanke Paketmetadaten für die Kanalermittlung 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 |
Überschreibende Bezeichnung für Dokumentationslinks, wenn sie sich von der Kanal-ID unterscheiden 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 Kanal-UI-Kataloge. |
selectionDocsPrefix |
string |
Präfixtext vor Dokumentationslinks in Auswahloberflächen. |
selectionDocsOmitLabel |
boolean |
Den Dokumentationspfad in Auswahltexten direkt anzeigen statt eines beschrifteten Dokumentationslinks. |
selectionExtras |
string[] |
Zusätzliche kurze Zeichenfolgen, die im Auswahltext angehängt werden. |
markdownCapable |
boolean |
Kennzeichnet den Kanal als Markdown-fähig für ausgehende Formatierungsentscheidungen. |
exposure |
object |
Steuerelemente für die Sichtbarkeit des Kanals in Setup-, konfigurierten Listen- und Dokumentationsoberflächen. |
quickstartAllowFrom |
boolean |
Diesen Kanal für den Standard-Schnellstart-Setup-Flow allowFrom aktivieren. |
forceAccountBinding |
boolean |
Explizite Kontobindung erzwingen, auch wenn nur ein Konto existiert. |
preferSessionLookupForAnnounceTarget |
boolean |
Sitzungssuche beim Auflösen von Ankündigungszielen für diesen Kanal bevorzugen. |
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: den Kanal in konfigurierten/statusartigen Listenoberflächen aufnehmensetup: den Kanal in interaktive Setup-/Konfigurationsauswahlen aufnehmendocs: den Kanal in Dokumentations-/Navigationsoberflächen als öffentlich sichtbar markieren
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 Fallback-Flows bei Installation/Update. |
localPath |
string |
Lokaler Entwicklungs- oder gebündelter Installationspfad. |
defaultChoice |
"clawhub" | "npm" | "local" |
Bevorzugte Installationsquelle, wenn mehrere Quellen verfügbar sind. |
minHostVersion |
string |
Unterstützte Mindestversion von OpenClaw im Format >=x.y.z oder >=x.y.z-prerelease. |
expectedIntegrity |
string |
Erwarteter npm-Dist-Integritätsstring, üblicherweise sha512-..., für gepinnte Installationen. |
allowInvalidConfigRecovery |
boolean |
Ermöglicht gebündelten Plugin-Neuinstallations-Flows die Wiederherstellung nach bestimmten veralteten Konfigurationsfehlern. |
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 Onboarding diese Auswahl anzeigen, nach ClawHub-, npm- oder lokaler Installation fragen, das Plugin installieren oder aktivieren und anschließend den ausgewählten Flow fortsetzen. ClawHub-Onboarding-Auswahlen verwenden clawhubSpec und werden bevorzugt, wenn vorhanden; npm-Auswahlen erfordern vertrauenswürdige Katalogmetadaten mit einer Registry-npmSpec; exakte Versionen und expectedIntegrity sind optionale npm-Pins. Wenn expectedIntegrity vorhanden ist, erzwingen Installations-/Update-Flows diese 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 Installation als auch das Laden der Manifest-Registry für nicht gebündelte Plugins diese Vorgabe. Ältere Hosts überspringen externe Plugins; ungültige Versionszeichenfolgen werden abgelehnt. Gebündelte Quell-Plugins werden als gemeinsam mit dem Host-Checkout versioniert angenommen.
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/[email protected]",
"expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY",
"defaultChoice": "npm"
}
}
}
allowInvalidConfigRecovery scope
allowInvalidConfigRecovery ist kein allgemeiner Bypass für fehlerhafte Konfigurationen. Es ist nur für eng begrenzte Wiederherstellung bei gebündelten Plugins gedacht, damit Neuinstallation/Setup bekannte Upgrade-Reste wie einen fehlenden Pfad zu einem gebündelten Plugin oder einen veralteten channels.<id>-Eintrag für dasselbe Plugin reparieren kann. Wenn die Konfiguration aus anderen Gründen fehlerhaft 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, auch für bereits konfigurierte Kanäle. Der vollständige Eintrag wird geladen, nachdem der Gateway mit dem Lauschen begonnen hat.
Wenn Ihr Setup-/vollständiger Eintrag 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 ein openclaw.plugin.json im Paketstamm ausliefern. OpenClaw verwendet es, um die 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 Schemareferenz.
ClawHub-Veröffentlichung
Verwenden Sie für Plugin-Pakete den paketspezifischen ClawHub-Befehl:
clawhub package publish your-org/your-plugin --dry-run
clawhub package publish your-org/your-plugin
Setup-Einstieg
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).
// 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 anstelle von defineSetupPluginEntry(...) verwenden. Dieser gebündelte Contract unterstützt außerdem einen optionalen runtime-Export, damit die Laufzeitverdrahtung zur Setup-Zeit schlank und explizit bleiben kann.
Wann OpenClaw setupEntry anstelle des vollständigen Eintrags 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 Channel-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 Gateway-Methoden beim Start sollten weiterhin reservierte Core-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.
Enge Setup-Helferimporte
Für heiße reine Setup-Pfade sollten Sie die engen Setup-Helfer-Schnittstellen gegenüber dem breiteren Umbrella plugin-sdk/setup bevorzugen, wenn Sie nur einen Teil der Setup-Oberfläche benötigen:
| Importpfad | Dafür verwenden | Wichtige Exporte |
|---|---|---|
plugin-sdk/setup-runtime |
Laufzeithelfer zur Setup-Zeit, die in setupEntry / beim verzögerten Kanalstart verfügbar bleiben |
createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy |
plugin-sdk/setup-adapter-runtime |
umgebungsbewusste Adapter für Konto-Setup | createEnvPatchedAccountSetupAdapter |
plugin-sdk/setup-tools |
Setup-/Installations-CLI-/Archiv-/Dokumentationshelfer | formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR |
Verwenden Sie die breitere Schnittstelle plugin-sdk/setup, wenn Sie die vollständige gemeinsame Setup-Toolbox benötigen, einschließlich Konfigurations-Patch-Helfern wie moveSingleAccountChannelSectionToDefaultAccount(...).
Die Setup-Patch-Adapter bleiben beim Import für heiße Pfade sicher. Ihre gebündelte Contract-Oberflächen-Suche für die Promotion einzelner Konten ist lazy, sodass der Import von plugin-sdk/setup-runtime die Ermittlung der gebündelten Contract-Oberfläche nicht vorab lädt, bevor der Adapter tatsächlich verwendet wird.
Kanalverwaltete Promotion einzelner Konten
Wenn ein Kanal von einer Top-Level-Konfiguration für ein einzelnes Konto auf channels.<id>.accounts.* aktualisiert wird, verschiebt das standardmäßige gemeinsame Verhalten promotete kontobezogene Werte nach accounts.default.
Gebündelte Kanäle können diese Promotion über ihre Setup-Contract-Oberfläche eingrenzen oder überschreiben:
singleAccountKeysToMove: zusätzliche Top-Level-Schlüssel, die in das promotete Konto verschoben werden sollennamedAccountPromotionKeys: wenn benannte Konten bereits existieren, werden nur diese Schlüssel in das promotete Konto verschoben; gemeinsame Richtlinien-/Zustellungsschlüssel bleiben im Kanal-RootresolveSingleAccountPromotionTarget(...): wählt aus, welches vorhandene Konto promotete Werte erhält
Konfigurationsschema
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.
Für kanalspezifische Konfiguration verwenden Sie stattdessen den Abschnitt für Kanalkonfiguration:
{
channels: {
"my-channel": {
token: "bot-token",
allowFrom: ["user1", "user2"],
},
},
}
Kanalkonfigurationsschemata erstellen
Verwenden Sie buildChannelConfigSchema, um ein Zod-Schema in den ChannelConfigSchema-Wrapper zu konvertieren, 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 Contract bereits als JSON-Schema oder TypeBox verfassen, verwenden Sie den direkten Helfer, damit OpenClaw die Zod-zu-JSON-Schema-Konvertierung 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 der Cold-Path-Contract weiterhin das Plugin-Manifest: Spiegeln Sie das generierte JSON-Schema nach openclaw.plugin.json#channelConfigs, damit Konfigurationsschema, Setup und UI-Oberflächen channels.<id> prüfen können, ohne Laufzeitcode zu laden.
Setup-Assistenten
Channel-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, bevorzugen Sie die gemeinsamen Setup-Helfer aus openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...), createTopLevelChannelParsedAllowFromPrompt(...) und createNestedChannelParsedAllowFromPrompt(...).
Standardstatus für Kanal-Setup
Für Statusblöcke zum Kanal-Setup, die nur nach Labels, Scores und optionalen zusätzlichen Zeilen variieren, bevorzugen Sie createStandardChannelSetupStatus(...) aus openclaw/plugin-sdk/setup, anstatt dasselbe status-Objekt in jedem Plugin manuell zu erstellen.
Optionale Kanal-Setup-Oberfläche
Für optionale Setup-Oberflächen, die nur in bestimmten Kontexten erscheinen sollen, verwenden Sie 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 tiefer liegenden 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 für erforderliche Installation über validateInput, applyAccountConfig und finalize hinweg wieder und hängt einen Dokumentationslink an, wenn docsPath gesetzt ist.
Setup-Helfer mit Binary-Unterstützung
Für Setup-UIs mit Binary-Unterstützung bevorzugen Sie die gemeinsamen delegierten Helfer, anstatt dieselbe Binary-/Status-Verknüpfung in jeden Kanal zu kopieren:
createDetectedBinaryStatus(...)für Statusblöcke, die nur nach Labels, Hinweisen, Scores und Binary-Erkennung variierencreateCliPathTextInput(...)für textbasierte Eingaben mit PfadbezugcreateDelegatedSetupWizardStatusResolvers(...),createDelegatedPrepare(...),createDelegatedFinalize(...)undcreateDelegatedResolveConfigured(...), wennsetupEntrylazy an einen schwereren vollständigen Assistenten weiterleiten musscreateDelegatedTextInputShouldPrompt(...), wennsetupEntrynur eine Entscheidung fürtextInputs[*].shouldPromptdelegieren muss
Veröffentlichen und installieren
Externe Plugins: Veröffentlichen Sie auf ClawHub und installieren Sie dann:
npm
openclaw plugins install @myorg/openclaw-my-plugin
Bloße Paketspezifikationen installieren während der Launch-Umstellung aus npm.
Nur ClawHub
openclaw plugins install clawhub:@myorg/openclaw-my-plugin
npm-Paketspezifikation
Verwenden Sie npm, wenn ein Paket noch nicht zu ClawHub gewechselt ist oder wenn Sie während der Migration einen direkten npm-Installationspfad benötigen:
openclaw plugins install npm:@myorg/openclaw-my-plugin
In-Repo-Plugins: Legen Sie sie unter dem gebündelten Plugin-Workspace-Baum ab; sie werden beim Build automatisch erkannt.
Benutzer können installieren:
openclaw plugins install <package-name>
Gebündelte Paketmetadaten sind explizit und werden nicht beim Gateway-Start aus gebautem JavaScript abgeleitet. Runtime-Abhängigkeiten gehören in das Plugin-Paket, dem sie gehören; der Start des 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