Vai al contenuto principale

Punti di ingresso dei plugin

Ogni plugin esporta un oggetto entry predefinito. L’SDK fornisce tre helper per crearli.
Cerchi una guida passo passo? Vedi Plugin di canale o Plugin provider per guide dettagliate.

definePluginEntry

Import: openclaw/plugin-sdk/plugin-entry Per plugin provider, plugin di strumenti, plugin di hook e tutto ciò che non è un canale di messaggistica.
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";

export default definePluginEntry({
  id: "my-plugin",
  name: "My Plugin",
  description: "Short summary",
  register(api) {
    api.registerProvider({
      /* ... */
    });
    api.registerTool({
      /* ... */
    });
  },
});
CampoTipoObbligatorioPredefinito
idstring
namestring
descriptionstring
kindstringNo
configSchemaOpenClawPluginConfigSchema | () => OpenClawPluginConfigSchemaNoSchema oggetto vuoto
register(api: OpenClawPluginApi) => void
  • id deve corrispondere al tuo manifest openclaw.plugin.json.
  • kind è per slot esclusivi: "memory" o "context-engine".
  • configSchema può essere una funzione per la valutazione lazy.
  • OpenClaw risolve e memoizza quello schema al primo accesso, quindi i builder di schema costosi vengono eseguiti una sola volta.

defineChannelPluginEntry

Import: openclaw/plugin-sdk/channel-core Avvolge definePluginEntry con il wiring specifico per i canali. Chiama automaticamente api.registerChannel({ plugin }), espone una seam facoltativa di metadati CLI per l’help root e limita registerFull in base alla modalità di registrazione.
import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";

export default defineChannelPluginEntry({
  id: "my-channel",
  name: "My Channel",
  description: "Short summary",
  plugin: myChannelPlugin,
  setRuntime: setMyRuntime,
  registerCliMetadata(api) {
    api.registerCli(/* ... */);
  },
  registerFull(api) {
    api.registerGatewayMethod(/* ... */);
  },
});
CampoTipoObbligatorioPredefinito
idstring
namestring
descriptionstring
pluginChannelPlugin
configSchemaOpenClawPluginConfigSchema | () => OpenClawPluginConfigSchemaNoSchema oggetto vuoto
setRuntime(runtime: PluginRuntime) => voidNo
registerCliMetadata(api: OpenClawPluginApi) => voidNo
registerFull(api: OpenClawPluginApi) => voidNo
  • setRuntime viene chiamato durante la registrazione così puoi memorizzare il riferimento runtime (tipicamente tramite createPluginRuntimeStore). Viene saltato durante la raccolta dei metadati CLI.
  • registerCliMetadata viene eseguito sia quando api.registrationMode === "cli-metadata" sia quando api.registrationMode === "full". Usalo come punto canonico per i descrittori CLI posseduti dal canale, così l’help root resta non attivante mentre la normale registrazione dei comandi CLI rimane compatibile con i caricamenti completi del plugin.
  • registerFull viene eseguito solo quando api.registrationMode === "full". Viene saltato durante il caricamento setup-only.
  • Come definePluginEntry, configSchema può essere una factory lazy e OpenClaw memoizza lo schema risolto al primo accesso.
  • Per i comandi CLI root posseduti dal plugin, preferisci api.registerCli(..., { descriptors: [...] }) quando vuoi che il comando resti caricato lazy senza scomparire dall’albero di parsing della CLI root. Per i plugin di canale, preferisci registrare quei descrittori da registerCliMetadata(...) e mantenere registerFull(...) focalizzato sul lavoro solo runtime.
  • Se registerFull(...) registra anche metodi RPC del gateway, mantienili su un prefisso specifico del plugin. Gli spazi dei nomi admin core riservati (config.*, exec.approvals.*, wizard.*, update.*) vengono sempre coercizzati a operator.admin.

defineSetupPluginEntry

Import: openclaw/plugin-sdk/channel-core Per il file leggero setup-entry.ts. Restituisce solo { plugin } senza wiring runtime o CLI.
import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";

export default defineSetupPluginEntry(myChannelPlugin);
OpenClaw lo carica al posto dell’entry completa quando un canale è disabilitato, non configurato o quando il caricamento differito è abilitato. Vedi Setup e configurazione per capire quando questo è importante. In pratica, abbina defineSetupPluginEntry(...) alle famiglie ristrette di helper setup:
  • openclaw/plugin-sdk/setup-runtime per helper di setup sicuri per il runtime come adapter di patch setup import-safe, output di note lookup, promptResolvedAllowFrom, splitSetupEntries e proxy di setup delegati
  • openclaw/plugin-sdk/channel-setup per superfici di setup con installazione facoltativa
  • openclaw/plugin-sdk/setup-tools per helper di setup/installazione CLI/archivio/documentazione
Mantieni SDK pesanti, registrazione CLI e servizi runtime a lunga durata nell’entry completa.

Modalità di registrazione

api.registrationMode indica al tuo plugin come è stato caricato:
ModalitàQuandoCosa registrare
"full"Avvio normale del gatewayTutto
"setup-only"Canale disabilitato/non configuratoSolo registrazione del canale
"setup-runtime"Flusso di setup con runtime disponibileRegistrazione del canale più solo il runtime leggero necessario prima del caricamento dell’entry completa
"cli-metadata"Help root / raccolta metadati CLISolo descrittori CLI
defineChannelPluginEntry gestisce automaticamente questa suddivisione. Se usi definePluginEntry direttamente per un canale, controlla tu stesso la modalità:
register(api) {
  if (api.registrationMode === "cli-metadata" || api.registrationMode === "full") {
    api.registerCli(/* ... */);
    if (api.registrationMode === "cli-metadata") return;
  }

  api.registerChannel({ plugin: myPlugin });
  if (api.registrationMode !== "full") return;

  // Registrazioni pesanti solo runtime
  api.registerService(/* ... */);
}
Tratta "setup-runtime" come la finestra in cui devono esistere superfici di avvio solo setup senza rientrare nel runtime completo del canale bundled. Gli usi adatti sono registrazione del canale, route HTTP sicure per il setup, metodi gateway sicuri per il setup e helper di setup delegati. Servizi in background pesanti, registrar CLI e bootstrap di SDK provider/client appartengono ancora a "full". Per i registrar CLI in particolare:
  • usa descriptors quando il registrar possiede uno o più comandi root e vuoi che OpenClaw carichi lazy il modulo CLI reale alla prima invocazione
  • assicurati che quei descrittori coprano ogni root di comando di primo livello esposta dal registrar
  • usa solo commands per i percorsi di compatibilità eager

Forme dei plugin

OpenClaw classifica i plugin caricati in base al loro comportamento di registrazione:
FormaDescrizione
plain-capabilityUn tipo di capacità (ad esempio solo provider)
hybrid-capabilityPiù tipi di capacità (ad esempio provider + speech)
hook-onlySolo hook, nessuna capacità
non-capabilityStrumenti/comandi/servizi ma nessuna capacità
Usa openclaw plugins inspect <id> per vedere la forma di un plugin.

Correlati