Plugin SDK reference
Panoramica dell’SDK per Plugin
L'SDK dei plugin è il contratto tipizzato tra i plugin e il core. Questa pagina è il riferimento per cosa importare e cosa è possibile registrare.
Convenzione di importazione
Importa sempre da un sottopercorso specifico:
Ogni sottopercorso è un modulo piccolo e autonomo. Ciò mantiene rapido l'avvio e
previene problemi di dipendenze circolari. Per gli helper di ingresso/compilazione
specifici dei canali, preferisci openclaw/plugin-sdk/channel-core; riserva
openclaw/plugin-sdk/core alla superficie generale più ampia e agli helper
condivisi, come buildChannelConfigSchema.
Per la configurazione dei canali, pubblica lo schema JSON di proprietà del canale
tramite openclaw.plugin.json#channelConfigs. Il sottopercorso
plugin-sdk/channel-config-schema è destinato alle primitive di schema condivise
e al generatore generico. I plugin inclusi in OpenClaw usano
plugin-sdk/bundled-channel-config-schema per gli schemi conservati dei canali
inclusi. Le esportazioni di compatibilità deprecate rimangono in
plugin-sdk/channel-config-schema-legacy; nessuno dei sottopercorsi degli schemi
inclusi costituisce un modello per i nuovi plugin.
Riferimento dei sottopercorsi
L'SDK dei plugin è esposto come un insieme di sottopercorsi circoscritti, raggruppati per area (ingresso del plugin, canale, provider, autenticazione, runtime, funzionalità, memoria e helper riservati ai plugin inclusi). Per il catalogo completo, raggruppato e con collegamenti, consulta Sottopercorsi dell'SDK dei plugin.
L'inventario dei punti di ingresso del compilatore si trova in
scripts/lib/plugin-sdk-entrypoints.json; le esportazioni del pacchetto vengono
generate dal sottoinsieme pubblico dopo aver sottratto i sottopercorsi di test e
interni locali al repository elencati in
scripts/lib/plugin-sdk-private-local-only-subpaths.json. Esegui
pnpm plugin-sdk:surface per verificare il numero di esportazioni pubbliche. I
sottopercorsi pubblici deprecati sufficientemente vecchi e non usati dal codice
di produzione delle estensioni incluse sono monitorati in
scripts/lib/plugin-sdk-deprecated-public-subpaths.json; i barrel generali
deprecati di riesportazione sono monitorati in
scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json.
API di registrazione
Il callback register(api) riceve un oggetto OpenClawPluginApi con questi
metodi:
Registrazione delle funzionalità
| Metodo | Cosa registra |
|---|---|
api.registerProvider(...) |
Inferenza testuale (LLM) |
api.registerWorkerProvider(...) |
Lease del ciclo di vita dei worker cloud |
api.registerModelCatalogProvider(...) |
Righe del catalogo dei modelli per la generazione di testo e contenuti multimediali |
api.registerAgentHarness(...) |
Esecutore nativo degli agenti sperimentale (Codex, Copilot) |
api.registerCliBackend(...) |
Backend locale di inferenza CLI |
api.registerChannel(...) |
Canale di messaggistica |
api.registerEmbeddingProvider(...) |
Provider riutilizzabile di incorporamenti vettoriali |
api.registerSpeechProvider(...) |
Sintesi vocale da testo / STT |
api.registerRealtimeTranscriptionProvider(...) |
Trascrizione in tempo reale in streaming |
api.registerRealtimeVoiceProvider(...) |
Sessioni vocali duplex in tempo reale |
api.registerMediaUnderstandingProvider(...) |
Analisi di immagini/audio/video |
api.registerTranscriptSourceProvider(...) |
Fonte di trascrizioni di riunioni in diretta o importate |
api.registerImageGenerationProvider(...) |
Generazione di immagini |
api.registerMusicGenerationProvider(...) |
Generazione musicale |
api.registerVideoGenerationProvider(...) |
Generazione video |
api.registerWebFetchProvider(...) |
Provider per recupero / scraping Web |
api.registerWebSearchProvider(...) |
Ricerca Web |
api.registerCompactionProvider(...) |
Backend collegabile per la Compaction delle trascrizioni |
I provider di worker devono inoltre dichiarare il proprio ID in contracts.workerProviders.
Il core rende persistente l'intento durevole prima di provision(profile, operationId). I provider convalidano le impostazioni prima dell'allocazione esterna e generano WorkerProviderError in caso di rifiuto permanente del profilo. provision deve adottare lo stesso lease quando l'ID operazione si ripete.
Il core rende persistenti le impostazioni convalidate del profilo insieme al lease e fornisce tale snapshot a destroy({ leaseId, profile }), che deve essere idempotente, e a inspect({ leaseId, profile }), che restituisce active, destroyed o unknown. Ciò consente ai provider di instradare le chiamate del ciclo di vita dopo il riavvio di un Gateway o la rimozione di un profilo denominato. Gli endpoint SSH usano un SecretRef per keyRef, mai materiale della chiave incorporato, e includono un hostKey proveniente da un output di provisioning attendibile, nel formato esatto algorithm base64, senza nome host né commento. Il core fissa hostKey e non considera mai attendibile una chiave ricevuta dalla prima connessione. Un provider che genera dinamicamente un keyRef può implementare resolveSshIdentity({ leaseId, profile, keyRef }); quando presente, tale resolver è autoritativo, mentre i provider che ne sono privi usano il resolver generico dei segreti configurato.
I provider con lease rinnovabili possono anche implementare renew(leaseId).
inspect deve generare un'eccezione in caso di errori transitori o indeterminati; restituisce unknown solo in caso di assenza accertata. Il core contrassegna come orfano un record locale attivo oppure considera l'assenza come completamento della dismissione dopo una richiesta di eliminazione resa persistente.
I provider di incorporamenti registrati con api.registerEmbeddingProvider(...)
devono essere elencati anche in contracts.embeddingProviders nel manifesto del
plugin. Questa è la superficie generica per gli incorporamenti, destinata alla
generazione riutilizzabile di vettori. La ricerca in memoria può utilizzare
questa superficie generica dei provider. La precedente interfaccia
api.registerMemoryEmbeddingProvider(...) e
contracts.memoryEmbeddingProviders costituisce una compatibilità deprecata
durante la migrazione dei provider esistenti specifici per la memoria.
I provider specifici per la memoria che espongono ancora un batchEmbed(...) di
runtime rimangono sul contratto di elaborazione in batch esistente per singolo
file, a meno che il loro runtime non imposti esplicitamente
sourceWideBatchEmbed: true. Questa adesione facoltativa consente all'host della
memoria di inviare segmenti provenienti da più file di memoria modificati e da
fonti abilitate in una singola chiamata batchEmbed(...), fino ai limiti di batch
dell'host. Gli adattatori batch che caricano file di richiesta JSONL devono
suddividere i processi del provider prima di raggiungere sia il limite delle
dimensioni di caricamento sia quello del numero di richieste. Il provider deve
restituire un incorporamento per ogni segmento di input, nello stesso ordine di
batch.chunks; ometti il flag quando il provider prevede batch locali ai file o
non può conservare l'ordine degli input in un processo più ampio esteso
all'intera fonte.
Strumenti e comandi
Usa defineToolPlugin per semplici plugin che includono
solo strumenti con nomi fissi. Usa direttamente api.registerTool(...) per i
plugin misti o per la registrazione completamente dinamica degli strumenti.
| Metodo | Cosa registra |
|---|---|
api.registerTool(tool, opts?) |
Strumento dell'agente (obbligatorio oppure { optional: true }) |
api.registerCommand(def) |
Comando personalizzato (ignora l'LLM) |
api.registerNodeHostCommand(command) |
Comando gestito da openclaw node run; i metadati facoltativi agentTool possono esporlo come strumento visibile all'agente mentre il Node è connesso |
I comandi dei plugin possono impostare agentPromptGuidance quando l'agente
necessita di una breve indicazione di instradamento appartenente al comando.
Limita il testo al comando stesso; non aggiungere criteri specifici per provider
o plugin ai generatori dei prompt del core.
Le voci delle indicazioni possono essere stringhe legacy, che si applicano a ogni superficie dei prompt, oppure voci strutturate:
agentPromptGuidance: [ "Indicazione globale per il comando.", { text: "Mostra questo solo nel prompt principale di OpenClaw.", surfaces: ["openclaw_main"] },];Le surfaces strutturate possono includere openclaw_main, codex_app_server,
cli_backend, acp_backend o subagent. pi_main rimane un alias deprecato
di openclaw_main. Ometti surfaces per le indicazioni intenzionalmente
applicabili a tutte le superfici. Non passare un array surfaces vuoto: viene
rifiutato affinché una perdita accidentale dell'ambito non trasformi il testo in
un prompt globale.
Le istruzioni native per sviluppatori del server applicativo Codex sono più
rigorose rispetto alle altre superfici dei prompt: solo le indicazioni il cui
ambito è esplicitamente codex_app_server vengono promosse in quel canale a
priorità più elevata. Le indicazioni sotto forma di stringhe legacy e le
indicazioni strutturate senza ambito rimangono disponibili alle superfici dei
prompt diverse da Codex per compatibilità.
I comandi dell'host Node vengono eseguiti sull'host Node connesso, non all'interno del processo Gateway. Se agentTool è presente, il Node pubblica un descrittore dopo una connessione riuscita al Gateway; il Gateway lo espone alle esecuzioni dell'agente solo mentre quel Node è connesso e solo se il valore command del descrittore rientra nell'insieme di comandi approvati del Node. Impostare agentTool.defaultPlatforms per includere un comando non pericoloso nella allowlist predefinita dei comandi del Node; in caso contrario, è necessario configurare esplicitamente gateway.nodes.allowCommands o una policy di invocazione del Node. agentTool.name deve essere sicuro per il provider: deve iniziare con una lettera, utilizzare solo lettere, cifre, trattini bassi o trattini e non superare i 64 caratteri. Gli strumenti Node basati su MCP possono impostare i metadati agentTool.mcp affinché il catalogo e le superfici di ricerca degli strumenti possano mostrare l'identità del server/strumento MCP remoto, ma l'esecuzione avviene comunque tramite il comando Node pubblicizzato.
Infrastruttura
| Metodo | Cosa registra |
|---|---|
api.registerHook(events, handler, opts?) |
Hook di evento |
api.registerHttpRoute(params) |
Endpoint HTTP del Gateway |
api.registerGatewayMethod(name, handler) |
Metodo RPC del Gateway |
api.registerGatewayDiscoveryService(service) |
Annunciatore del servizio di rilevamento del Gateway locale |
api.registerCli(registrar, opts?) |
Sottocomando CLI |
api.registerNodeCliFeature(registrar, opts?) |
Funzionalità CLI del Node in openclaw nodes |
api.registerService(service) |
Servizio in background |
api.registerInteractiveHandler(registration) |
Gestore interattivo |
api.registerAgentToolResultMiddleware(...) |
Middleware di runtime per i risultati degli strumenti |
api.registerMemoryPromptSupplement(builder) |
Sezione aggiuntiva del prompt adiacente alla memoria |
api.registerMemoryCorpusSupplement(adapter) |
Corpus aggiuntivo per la ricerca e la lettura della memoria |
api.registerHostedMediaResolver(resolver) |
Risolutore per URL di contenuti multimediali ospitati in stile browser |
api.registerTextTransforms(transforms) |
Riscritture testuali di compatibilità di prompt/messaggi gestite dal Plugin |
api.registerConfigMigration(migrate) |
Migrazione leggera della configurazione eseguita prima del caricamento del runtime del Plugin |
api.registerMigrationProvider(provider) |
Importatore per openclaw migrate |
api.registerAutoEnableProbe(probe) |
Verifica della configurazione che può abilitare automaticamente questo Plugin |
api.registerReload(registration) |
Policy di prefisso della configurazione per la gestione del ricaricamento tramite riavvio/hot/noop |
api.registerNodeHostCommand(command) |
Gestore di comandi esposto ai Node associati |
api.registerNodeInvokePolicy(policy) |
Policy di allowlist/approvazione per i comandi invocati dal Node |
api.registerSecurityAuditCollector(collector) |
Raccoglitore dei risultati per openclaw security audit |
I builder dei supplementi del prompt di memoria ricevono il contesto facoltativo agentId, agentSessionKey e sandboxed. Le chiamate search e get del supplemento del corpus di memoria ricevono il contesto facoltativo agentId e sandboxed. I Plugin con archiviazione appartenente all'agente devono risolvere tale archiviazione per ogni chiamata, anziché acquisire un unico percorso globale durante la registrazione. Se un ID agente è obbligatorio ma manca in un'operazione multi-agente, rifiutare l'operazione in modo sicuro anziché scegliere un agente arbitrario.
I gestori interattivi di Telegram possono restituire { submitText } per instradare il testo attraverso il normale percorso in ingresso dell'agente di Telegram dopo l'esito positivo del gestore. OpenClaw mantiene il pulsante di callback quando la policy in ingresso ignora il testo o l'elaborazione non riesce, affinché l'utente possa riprovare dopo la modifica della condizione bloccante. Questo campo del risultato è specifico di Telegram; gli altri canali mantengono i propri contratti per i risultati interattivi.
Hook dell'host per i Plugin di flusso di lavoro
Gli hook dell'host sono i punti di integrazione dell'SDK per i Plugin che devono partecipare al ciclo di vita dell'host, anziché limitarsi ad aggiungere un provider, un canale o uno strumento. Sono contratti generici; possono essere utilizzati dalla modalità di pianificazione, ma anche da flussi di lavoro di approvazione, controlli delle policy dello spazio di lavoro, monitor in background, procedure guidate di configurazione e Plugin complementari per l'interfaccia utente.
| Metodo | Contratto di cui è responsabile |
|---|---|
api.session.state.registerSessionExtension(...) |
Stato della sessione appartenente al Plugin e compatibile con JSON, proiettato attraverso le sessioni del Gateway |
api.session.workflow.enqueueNextTurnInjection(...) |
Contesto persistente elaborato esattamente una volta e inserito nel turno successivo dell'agente per una sessione |
api.registerTrustedToolPolicy(...) |
Policy attendibile degli strumenti precedente ai Plugin e vincolata dal manifesto, in grado di bloccare o riscrivere i parametri degli strumenti |
api.registerToolMetadata(...) |
Metadati di visualizzazione del catalogo degli strumenti senza modificare l'implementazione dello strumento |
api.registerCommand(...) |
Comandi del Plugin con ambito definito; i risultati dei comandi possono impostare continueAgent: true o suppressReply: true; i comandi nativi di Discord supportano descriptionLocalizations |
api.session.controls.registerControlUiDescriptor(...) |
Descrittori dei contributi alla UI di controllo per le superfici di sessione, strumento, esecuzione, impostazioni o scheda |
api.lifecycle.registerRuntimeLifecycle(...) |
Callback di pulizia per le risorse di runtime appartenenti al Plugin nei percorsi di reimpostazione/eliminazione/ricaricamento |
api.agent.events.registerAgentEventSubscription(...) |
Sottoscrizioni agli eventi sanificate per lo stato del flusso di lavoro e i monitor |
api.runContext.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
Stato temporaneo del Plugin per esecuzione, eliminato al termine del ciclo di vita dell'esecuzione |
api.session.workflow.registerSessionSchedulerJob(...) |
Metadati di pulizia per i processi dello scheduler appartenenti al Plugin; non pianifica attività né crea record di attività |
api.session.workflow.sendSessionAttachment(...) |
Consegna di file allegati mediata dall'host, riservata ai componenti inclusi, verso il percorso diretto in uscita della sessione attiva |
api.session.workflow.scheduleSessionTurn(...) / unscheduleSessionTurnsByTag(...) |
Turni di sessione pianificati e basati su Cron, riservati ai componenti inclusi, con pulizia basata sui tag |
api.session.controls.registerSessionAction(...) |
Azioni di sessione tipizzate che i client possono inviare tramite il Gateway |
Un descrittore surface: "tab" aggiunge una scheda nella barra laterale della UI di controllo. I descrittori delle schede dei Plugin attivi vengono comunicati ai client della dashboard nel messaggio hello del Gateway (controlUiTabs), quindi la scheda viene visualizzata solo mentre il Plugin è abilitato. I Plugin inclusi possono fornire una vista della dashboard di prima classe per la propria scheda; gli altri Plugin possono impostare path su una route HTTP del Plugin (vedere api.registerHttpRoute(...)) che la dashboard visualizza in un frame con sandbox. icon è un suggerimento per il nome dell'icona della dashboard, group seleziona la sezione della barra laterale (control o agent), order determina l'ordinamento tra le schede dei Plugin e requiredScopes nasconde la scheda alle connessioni prive di tali ambiti operatore:
api.session.controls.registerControlUiDescriptor({ surface: "tab", id: "logbook", label: "Logbook", description: "Your day as a timeline, built from screen snapshots.", icon: "sun", group: "control", requiredScopes: ["operator.write"],});Utilizzare gli spazi dei nomi raggruppati per il nuovo codice dei Plugin:
api.session.state.registerSessionExtension(...)api.session.workflow.enqueueNextTurnInjection(...)api.session.workflow.registerSessionSchedulerJob(...)api.session.workflow.sendSessionAttachment(...)api.session.workflow.scheduleSessionTurn(...)api.session.workflow.unscheduleSessionTurnsByTag(...)api.session.controls.registerSessionAction(...)api.session.controls.registerControlUiDescriptor(...)api.agent.events.registerAgentEventSubscription(...)api.agent.events.emitAgentEvent(...)api.runContext.setRunContext(...)/getRunContext(...)/clearRunContext(...)api.lifecycle.registerRuntimeLifecycle(...)
I metodi piatti equivalenti rimangono disponibili come alias di compatibilità deprecati per i Plugin esistenti. Non aggiungere nuovo codice di Plugin che chiami direttamente api.registerSessionExtension, api.enqueueNextTurnInjection, api.registerControlUiDescriptor, api.registerRuntimeLifecycle, api.registerAgentEventSubscription, api.emitAgentEvent, api.setRunContext, api.getRunContext, api.clearRunContext, api.registerSessionSchedulerJob, api.registerSessionAction, api.sendSessionAttachment, api.scheduleSessionTurn o api.unscheduleSessionTurnsByTag.
scheduleSessionTurn(...) è una funzione di utilità con ambito di sessione basata sullo scheduler Cron del Gateway. Cron gestisce la temporizzazione e crea il record dell'attività in background quando il turno viene eseguito; l'SDK del Plugin limita soltanto la sessione di destinazione, la denominazione appartenente al Plugin e la pulizia. Utilizzare api.runtime.tasks.managedFlows all'interno del turno pianificato quando il lavoro stesso richiede uno stato Task Flow persistente e articolato in più passaggi.
I contratti separano intenzionalmente l'autorità:
- I Plugin esterni possono gestire estensioni di sessione, descrittori dell'interfaccia utente, comandi, metadati degli strumenti, inserimenti nel turno successivo e hook normali.
- Le policy attendibili degli strumenti vengono eseguite prima dei normali hook
before_tool_calle sono considerate attendibili dall'host. Le policy incluse vengono eseguite per prime; quelle dei Plugin installati richiedono l'abilitazione esplicita e l'inclusione dei relativi ID locali incontracts.trustedToolPolicies, quindi vengono eseguite nell'ordine di caricamento dei Plugin. Gli ID delle policy hanno come ambito il Plugin che le registra. - La titolarità dei comandi riservati è limitata ai componenti inclusi. I Plugin esterni devono utilizzare nomi di comando o alias propri.
allowPromptInjection=falsedisabilita gli hook che modificano il prompt, inclusiagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, i campi del prompt provenienti dal precedentebefore_agent_starteenqueueNextTurnInjection.
Esempi di utilizzatori non legati alla modalità di pianificazione:
| Archetipo di Plugin | Hook utilizzati |
|---|---|
| Flusso di approvazione | Estensione della sessione, continuazione del comando, inserimento nel turno successivo, descrittore dell'interfaccia utente |
| Controllo dei criteri di budget/area di lavoro | Criteri degli strumenti attendibili, metadati degli strumenti, proiezione della sessione |
| Monitoraggio del ciclo di vita in background | Pulizia del ciclo di vita del runtime, sottoscrizione agli eventi dell'agente, proprietà/pulizia dello scheduler di sessione, contributo al prompt Heartbeat, descrittore dell'interfaccia utente |
| Procedura guidata di configurazione o onboarding | Estensione della sessione, comandi con ambito definito, descrittore dell'interfaccia utente di controllo |
Quando utilizzare il middleware dei risultati degli strumenti
I Plugin inclusi e i Plugin installati esplicitamente abilitati con contratti
di manifesto corrispondenti possono utilizzare api.registerAgentToolResultMiddleware(...)
quando devono riscrivere il risultato di uno strumento dopo l'esecuzione e prima che il runtime
lo restituisca al modello. Questo è il punto di integrazione attendibile e indipendente dal runtime
per i riduttori di output asincroni come tokenjuice.
I Plugin devono dichiarare contracts.agentToolResultMiddleware per ogni runtime
di destinazione, ad esempio ["openclaw", "codex"]. I Plugin installati privi di tale
contratto, o non esplicitamente abilitati, non possono registrare questo middleware; utilizza
i normali hook dei Plugin OpenClaw per le operazioni che non richiedono una temporizzazione
del risultato dello strumento precedente al modello. Il vecchio percorso di registrazione
della factory di estensione riservato al runner incorporato è stato rimosso.
Registrazione del rilevamento del Gateway
api.registerGatewayDiscoveryService(...) consente a un Plugin di annunciare il
Gateway attivo su un trasporto di rilevamento locale come mDNS/Bonjour. OpenClaw chiama il
servizio durante l'avvio del Gateway quando il rilevamento locale è abilitato, passa le
porte correnti del Gateway e dati di suggerimento TXT non segreti, quindi chiama il gestore
stop restituito durante l'arresto del Gateway.
api.registerGatewayDiscoveryService({ id: "my-discovery", async advertise(ctx) { const handle = await startMyAdvertiser({ gatewayPort: ctx.gatewayPort, tls: ctx.gatewayTlsEnabled, displayName: ctx.machineDisplayName, }); return { stop: () => handle.stop() }; },});I Plugin di rilevamento del Gateway non devono considerare segreti o dati di autenticazione i valori TXT annunciati. Il rilevamento è un suggerimento per l'instradamento; l'autenticazione del Gateway e il pinning TLS continuano a determinare l'attendibilità.
Metadati di registrazione della CLI
api.registerCli(registrar, opts?) accetta due tipi di metadati dei comandi:
commands: nomi espliciti dei comandi di proprietà del registratoredescriptors: descrittori dei comandi usati durante l'analisi per la guida della CLI, l'instradamento e la registrazione differita della CLI del PluginparentPath: percorso facoltativo del comando padre per gruppi di comandi annidati, come["nodes"]
Per le funzionalità dei nodi associati, preferisci
api.registerNodeCliFeature(registrar, opts?). È un piccolo wrapper di
api.registerCli(..., { parentPath: ["nodes"] }) e rende comandi come
openclaw nodes canvas funzionalità dei nodi esplicitamente di proprietà del Plugin.
Se vuoi che un comando del Plugin rimanga caricato in modo differito nel normale percorso
radice della CLI, fornisci descriptors che coprano ogni radice di comando di primo livello
esposta dal registratore.
api.registerCli( async ({ program }) => { const { registerMatrixCli } = await import("./src/cli.js"); registerMatrixCli({ program }); }, { descriptors: [ { name: "matrix", description: "Gestisci account Matrix, verifica, dispositivi e stato del profilo", hasSubcommands: true, }, ], },);I comandi annidati ricevono il comando padre risolto come program:
api.registerCli( async ({ program }) => { const { registerNodesCanvasCommands } = await import("./src/cli.js"); registerNodesCanvasCommands(program); }, { parentPath: ["nodes"], descriptors: [ { name: "canvas", description: "Acquisisci o visualizza il contenuto del canvas da un nodo associato", hasSubcommands: true, }, ], },);Utilizza solo commands esclusivamente quando non ti serve la registrazione differita
della CLI radice. Questo percorso di compatibilità con caricamento immediato rimane supportato,
ma non installa segnaposto basati su descrittori per il caricamento differito durante l'analisi.
Registrazione del backend CLI
api.registerCliBackend(...) consente a un Plugin di gestire la configurazione predefinita
per un backend CLI di IA locale come claude-cli o my-cli.
- L'
iddel backend diventa il prefisso del provider nei riferimenti ai modelli comemy-cli/gpt-5. - La
configdel backend usa la stessa struttura diagents.defaults.cliBackends.<id>. - La configurazione dell'utente continua ad avere la precedenza. OpenClaw sovrappone
agents.defaults.cliBackends.<id>alla configurazione predefinita del Plugin prima di eseguire la CLI. - Utilizza
normalizeConfigquando un backend richiede riscritture di compatibilità dopo l'unione (ad esempio, per normalizzare vecchie strutture dei flag). - Utilizza
resolveExecutionArgsper le riscritture di argv relative alla richiesta che appartengono al dialetto della CLI, come la mappatura dei livelli di ragionamento di OpenClaw a un flag nativo di intensità. L'hook ricevectx.executionMode; utilizza"side-question"per aggiungere flag di isolamento nativi del backend per le chiamate temporanee/btw. Se tali flag disabilitano in modo affidabile gli strumenti nativi per una CLI altrimenti sempre attiva, dichiara anchesideQuestionToolMode: "disabled". - I backend in grado di disabilitare tutti gli strumenti nativi per un'esecuzione specifica possono
dichiarare
nativeToolMode: "selectable". Le chiamate con restrizioni passano una tuplactx.toolAvailability.nativevuota insieme a una lista di autorizzazioni MCP esatta e isolata dall'host;resolveExecutionArgsdeve applicarle entrambe all'argv finale di una nuova esecuzione o di una ripresa. OpenClaw interrompe l'operazione in modo sicuro se il backend non è in grado di farlo.
Per una guida completa alla creazione, consulta i Plugin per backend CLI.
Slot esclusivi
| Metodo | Cosa registra |
|---|---|
api.registerContextEngine(id, factory) |
Motore di contesto (uno attivo alla volta). Le callback del ciclo di vita ricevono runtimeSettings quando l'host può fornire diagnostica su modello/provider/modalità; i motori rigorosi meno recenti vengono riprovati senza tale chiave. |
api.registerMemoryCapability(capability) |
Funzionalità di memoria unificata |
api.registerMemoryPromptSection(builder) |
Generatore della sezione di memoria del prompt |
api.registerMemoryFlushPlan(resolver) |
Risolutore del piano di scaricamento della memoria |
api.registerMemoryRuntime(runtime) |
Adattatore del runtime di memoria |
Adattatori di embedding della memoria deprecati
| Metodo | Cosa registra |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
Adattatore di embedding della memoria per il Plugin attivo |
registerMemoryCapabilityè l'API esclusiva preferita per i Plugin di memoria.registerMemoryCapabilitypuò anche esporrepublicArtifacts.listArtifacts(...)affinché i Plugin complementari possano utilizzare gli artefatti di memoria esportati tramiteopenclaw/plugin-sdk/memory-host-core, invece di accedere alla struttura privata di uno specifico Plugin di memoria.registerMemoryPromptSection,registerMemoryFlushPlaneregisterMemoryRuntimesono API esclusive per Plugin di memoria compatibili con le versioni precedenti.MemoryFlushPlan.modelpuò vincolare il turno di scaricamento a un riferimento esattoprovider/model, comeollama/qwen3:8b, senza ereditare la catena di fallback attiva.registerMemoryEmbeddingProviderè deprecato. I nuovi provider di embedding devono utilizzareapi.registerEmbeddingProvider(...)econtracts.embeddingProviders.- I provider esistenti specifici della memoria continuano a funzionare durante la finestra di migrazione, ma l'ispezione dei Plugin segnala questa condizione come debito di compatibilità per i Plugin non inclusi.
Eventi e ciclo di vita
| Metodo | Cosa fa |
|---|---|
api.on(hookName, handler, opts?) |
Hook tipizzato del ciclo di vita |
api.onConversationBindingResolved(handler) |
Callback di risoluzione dell'associazione della conversazione |
Consulta Hook dei Plugin per esempi, nomi comuni degli hook e semantica delle condizioni di protezione.
Semantica decisionale degli hook
before_install è un hook del ciclo di vita del runtime del Plugin, non l'interfaccia
dei criteri di installazione dell'operatore. Utilizza security.installPolicy quando una
decisione di autorizzazione/blocco deve coprire i percorsi di installazione o aggiornamento
tramite CLI e Gateway.
before_tool_call: la restituzione di{ block: true }è terminale. Quando un gestore la imposta, i gestori con priorità inferiore vengono ignorati.before_tool_call: la restituzione di{ block: false }viene trattata come nessuna decisione (come seblockfosse omesso), non come una sostituzione.before_install: la restituzione di{ block: true }è terminale. Quando un gestore la imposta, i gestori con priorità inferiore vengono ignorati.before_install: la restituzione di{ block: false }viene trattata come nessuna decisione (come seblockfosse omesso), non come una sostituzione.reply_dispatch: la restituzione di{ handled: true, ... }è terminale. Quando un gestore prende in carico l'invio, i gestori con priorità inferiore e il percorso predefinito di invio al modello vengono ignorati.message_sending: la restituzione di{ cancel: true }è terminale. Quando un gestore la imposta, i gestori con priorità inferiore vengono ignorati.message_sending: la restituzione di{ cancel: false }viene trattata come nessuna decisione (come secancelfosse omesso), non come una sostituzione.message_received: usa il campo tipizzatothreadIdquando è necessario instradare thread o argomenti in ingresso. Mantienimetadataper i dati aggiuntivi specifici del canale.message_sending: usa i campi di instradamento tipizzatireplyToId/threadIdprima di ricorrere ametadataspecifici del canale.gateway_start: usactx.config,ctx.workspaceDirectx.getCron?.()per lo stato di avvio gestito dal Gateway, invece di fare affidamento sugli hook internigateway:startup. A questo punto Cron potrebbe essere ancora in fase di caricamento.cron_reconciled: ricostruisce una proiezione Cron esterna completa dopo l'avvio o il ricaricamento dello scheduler. Includereasone lo stato effettivoenabled, compresoenabled: false, mentrectx.getCron?.()restituisce lo scheduler riconciliato esatto. Passactx.abortSignalalle operazioni di proiezione persistenti; l'operazione viene interrotta quando l'istantanea dello scheduler viene sostituita o il Gateway si chiude.cron_changed: osserva le modifiche al ciclo di vita di Cron gestito dal Gateway. Gli eventischedulederemovedsono indicazioni di riconciliazione successive al commit, non un registro ordinato delle differenze. Il campoevent.nextRunAtMsdi un evento pianificato è assente quando l'attività non prevede una successiva riattivazione; un evento di rimozione contiene comunque l'istantanea dell'attività eliminata.
Gli scheduler di riattivazione esterni devono applicare il debounce o aggregare gli eventi cron_changed,
quindi rileggere la vista persistente completa dallo scheduler acquisito più di recente da
cron_reconciled. Non adottare lo scheduler dal contesto di cron_changed: un'indicazione
separata proveniente da uno scheduler precedente può sovrapporsi a un ricaricamento successivo.
Usa cron_reconciled come attivatore dell'istantanea completa per lo stato persistente caricato
all'avvio del Gateway o alla sostituzione dello scheduler. Non viene riprodotto durante un
ricaricamento a caldo del solo Plugin. I gestori di osservazione vengono eseguiti in parallelo e gli
invii asincroni senza attesa possono sovrapporsi, quindi i consumer non devono dipendere dall'ordine
di completamento degli eventi. Mantieni OpenClaw come fonte autorevole per i controlli delle scadenze
e l'esecuzione.
Per un adattatore a esecuzione singola con sostituzione persistente, nuovi tentativi/backoff e arresto ordinato, consulta Proiezione Cron esterna sicura.
Campi dell'oggetto API
| Campo | Tipo | Descrizione |
|---|---|---|
api.id |
string |
ID del Plugin |
api.name |
string |
Nome visualizzato |
api.version |
string? |
Versione del Plugin (facoltativa) |
api.description |
string? |
Descrizione del Plugin (facoltativa) |
api.source |
string |
Percorso sorgente del Plugin |
api.rootDir |
string? |
Directory radice del Plugin (facoltativa) |
api.config |
OpenClawConfig |
Istantanea attuale della configurazione (istantanea di runtime attiva in memoria, quando disponibile) |
api.pluginConfig |
Record<string, unknown> |
Configurazione specifica del Plugin da plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
Helper di runtime |
api.logger |
PluginLogger |
Logger con ambito (debug, info, warn, error) |
api.registrationMode |
PluginRegistrationMode |
Modalità di caricamento attuale; "setup-runtime" è la finestra leggera di avvio/configurazione precedente al caricamento completo del punto di ingresso |
api.resolvePath(input) |
(string) => string |
Risolve un percorso relativo alla radice del Plugin |
Convenzione per i moduli interni
All'interno del Plugin, usa file barrel locali per le importazioni interne:
my-plugin/ api.ts # Esportazioni pubbliche per consumer esterni runtime-api.ts # Esportazioni di runtime esclusivamente interne index.ts # Punto di ingresso del Plugin setup-entry.ts # Punto di ingresso leggero per la sola configurazione (facoltativo)Le superfici pubbliche dei Plugin inclusi caricati tramite facade (api.ts, runtime-api.ts,
index.ts, setup-entry.ts e file di ingresso pubblici simili) preferiscono
l'istantanea della configurazione di runtime attiva quando OpenClaw è già in esecuzione. Se non esiste
ancora alcuna istantanea di runtime, ricorrono al file di configurazione risolto sul disco.
Le facade dei Plugin inclusi nel pacchetto devono essere caricate tramite i loader di facade dei Plugin
di OpenClaw; le importazioni dirette da dist/extensions/... aggirano i controlli del manifest
e del sidecar di runtime utilizzati dalle installazioni pacchettizzate per il codice di proprietà del Plugin.
I Plugin dei provider possono esporre un barrel di contratto locale e circoscritto al Plugin quando un helper è intenzionalmente specifico del provider e non appartiene ancora a un sottopercorso generico dell'SDK. Esempi inclusi:
- Anthropic: interfaccia pubblica
api.ts/contract-api.tsper gli helper delle intestazioni beta di Claude e del flussoservice_tier. @openclaw/openai-provider:api.tsesporta i costruttori dei provider, gli helper per il modello predefinito e i costruttori dei provider in tempo reale.@openclaw/openrouter-provider:api.tsesporta il costruttore del provider insieme agli helper di onboarding/configurazione.
Contenuti correlati
Opzioni di definePluginEntry e defineChannelPluginEntry.
Riferimento completo dello spazio dei nomi api.runtime.
Pacchettizzazione, manifest e schemi di configurazione.
Utilità di test e regole di lint.
Migrazione da superfici deprecate.
Architettura approfondita e modello delle funzionalità.