Plugin SDK reference
Configurazione e impostazioni del Plugin
Riferimento per il pacchettamento dei Plugin (metadati di package.json), i manifest (openclaw.plugin.json), gli entry point di configurazione e gli schemi di configurazione.
Metadati del pacchetto
Il tuo package.json deve contenere un campo openclaw che indichi al sistema dei Plugin ciò che il tuo Plugin fornisce:
Plugin di canale
{ "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." } }}Plugin provider / configurazione di base ClawHub
{ "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" } }}Campi di openclaw
extensionsstring[]File degli entry point (relativi alla radice del pacchetto). Entry point sorgente validi per lo sviluppo nell'area di lavoro e nei checkout git.
runtimeExtensionsstring[]Controparti JavaScript compilate di extensions, preferite quando OpenClaw carica un pacchetto npm installato. Consulta Entry point dell'SDK per l'ordine di risoluzione tra sorgente e versione compilata.
setupEntrystringEntry point leggero riservato alla configurazione (facoltativo).
runtimeSetupEntrystringControparte JavaScript compilata di setupEntry. Richiede che sia impostato anche setupEntry.
pluginobjectIdentità di riserva del Plugin { id, label }, utilizzata quando un Plugin non dispone di metadati di canale/provider da cui ricavare un id o un'etichetta.
channelobjectMetadati del catalogo dei canali per le interfacce di configurazione, selezione, avvio rapido e stato.
installobjectIndicazioni per l'installazione: npmSpec, localPath, defaultChoice, minHostVersion, expectedIntegrity, allowInvalidConfigRecovery, requiredPlatformPackages.
startupobjectFlag del comportamento di avvio.
compatobjectIntervallo di versioni di pluginApi supportato da questo Plugin. Obbligatorio per le pubblicazioni esterne su ClawHub.
openclaw.channel
openclaw.channel contiene metadati leggeri del pacchetto per il rilevamento dei canali e le interfacce 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 di selezione/configurazione quando deve differire da label. |
detailLabel |
string |
Etichetta di dettaglio secondaria per cataloghi dei canali e interfacce di stato più complete. |
docsPath |
string |
Percorso della documentazione per i collegamenti di configurazione e selezione. |
docsLabel |
string |
Etichetta alternativa per i collegamenti alla documentazione, quando deve differire dall'id del canale. |
blurb |
string |
Breve descrizione per l'onboarding e il catalogo. |
order |
number |
Ordine di visualizzazione nei cataloghi dei canali. |
aliases |
string[] |
Alias di ricerca aggiuntivi per la selezione del canale. |
preferOver |
string[] |
Id di Plugin/canali con priorità inferiore rispetto ai quali questo canale deve prevalere. |
systemImage |
string |
Nome facoltativo dell'icona/immagine di sistema per i cataloghi dei canali dell'interfaccia utente. |
selectionDocsPrefix |
string |
Testo prefisso prima dei collegamenti alla documentazione nelle interfacce di selezione. |
selectionDocsOmitLabel |
boolean |
Mostra direttamente il percorso della documentazione anziché un collegamento etichettato nel testo di selezione. |
selectionExtras |
string[] |
Brevi stringhe aggiuntive accodate al testo di selezione. |
markdownCapable |
boolean |
Contrassegna il canale come compatibile con Markdown per le decisioni sulla formattazione in uscita. |
exposure |
object |
Controlli di visibilità del canale per configurazione, elenchi configurati e interfacce della documentazione. |
quickstartAllowFrom |
boolean |
Abilita per questo canale il flusso standard di configurazione allowFrom dell'avvio rapido. |
forceAccountBinding |
boolean |
Richiede l'associazione esplicita dell'account anche quando esiste un solo account. |
preferSessionLookupForAnnounceTarget |
boolean |
Preferisce la ricerca della sessione durante la risoluzione delle destinazioni degli annunci per questo canale. |
Esempio:
{ "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 interfacce di elenco dei canali configurati e di statosetup: include il canale nei selettori interattivi di configurazionedocs: contrassegna il canale come pubblico nelle interfacce di documentazione e navigazione
openclaw.install
openclaw.install è un metadato del pacchetto, non del manifest.
| Campo | Tipo | Significato |
|---|---|---|
clawhubSpec |
string |
Specifica canonica di ClawHub per installazione/aggiornamento e flussi di onboarding con installazione su richiesta. |
npmSpec |
string |
Specifica npm canonica per i flussi di installazione/aggiornamento di riserva. |
localPath |
string |
Percorso di sviluppo locale o di installazione inclusa. |
defaultChoice |
"clawhub" | "npm" | "local" |
Origine di installazione preferita quando sono disponibili più origini. |
minHostVersion |
string |
Versione minima supportata di OpenClaw, >=x.y.z o >=x.y.z-prerelease. |
expectedIntegrity |
string |
Stringa di integrità prevista della distribuzione npm, solitamente sha512-..., per le installazioni vincolate. |
allowInvalidConfigRecovery |
boolean |
Consente ai flussi di reinstallazione dei Plugin inclusi di recuperare da specifici errori dovuti a configurazioni obsolete. |
requiredPlatformPackages |
string[] |
Alias npm richiesti e specifici della piattaforma, verificati durante l'installazione npm. |
Comportamento dell'onboarding
L'onboarding interattivo usa openclaw.install per le interfacce di installazione su richiesta: se il tuo Plugin espone opzioni di autenticazione del provider o metadati di configurazione/catalogo dei canali prima del caricamento del runtime, l'onboarding può richiedere un'installazione da ClawHub, npm o locale, installare o abilitare il Plugin e quindi proseguire con il flusso selezionato. Le opzioni ClawHub usano clawhubSpec e sono preferite quando presenti; le opzioni npm richiedono metadati di catalogo attendibili con un npmSpec del registro (le versioni esatte e expectedIntegrity sono vincoli facoltativi, applicati durante l'installazione o l'aggiornamento quando impostati). Mantieni «cosa mostrare» in openclaw.plugin.json e «come installarlo» in package.json.
Applicazione di minHostVersion
Se minHostVersion è impostato, viene applicato sia durante l'installazione sia durante il caricamento dal registro dei manifest non inclusi. Gli host meno recenti ignorano i Plugin esterni; le stringhe di versione non valide vengono rifiutate. Si presume che i Plugin sorgente inclusi abbiano la stessa versione del checkout dell'host.
Installazioni npm vincolate
Per le installazioni npm vincolate, mantieni la versione esatta in npmSpec e aggiungi l'integrità prevista dell'artefatto:
{ "openclaw": { "install": { "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3", "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY", "defaultChoice": "npm" } }}Ambito di allowInvalidConfigRecovery
allowInvalidConfigRecovery non è un meccanismo generale per aggirare configurazioni non valide. È limitato esclusivamente al recupero dei Plugin inclusi e consente alla reinstallazione/configurazione di correggere residui noti degli aggiornamenti, come un percorso mancante di un Plugin incluso o una voce channels.<id> obsoleta relativa allo stesso Plugin. Se la configurazione non è valida per motivi non correlati, l'installazione continua a bloccarsi in modo sicuro e indica all'operatore di eseguire openclaw doctor --fix.
Caricamento completo differito
I Plugin di canale possono abilitare il caricamento differito con:
{ "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "startup": { "deferConfiguredChannelFullLoadUntilAfterListen": true } }}Quando questa opzione è abilitata, OpenClaw carica soltanto setupEntry durante la fase di avvio precedente all'ascolto, anche per i canali già configurati. L'entry point completo viene caricato dopo che il Gateway inizia l'ascolto.
Se gli entry point di configurazione/completi registrano metodi RPC del Gateway, mantienili sotto un prefisso specifico del Plugin. Gli spazi dei nomi amministrativi riservati del nucleo (config.*, exec.approvals.*, wizard.*, update.*) restano di proprietà del nucleo e vengono sempre normalizzati in operator.admin.
Manifest del Plugin
Ogni plugin nativo deve includere un file openclaw.plugin.json nella radice del pacchetto. OpenClaw lo utilizza per convalidare la configurazione senza eseguire il codice del plugin.
{ "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, aggiungere channels (mentre i plugin provider aggiungono providers):
{ "id": "my-channel", "channels": ["my-channel"], "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}Anche i plugin senza configurazione devono includere uno schema. Uno schema vuoto è valido:
{ "id": "my-plugin", "configSchema": { "type": "object", "additionalProperties": false }}Consultare Manifest del plugin per il riferimento completo dello schema.
Pubblicazione su ClawHub
I pacchetti di Skills e plugin utilizzano comandi di pubblicazione ClawHub distinti. Per i pacchetti di plugin, utilizzare il comando specifico per i pacchetti:
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginPunto di ingresso per la configurazione
setup-entry.ts è un'alternativa leggera a index.ts che OpenClaw carica quando necessita soltanto delle superfici di configurazione (procedura di introduzione, riparazione della configurazione, ispezione dei canali disabilitati):
// setup-entry.ts export default defineSetupPluginEntry(myChannelPlugin);In questo modo si evita di caricare codice di runtime pesante (librerie crittografiche, registrazioni CLI, servizi in background) durante i flussi di configurazione.
I canali inclusi nell'area di lavoro che mantengono esportazioni sicure per la configurazione in moduli collaterali possono utilizzare defineBundledChannelSetupEntry(...) da openclaw/plugin-sdk/channel-entry-contract anziché defineSetupPluginEntry(...). Questo contratto per i componenti inclusi supporta anche un'esportazione facoltativa runtime, così il collegamento del runtime durante la configurazione può rimanere leggero ed esplicito.
Quando OpenClaw utilizza setupEntry anziché il punto di ingresso completo
- Il canale è disabilitato, ma necessita delle superfici di configurazione o della procedura di introduzione.
- Il canale è abilitato, ma non configurato.
- Il caricamento differito è abilitato (
deferConfiguredChannelFullLoadUntilAfterListen).
Cosa deve registrare setupEntry
- L'oggetto del plugin di canale (tramite
defineSetupPluginEntry). - Tutte le route HTTP necessarie prima che il Gateway inizi l'ascolto.
- Tutti i metodi del Gateway necessari durante l'avvio.
Tali metodi del Gateway utilizzati all'avvio devono comunque evitare gli spazi dei nomi amministrativi riservati al core, come config.* o update.*.
Cosa NON deve includere setupEntry
- Registrazioni CLI.
- Servizi in background.
- Importazioni di runtime pesanti (crittografia, SDK).
- Metodi del Gateway necessari soltanto dopo l'avvio.
Importazioni mirate degli helper di configurazione
Per i percorsi critici dedicati esclusivamente alla configurazione, quando è necessaria soltanto una parte della superficie di configurazione è preferibile utilizzare le interfacce mirate degli helper di configurazione anziché l'interfaccia generale plugin-sdk/setup:
| Percorso di importazione | Utilizzo | Esportazioni principali |
|---|---|---|
plugin-sdk/setup-runtime |
helper di runtime per la configurazione 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; utilizzare plugin-sdk/setup-runtime |
createEnvPatchedAccountSetupAdapter |
plugin-sdk/setup-tools |
helper per CLI, archivi, documentazione e installazione durante la configurazione | formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR |
Utilizzare l'interfaccia generale plugin-sdk/setup quando è necessario il set completo di strumenti condivisi per la configurazione, inclusi gli helper per le modifiche alla configurazione, come moveSingleAccountChannelSectionToDefaultAccount(...).
Utilizzare createSetupTranslator(...) per i testi fissi della procedura guidata di configurazione. Segue la lingua della procedura guidata CLI (OPENCLAW_LOCALE, quindi le variabili di lingua del sistema) e ricorre all'inglese come lingua di riserva. Mantenere il testo di configurazione specifico del plugin nel codice di proprietà del plugin e utilizzare le chiavi del catalogo condiviso soltanto per etichette comuni di configurazione, testo di stato e testi di configurazione dei plugin ufficiali inclusi.
Gli adattatori per le modifiche di configurazione rimangono sicuri da importare nei percorsi critici. La ricerca della superficie del contratto per la promozione inclusa di un singolo account è differita; pertanto, l'importazione di plugin-sdk/setup-runtime non carica anticipatamente il rilevamento delle superfici dei contratti inclusi prima dell'effettivo utilizzo dell'adattatore.
Promozione di un singolo account gestita dal canale
Quando un canale passa da una configurazione di primo livello per un singolo account a channels.<id>.accounts.*, il comportamento condiviso predefinito sposta i valori promossi specifici dell'account in accounts.default.
I canali inclusi possono restringere o sostituire tale promozione tramite la propria superficie del contratto di configurazione:
singleAccountKeysToMove: chiavi aggiuntive di primo livello da spostare nell'account promossonamedAccountPromotionKeys: quando esistono già account denominati, soltanto queste chiavi vengono spostate nell'account promosso; le chiavi condivise relative a criteri e consegna rimangono nella radice del canaleresolveSingleAccountPromotionTarget(...): sceglie quale account esistente riceve i valori promossi
Schema di configurazione
La configurazione del plugin viene convalidata rispetto allo schema JSON nel manifest. Gli utenti configurano i plugin tramite:
{ plugins: { entries: { "my-plugin": { config: { webhookSecret: "abc123", }, }, }, },}Durante la registrazione, il plugin riceve questa configurazione come api.pluginConfig.
Per la configurazione specifica del canale, utilizzare invece la sezione di configurazione del canale:
{ channels: { "my-channel": { token: "bot-token", allowFrom: ["user1", "user2"], }, },}Creazione degli schemi di configurazione dei canali
Utilizzare buildChannelConfigSchema per convertire uno schema Zod nel wrapper ChannelConfigSchema usato dagli artefatti di configurazione di proprietà del plugin:
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 il contratto è già definito come schema JSON o TypeBox, utilizzare l'helper diretto affinché OpenClaw possa evitare la conversione da Zod a schema JSON nei percorsi dei metadati:
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 per i percorsi non critici rimane il manifest del plugin: replicare lo schema JSON generato in openclaw.plugin.json#channelConfigs, in modo che lo schema di configurazione, la configurazione e le superfici dell'interfaccia utente possano esaminare channels.<id> senza caricare il codice di runtime.
Procedure guidate di configurazione
I plugin di canale possono fornire procedure guidate interattive per openclaw onboard. La procedura guidata è un oggetto ChannelSetupWizard nel 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 supporta inoltre textInputs, dmPolicy, allowFrom, groupAccess, prepare, finalize e altro ancora. Consultare src/setup-core.ts del plugin Discord per un esempio completo incluso.
Richieste allowFrom condivise
Per le richieste relative all'elenco consentito dei messaggi diretti che richiedono soltanto il flusso standard nota -> richiesta -> analisi -> unione -> modifica, è preferibile utilizzare gli helper di configurazione condivisi da openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...), createTopLevelChannelParsedAllowFromPrompt(...) e createNestedChannelParsedAllowFromPrompt(...).
Stato standard della configurazione del canale
Per i blocchi di stato della configurazione del canale che variano soltanto per etichette, punteggi e righe aggiuntive facoltative, è preferibile utilizzare createStandardChannelSetupStatus(...) da openclaw/plugin-sdk/setup anziché ricreare manualmente lo stesso oggetto status in ogni plugin.
Superficie facoltativa di configurazione del canale
Per le superfici di configurazione facoltative che devono apparire soltanto in determinati contesti, utilizzare createOptionalChannelSetupSurface da 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 espone inoltre i costruttori di livello inferiore createOptionalChannelSetupAdapter(...) e createOptionalChannelSetupWizard(...) quando è necessaria soltanto una delle due parti di tale superficie di installazione facoltativa.
L'adattatore/la procedura guidata facoltativi generati adottano un comportamento fail-closed durante le scritture effettive della configurazione. Riutilizzano un unico messaggio che richiede l'installazione in validateInput, applyAccountConfig e finalize e aggiungono un collegamento alla documentazione quando è impostato docsPath.
Helper di configurazione basati su binari
Per le interfacce di configurazione basate su binari, preferisci gli helper condivisi con delega anziché copiare in ogni canale la stessa logica di integrazione per binari e stato:
createDetectedBinaryStatus(...)per i blocchi di stato che variano solo per etichette, suggerimenti, punteggi e rilevamento dei binaricreateCliPathTextInput(...)per gli input di testo basati su percorsicreateDelegatedSetupWizardStatusResolvers(...),createDelegatedPrepare(...),createDelegatedFinalize(...)ecreateDelegatedResolveConfigured(...)quandosetupEntrydeve inoltrare in modo lazy a una procedura guidata completa più articolatacreateDelegatedTextInputShouldPrompt(...)quandosetupEntrydeve solo delegare una decisionetextInputs[*].shouldPrompt
Pubblicazione e installazione
Plugin esterni: pubblica su ClawHub, quindi installa:
npm
openclaw plugins install @myorg/openclaw-my-pluginLe specifiche di pacchetto semplici vengono installate da npm durante il passaggio all'avvio, a meno che il nome non corrisponda all'ID di un Plugin incluso o ufficiale; in tal caso, OpenClaw usa invece la relativa copia locale/ufficiale. Usa clawhub:, npm:, git: o npm-pack: per selezionare la sorgente in modo deterministico — consulta Gestire i Plugin.
Solo ClawHub
openclaw plugins install clawhub:@myorg/openclaw-my-pluginSpecifica del pacchetto npm
Usa npm quando un pacchetto non è ancora stato trasferito su ClawHub o quando è necessario un percorso di installazione diretta da npm durante la migrazione:
openclaw plugins install npm:@myorg/openclaw-my-pluginPlugin nel repository: inseriscili nell'albero dell'area di lavoro dei Plugin inclusi; vengono rilevati automaticamente durante la compilazione.
I metadati dei pacchetti inclusi sono espliciti e non vengono dedotti dal codice JavaScript compilato all'avvio del Gateway. Le dipendenze di runtime appartengono al pacchetto del Plugin che ne è proprietario; l'avvio della distribuzione di OpenClaw non ripara né duplica mai le dipendenze dei Plugin.
Contenuti correlati
- Creazione di Plugin — guida introduttiva dettagliata
- Manifest del Plugin — riferimento completo allo schema del manifest
- Punti di ingresso dell'SDK —
definePluginEntryedefineChannelPluginEntry