Plugin SDK reference

Configurazione e impostazioni del Plugin

Riferimento per il packaging dei plugin (metadati di package.json), i manifest (openclaw.plugin.json), le voci di configurazione e gli schemi di configurazione.

Metadati del pacchetto

Il tuo package.json deve avere un campo openclaw che indica al sistema dei plugin cosa fornisce il tuo plugin:

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",  "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"    }  }}

Campi di openclaw

extensionsstring[]

File dei punti di ingresso (relativi alla radice del pacchetto).

setupEntrystring

Voce leggera dedicata solo alla configurazione (facoltativa).

channelobject

Metadati del catalogo dei canali per configurazione, selettore, avvio rapido e superfici di stato.

providersstring[]

ID dei provider registrati da questo plugin.

installobject

Suggerimenti di installazione: npmSpec, localPath, defaultChoice, minHostVersion, expectedIntegrity, allowInvalidConfigRecovery.

startupobject

Flag del comportamento di avvio.

openclaw.channel

openclaw.channel è metadato di pacchetto leggero per il rilevamento dei canali e le superfici di configurazione prima del caricamento del runtime.

Campo Tipo Significato
id string ID canonico del canale.
label string Etichetta principale del canale.
selectionLabel string Etichetta del selettore/configurazione quando deve differire da label.
detailLabel string Etichetta di dettaglio secondaria per cataloghi di canali e superfici di stato più ricchi.
docsPath string Percorso della documentazione per link di configurazione e selezione.
docsLabel string Etichetta alternativa usata per i link alla documentazione quando deve differire dall'ID del canale.
blurb string Breve descrizione di onboarding/catalogo.
order number Ordine di ordinamento nei cataloghi dei canali.
aliases string[] Alias di ricerca aggiuntivi per la selezione del canale.
preferOver string[] ID di plugin/canali con priorità inferiore che questo canale deve precedere.
systemImage string Nome facoltativo di icona/immagine di sistema per i cataloghi UI dei canali.
selectionDocsPrefix string Testo di prefisso prima dei link alla documentazione nelle superfici di selezione.
selectionDocsOmitLabel boolean Mostra direttamente il percorso della documentazione invece di un link etichettato nella copia di selezione.
selectionExtras string[] Brevi stringhe aggiuntive accodate nella copia di selezione.
markdownCapable boolean Contrassegna il canale come compatibile con Markdown per le decisioni di formattazione in uscita.
exposure object Controlli di visibilità del canale per configurazione, elenchi configurati e superfici della documentazione.
quickstartAllowFrom boolean Abilita questo canale al flusso standard di configurazione rapida allowFrom.
forceAccountBinding boolean Richiede l'associazione esplicita dell'account anche quando esiste un solo account.
preferSessionLookupForAnnounceTarget boolean Preferisce la ricerca della sessione quando risolve i destinatari degli annunci per questo canale.

Esempio:

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 supporta:

  • configured: include il canale nelle superfici di elenco in stile configurato/stato
  • setup: include il canale nei selettori interattivi di configurazione
  • docs: contrassegna il canale come pubblico nelle superfici di documentazione/navigazione

openclaw.install

openclaw.install è metadato di pacchetto, non metadato di manifest.

Campo Tipo Significato
clawhubSpec string Specifica ClawHub canonica per installazione/aggiornamento e flussi di onboarding con installazione su richiesta.
npmSpec string Specifica npm canonica per flussi di fallback di installazione/aggiornamento.
localPath string Percorso di sviluppo locale o di installazione in bundle.
defaultChoice "clawhub" | "npm" | "local" Origine di installazione preferita quando sono disponibili più origini.
minHostVersion string Versione minima supportata di OpenClaw nel formato >=x.y.z o >=x.y.z-prerelease.
expectedIntegrity string Stringa di integrità npm dist prevista, di solito sha512-..., per installazioni bloccate.
allowInvalidConfigRecovery boolean Consente ai flussi di reinstallazione dei plugin in bundle di recuperare da specifici errori di configurazione obsoleta.
requiredPlatformPackages string[] Alias npm specifici della piattaforma richiesti e verificati durante l'installazione npm.
Onboarding behavior

L'onboarding interattivo usa anche openclaw.install per le superfici di installazione su richiesta. Se il tuo plugin espone scelte di autenticazione provider o metadati di configurazione/catalogo canali prima del caricamento del runtime, l'onboarding può mostrare quella scelta, chiedere l'installazione tramite ClawHub, npm o locale, installare o abilitare il plugin, quindi continuare il flusso selezionato. Le scelte di onboarding ClawHub usano clawhubSpec e sono preferite quando presenti; le scelte npm richiedono metadati di catalogo attendibili con un npmSpec di registro; versioni esatte ed expectedIntegrity sono pin npm facoltativi. Se expectedIntegrity è presente, i flussi di installazione/aggiornamento lo applicano per npm. Mantieni i metadati su "cosa mostrare" in openclaw.plugin.json e i metadati su "come installarlo" in package.json.

minHostVersion enforcement

Se minHostVersion è impostato, viene applicato sia dall'installazione sia dal caricamento del registro manifest non in bundle. Gli host meno recenti saltano i plugin esterni; le stringhe di versione non valide vengono rifiutate. Si presume che i plugin sorgente in bundle abbiano la stessa versione del checkout host.

Pinned npm installs

Per le installazioni npm bloccate, mantieni la versione esatta in npmSpec e aggiungi l'integrità prevista dell'artefatto:

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

allowInvalidConfigRecovery non è un bypass generale per configurazioni danneggiate. È riservato solo al recupero ristretto dei plugin in bundle, in modo che reinstallazione/configurazione possano riparare residui di aggiornamento noti, come un percorso mancante di un plugin in bundle o una voce channels.<id> obsoleta per quello stesso plugin. Se la configurazione è danneggiata per motivi non correlati, l'installazione continua a fallire in modo chiuso e indica all'operatore di eseguire openclaw doctor --fix.

Caricamento completo differito

I plugin di canale possono optare per il caricamento differito con:

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

Quando è abilitato, OpenClaw carica solo setupEntry durante la fase di avvio precedente all'ascolto, anche per i canali già configurati. La voce completa viene caricata dopo che il gateway inizia ad ascoltare.

Se la tua voce di configurazione/completa registra metodi RPC del gateway, mantienili su un prefisso specifico del plugin. Gli spazi dei nomi amministrativi core riservati (config.*, exec.approvals.*, wizard.*, update.*) restano di proprietà del core e vengono sempre risolti in operator.admin.

Manifest del Plugin

Ogni plugin nativo deve includere un openclaw.plugin.json nella radice del pacchetto. OpenClaw lo usa per convalidare la configurazione senza eseguire codice del plugin.

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"      }    }  }}

Per i plugin di canale, aggiungi kind e channels:

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

Anche i plugin senza configurazione devono includere uno schema. Uno schema vuoto è valido:

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

Vedi manifest del Plugin per il riferimento completo dello schema.

Pubblicazione su ClawHub

Per i pacchetti Plugin, usa il comando ClawHub specifico per pacchetto:

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

Voce di setup

Il file setup-entry.ts è un’alternativa leggera a index.ts che OpenClaw carica quando gli servono solo le superfici di setup (onboarding, riparazione della config, ispezione dei canali disabilitati).

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

Questo evita di caricare codice runtime pesante (librerie crittografiche, registrazioni CLI, servizi in background) durante i flussi di setup.

I canali bundled del workspace che mantengono esportazioni sicure per il setup in moduli sidecar possono usare defineBundledChannelSetupEntry(...) da openclaw/plugin-sdk/channel-entry-contract invece di defineSetupPluginEntry(...). Quel contratto bundled supporta anche un’esportazione opzionale runtime, così il cablaggio runtime in fase di setup può restare leggero ed esplicito.

Quando OpenClaw usa setupEntry invece della voce completa
  • Il canale è disabilitato ma ha bisogno di superfici di setup/onboarding.
  • Il canale è abilitato ma non configurato.
  • Il caricamento differito è abilitato (deferConfiguredChannelFullLoadUntilAfterListen).
Cosa deve registrare setupEntry
  • L’oggetto Plugin del canale (tramite defineSetupPluginEntry).
  • Qualsiasi route HTTP richiesta prima dell’ascolto del gateway.
  • Qualsiasi metodo Gateway necessario durante l’avvio.

Quei metodi Gateway di avvio devono comunque evitare namespace di amministrazione core riservati come config.* o update.*.

Cosa setupEntry NON deve includere
  • Registrazioni CLI.
  • Servizi in background.
  • Import runtime pesanti (crittografia, SDK).
  • Metodi Gateway necessari solo dopo l’avvio.

Import stretti degli helper di setup

Per percorsi caldi solo di setup, preferisci le seam strette degli helper di setup rispetto all’umbrella più ampio plugin-sdk/setup quando ti serve solo una parte della superficie di setup:

Percorso di import Usalo per Esportazioni principali
plugin-sdk/setup-runtime helper runtime in fase di setup che restano disponibili in setupEntry / avvio differito del canale createSetupTranslator, createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy
plugin-sdk/setup-adapter-runtime alias di compatibilità deprecato; usa plugin-sdk/setup-runtime createEnvPatchedAccountSetupAdapter
plugin-sdk/setup-tools helper CLI/installazione/archivio/docs di setup formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR

Usa la seam più ampia plugin-sdk/setup quando vuoi l’intero toolkit di setup condiviso, inclusi helper di patch della config come moveSingleAccountChannelSectionToDefaultAccount(...).

Usa createSetupTranslator(...) per testi fissi della procedura guidata di setup. Segue la locale della procedura guidata CLI (OPENCLAW_LOCALE, poi le variabili di locale di sistema) e ripiega sull’inglese. Mantieni il testo di setup specifico del Plugin nel codice di proprietà del Plugin e usa chiavi di catalogo condivise solo per etichette di setup comuni, testo di stato e testo di setup ufficiale dei Plugin bundled.

Gli adapter di patch del setup restano sicuri da importare nei percorsi caldi. La loro ricerca della superficie di contratto per la promozione single-account bundled è lazy, quindi importare plugin-sdk/setup-runtime non carica in modo eager la discovery della superficie di contratto bundled prima che l’adapter venga effettivamente usato.

Promozione single-account di proprietà del canale

Quando un canale passa da una config top-level single-account a channels.<id>.accounts.*, il comportamento condiviso predefinito è spostare i valori promossi con ambito account in accounts.default.

I canali bundled possono restringere o sovrascrivere quella promozione tramite la loro superficie di contratto di setup:

  • singleAccountKeysToMove: chiavi top-level extra che devono essere spostate nell’account promosso
  • namedAccountPromotionKeys: quando esistono già account nominati, solo queste chiavi vengono spostate nell’account promosso; le chiavi condivise di policy/delivery restano alla root del canale
  • resolveSingleAccountPromotionTarget(...): sceglie quale account esistente riceve i valori promossi

Schema di config

La config del Plugin viene validata rispetto al JSON Schema nel tuo manifest. Gli utenti configurano i Plugin tramite:

json5
{  plugins: {    entries: {      "my-plugin": {        config: {          webhookSecret: "abc123",        },      },    },  },}

Il tuo Plugin riceve questa config come api.pluginConfig durante la registrazione.

Per la config specifica del canale, usa invece la sezione di config del canale:

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

Costruzione degli schemi di config dei canali

Usa buildChannelConfigSchema per convertire uno schema Zod nel wrapper ChannelConfigSchema usato dagli artefatti di config di proprietà del Plugin:

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);

Se scrivi già il contratto come JSON Schema o TypeBox, usa l’helper diretto così OpenClaw può saltare la conversione da Zod a JSON Schema nei percorsi di metadata:

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

Per i Plugin di terze parti, il contratto cold-path resta il manifest del Plugin: rispecchia il JSON Schema generato in openclaw.plugin.json#channelConfigs così schema di config, setup e superfici UI possono ispezionare channels.<id> senza caricare codice runtime.

Procedure guidate di setup

I Plugin di canale possono fornire procedure guidate di setup interattive per openclaw onboard. La procedura guidata è un oggetto ChannelSetupWizard su 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),        };      },    },  ],};

Il tipo ChannelSetupWizard supporta credentials, textInputs, dmPolicy, allowFrom, groupAccess, prepare, finalize e altro. Vedi i pacchetti Plugin bundled (per esempio il Plugin Discord src/channel.setup.ts) per esempi completi.

Prompt allowFrom condivisi

Per i prompt di allowlist DM che richiedono solo il flusso standard note -> prompt -> parse -> merge -> patch, preferisci gli helper di setup condivisi da openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...), createTopLevelChannelParsedAllowFromPrompt(...) e createNestedChannelParsedAllowFromPrompt(...).

Stato di setup standard del canale

Per blocchi di stato di setup del canale che variano solo per etichette, punteggi e righe extra opzionali, preferisci createStandardChannelSetupStatus(...) da openclaw/plugin-sdk/setup invece di ricreare manualmente lo stesso oggetto status in ogni Plugin.

Superficie di setup opzionale del canale

Per superfici di setup opzionali che devono apparire solo in certi contesti, usa createOptionalChannelSetupSurface da 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 espone anche i builder di livello inferiore createOptionalChannelSetupAdapter(...) e createOptionalChannelSetupWizard(...) quando ti serve solo una metà di quella superficie di installazione opzionale.

L’adapter/procedura guidata opzionale generato fallisce in modo chiuso sulle scritture di config reali. Riutilizza un unico messaggio di installazione richiesta in validateInput, applyAccountConfig e finalize, e aggiunge un link alla documentazione quando docsPath è impostato.

Helper di setup basati su binari

Per UI di setup basate su binari, preferisci gli helper delegati condivisi invece di copiare lo stesso collante binario/stato in ogni canale:

  • createDetectedBinaryStatus(...) per blocchi di stato che variano solo per etichette, suggerimenti, punteggi e rilevamento del binario
  • createCliPathTextInput(...) per input di testo basati su percorso
  • createDelegatedSetupWizardStatusResolvers(...), createDelegatedPrepare(...), createDelegatedFinalize(...) e createDelegatedResolveConfigured(...) quando setupEntry deve inoltrare in modo lazy a una procedura guidata completa più pesante
  • createDelegatedTextInputShouldPrompt(...) quando setupEntry deve solo delegare una decisione textInputs[*].shouldPrompt

Pubblicazione e installazione

Plugin esterni: pubblica su ClawHub, quindi installa:

npm

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

Le specifiche di pacchetto semplici vengono installate da npm durante il passaggio al lancio.

Solo ClawHub

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

Specifica del pacchetto npm

Usa npm quando un pacchetto non è ancora stato spostato su ClawHub, oppure quando hai bisogno di un percorso di installazione npm diretto durante la migrazione:

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

Plugin nel repository: posizionali sotto l'albero dell'area di lavoro dei Plugin inclusi e verranno rilevati automaticamente durante la build.

Gli utenti possono installare:

bash
openclaw plugins install <package-name>

I metadati dei pacchetti inclusi sono espliciti, non dedotti dal JavaScript compilato all'avvio del gateway. Le dipendenze di runtime appartengono al pacchetto Plugin che le possiede; l'avvio di OpenClaw pacchettizzato non ripara né replica mai le dipendenze dei Plugin.

Correlati

Was this useful?
On this page

On this page