HOOK.md installato dall’operatore per eventi di comandi e Gateway come
/new, /reset, /stop, agent:bootstrap o gateway:startup.
Avvio rapido
Registra hook di Plugin tipizzati conapi.on(...) dal punto di ingresso del tuo Plugin:
priority. Gli hook con la stessa priorità mantengono l’ordine di registrazione.
Catalogo degli hook
Gli hook sono raggruppati per superficie che estendono. I nomi in grassetto accettano un risultato decisionale (blocco, annullamento, override o richiesta di approvazione); tutti gli altri sono solo di osservazione. Turno dell’agentebefore_model_resolve— sovrascrive provider o modello prima che vengano caricati i messaggi della sessionebefore_prompt_build— aggiunge contesto dinamico o testo del system prompt prima della chiamata al modellobefore_agent_start— fase combinata solo per compatibilità; preferisci i due hook soprabefore_agent_reply— interrompe il turno del modello con una risposta sintetica o silenzioagent_end— osserva i messaggi finali, lo stato di successo e la durata dell’esecuzione
model_call_started/model_call_ended— osservano metadati sanitizzati di chiamata provider/modello, tempistiche, esito e hash request-id delimitati senza contenuto di prompt o rispostallm_input— osserva l’input del provider (system prompt, prompt, cronologia)llm_output— osserva l’output del provider
before_tool_call— riscrive i parametri dello strumento, blocca l’esecuzione o richiede approvazioneafter_tool_call— osserva risultati dello strumento, errori e duratatool_result_persist— riscrive il messaggio dell’assistente prodotto dal risultato di uno strumentobefore_message_write— ispeziona o blocca una scrittura di messaggio in corso (raro)
inbound_claim— prende possesso di un messaggio in ingresso prima dell’instradamento all’agente (risposte sintetiche)message_received— osserva contenuto in ingresso, mittente, thread e metadatimessage_sending— riscrive il contenuto in uscita o annulla la consegnamessage_sent— osserva il successo o il fallimento della consegna in uscitabefore_dispatch— ispeziona o riscrive una dispatch in uscita prima del passaggio al canalereply_dispatch— partecipa alla pipeline finale di dispatch della risposta
session_start/session_end— tracciano i confini del ciclo di vita della sessionebefore_compaction/after_compaction— osservano o annotano i cicli di Compactionbefore_reset— osserva gli eventi di reset della sessione (/reset, reset programmatici)
subagent_spawning/subagent_delivery_target/subagent_spawned/subagent_ended— coordinano l’instradamento e la consegna al completamento dei sottoagenti
gateway_start/gateway_stop— avviano o arrestano servizi di proprietà del Plugin insieme al Gatewaybefore_install— ispeziona le scansioni di installazione di Skills o Plugin e può facoltativamente bloccarle
Policy delle chiamate agli strumenti
before_tool_call riceve:
event.toolNameevent.params- facoltativamente
event.runId - facoltativamente
event.toolCallId - campi di contesto come
ctx.agentId,ctx.sessionKey,ctx.sessionIde diagnosticactx.trace
block: trueè terminale e salta gli handler con priorità inferiore.block: falseviene trattato come nessuna decisione.paramsriscrive i parametri dello strumento per l’esecuzione.requireApprovalmette in pausa l’esecuzione dell’agente e chiede all’utente tramite le approvazioni del Plugin. Il comando/approvepuò approvare sia approvazioni exec sia del Plugin.- Un
block: truea priorità inferiore può comunque bloccare dopo che un hook a priorità superiore ha richiesto approvazione. onResolutionriceve la decisione di approvazione risolta —allow-once,allow-always,deny,timeoutocancelled.
Hook di prompt e modello
Usa gli hook specifici per fase per i nuovi Plugin:before_model_resolve: riceve solo il prompt corrente e i metadati degli allegati. RestituisciproviderOverrideomodelOverride.before_prompt_build: riceve il prompt corrente e i messaggi della sessione. RestituisciprependContext,systemPrompt,prependSystemContextoappendSystemContext.
before_agent_start rimane per compatibilità. Preferisci gli hook espliciti sopra
così il tuo Plugin non dipende da una fase combinata legacy.
before_agent_start e agent_end includono event.runId quando OpenClaw può
identificare l’esecuzione attiva. Lo stesso valore è disponibile anche in ctx.runId.
Usa model_call_started e model_call_ended per telemetria delle chiamate provider
che non deve ricevere prompt grezzi, cronologia, risposte, header, body
della richiesta o request ID del provider. Questi hook includono metadati stabili come
runId, callId, provider, model, api/transport opzionali,
durationMs/outcome terminali e upstreamRequestIdHash quando OpenClaw può derivare un
hash delimitato del request-id del provider.
I Plugin non integrati che richiedono llm_input, llm_output o agent_end devono impostare:
plugins.entries.<id>.hooks.allowPromptInjection=false.
Hook dei messaggi
Usa gli hook dei messaggi per instradamento a livello di canale e policy di consegna:message_received: osserva contenuto in ingresso, mittente,threadId,messageId,senderId, correlazione facoltativa con esecuzione/sessione e metadati.message_sending: riscrivecontento restituisce{ cancel: true }.message_sent: osserva il successo o il fallimento finali.
content può contenere la trascrizione parlata nascosta
anche quando il payload del canale non ha testo/didascalia visibile. Riscrivere quel
content aggiorna solo la trascrizione visibile all’hook; non viene renderizzata come
didascalia del media.
I contesti degli hook dei messaggi espongono campi di correlazione stabili quando disponibili:
ctx.sessionKey, ctx.runId, ctx.messageId, ctx.senderId, ctx.trace,
ctx.traceId, ctx.spanId, ctx.parentSpanId e ctx.callDepth. Preferisci
questi campi di prima classe prima di leggere metadati legacy.
Preferisci i campi tipizzati threadId e replyToId prima di usare
metadati specifici del canale.
Regole decisionali:
message_sendingconcancel: trueè terminale.message_sendingconcancel: falseviene trattato come nessuna decisione.- Il
contentriscritto continua verso gli hook con priorità inferiore a meno che un hook successivo annulli la consegna.
Hook di installazione
before_install viene eseguito dopo la scansione integrata per installazioni di Skills e Plugin.
Restituisci risultati aggiuntivi o { block: true, blockReason } per fermare
l’installazione.
block: true è terminale. block: false viene trattato come nessuna decisione.
Ciclo di vita del Gateway
Usagateway_start per servizi del Plugin che richiedono stato di proprietà del Gateway. Il
contesto espone ctx.config, ctx.workspaceDir e ctx.getCron?.() per
ispezione e aggiornamenti di Cron. Usa gateway_stop per pulire risorse di lunga durata.
Non fare affidamento sull’hook interno gateway:startup per servizi runtime
di proprietà del Plugin.
Deprecazioni imminenti
Alcune superfici adiacenti agli hook sono deprecate ma ancora supportate. Esegui la migrazione prima della prossima major release:- Envelope di canale plaintext negli handler
inbound_claimemessage_received. LeggiBodyForAgente i blocchi strutturati di contesto utente invece di analizzare testo envelope piatto. Vedi Envelope di canale plaintext → BodyForAgent. before_agent_startresta per compatibilità. I nuovi Plugin dovrebbero usarebefore_model_resolveebefore_prompt_buildinvece della fase combinata.onResolutioninbefore_tool_callora usa la union tipizzataPluginApprovalResolution(allow-once/allow-always/deny/timeout/cancelled) invece di unastringlibera.
command-auth → command-status — vedi
Plugin SDK migration → Deprecazioni attive.
Correlati
- Plugin SDK migration — deprecazioni attive e timeline di rimozione
- Creazione di Plugin
- Panoramica dell’SDK del Plugin
- Punti di ingresso del Plugin
- Hook interni
- Dettagli interni dell’architettura dei Plugin