HOOK.md instalado pelo operador para comandos e eventos do Gateway como
/new, /reset, /stop, agent:bootstrap ou gateway:startup.
Início rápido
Registre hooks tipados de Plugin comapi.on(...) a partir da entrada do seu Plugin:
priority. Hooks com a mesma prioridade
mantêm a ordem de registro.
Catálogo de hooks
Os hooks são agrupados pela superfície que estendem. Nomes em negrito aceitam um resultado de decisão (bloquear, cancelar, sobrescrever ou exigir aprovação); todos os demais são somente de observação. Turno do agentebefore_model_resolve— sobrescreve o provedor ou modelo antes de as mensagens da sessão serem carregadasbefore_prompt_build— adiciona contexto dinâmico ou texto de prompt de sistema antes da chamada ao modelobefore_agent_start— fase combinada somente para compatibilidade; prefira os dois hooks acimabefore_agent_reply— interrompe o turno do modelo com uma resposta sintética ou silêncioagent_end— observa mensagens finais, estado de sucesso e duração da execução
model_call_started/model_call_ended— observa metadados saneados da chamada de provedor/modelo, temporização, resultado e hashes limitados de ID de requisição sem conteúdo de prompt ou respostallm_input— observa a entrada do provedor (prompt de sistema, prompt, histórico)llm_output— observa a saída do provedor
before_tool_call— reescreve parâmetros de ferramenta, bloqueia a execução ou exige aprovaçãoafter_tool_call— observa resultados de ferramenta, erros e duraçãotool_result_persist— reescreve a mensagem do assistente produzida a partir do resultado de uma ferramentabefore_message_write— inspeciona ou bloqueia uma gravação de mensagem em andamento (raro)
inbound_claim— reivindica uma mensagem recebida antes do roteamento do agente (respostas sintéticas)message_received— observa conteúdo recebido, remetente, thread e metadadosmessage_sending— reescreve conteúdo de saída ou cancela a entregamessage_sent— observa sucesso ou falha da entrega de saídabefore_dispatch— inspeciona ou reescreve um despacho de saída antes da transferência para o canalreply_dispatch— participa do pipeline final de despacho de resposta
session_start/session_end— acompanham os limites do ciclo de vida da sessãobefore_compaction/after_compaction— observam ou anotam ciclos de Compactionbefore_reset— observa eventos de reset de sessão (/reset, resets programáticos)
subagent_spawning/subagent_delivery_target/subagent_spawned/subagent_ended— coordenam o roteamento de subagentes e a entrega de conclusão
gateway_start/gateway_stop— iniciam ou encerram serviços pertencentes ao Plugin com o Gatewaybefore_install— inspeciona varreduras de instalação de Skills ou Plugins e opcionalmente bloqueia
Política de chamada de ferramenta
before_tool_call recebe:
event.toolNameevent.paramsevent.runIdopcionalevent.toolCallIdopcional- campos de contexto como
ctx.agentId,ctx.sessionKey,ctx.sessionIdectx.tracede diagnóstico
block: trueé terminal e ignora handlers de prioridade mais baixa.block: falseé tratado como nenhuma decisão.paramsreescreve os parâmetros da ferramenta para execução.requireApprovalpausa a execução do agente e pergunta ao usuário por meio de aprovações de Plugin. O comando/approvepode aprovar tanto aprovações de exec quanto de Plugin.- Um
block: truede prioridade mais baixa ainda pode bloquear depois que um hook de prioridade mais alta solicitou aprovação. onResolutionrecebe a decisão de aprovação resolvida —allow-once,allow-always,deny,timeoutoucancelled.
Hooks de prompt e modelo
Use os hooks específicos por fase para novos Plugins:before_model_resolve: recebe apenas o prompt atual e metadados de anexos. RetorneproviderOverrideoumodelOverride.before_prompt_build: recebe o prompt atual e as mensagens da sessão. RetorneprependContext,systemPrompt,prependSystemContextouappendSystemContext.
before_agent_start permanece por compatibilidade. Prefira os hooks explícitos acima
para que seu Plugin não dependa de uma fase combinada legada.
before_agent_start e agent_end incluem event.runId quando o OpenClaw consegue
identificar a execução ativa. O mesmo valor também está disponível em ctx.runId.
Use model_call_started e model_call_ended para telemetria de chamada de provedor
que não deve receber prompts brutos, histórico, respostas, headers, corpos de
requisição ou IDs de requisição do provedor. Esses hooks incluem metadados estáveis como
runId, callId, provider, model, api/transport opcionais,
durationMs/outcome terminais e upstreamRequestIdHash quando o OpenClaw consegue derivar um
hash limitado do ID de requisição do provedor.
Plugins não empacotados que precisam de llm_input, llm_output ou agent_end devem definir:
plugins.entries.<id>.hooks.allowPromptInjection=false.
Hooks de mensagem
Use hooks de mensagem para roteamento em nível de canal e política de entrega:message_received: observa conteúdo recebido, remetente,threadId,messageId,senderId, correlação opcional de execução/sessão e metadados.message_sending: reescrevecontentou retorna{ cancel: true }.message_sent: observa sucesso ou falha final.
content pode conter a transcrição falada oculta
mesmo quando a carga útil do canal não tem texto/legenda visível. Reescrever esse
content atualiza apenas a transcrição visível para hooks; isso não é renderizado como
legenda da mídia.
Os contextos de hook de mensagem expõem campos de correlação estáveis quando disponíveis:
ctx.sessionKey, ctx.runId, ctx.messageId, ctx.senderId, ctx.trace,
ctx.traceId, ctx.spanId, ctx.parentSpanId e ctx.callDepth. Prefira esses
campos de primeira classe antes de ler metadados legados.
Prefira campos tipados threadId e replyToId antes de usar metadados específicos do canal.
Regras de decisão:
message_sendingcomcancel: trueé terminal.message_sendingcomcancel: falseé tratado como nenhuma decisão.contentreescrito continua para hooks de prioridade mais baixa, a menos que um hook posterior cancele a entrega.
Hooks de instalação
before_install é executado após a varredura interna para instalações de Skills e Plugins.
Retorne descobertas adicionais ou { block: true, blockReason } para interromper a
instalação.
block: true é terminal. block: false é tratado como nenhuma decisão.
Ciclo de vida do Gateway
Usegateway_start para serviços do Plugin que precisam de estado pertencente ao Gateway. O
contexto expõe ctx.config, ctx.workspaceDir e ctx.getCron?.() para
inspeção e atualizações de Cron. Use gateway_stop para limpar recursos de longa duração.
Não dependa do hook interno gateway:startup para serviços de runtime pertencentes ao Plugin.
Descontinuações futuras
Algumas superfícies adjacentes a hooks estão descontinuadas, mas ainda são compatíveis. Migre antes do próximo grande release:- Envelopes de canal em texto simples em handlers
inbound_claimemessage_received. LeiaBodyForAgente os blocos estruturados de contexto do usuário em vez de analisar texto simples de envelope. Veja Plaintext channel envelopes → BodyForAgent. before_agent_startpermanece por compatibilidade. Novos Plugins devem usarbefore_model_resolveebefore_prompt_buildem vez da fase combinada.onResolutionembefore_tool_callagora usa a união tipadaPluginApprovalResolution(allow-once/allow-always/deny/timeout/cancelled) em vez de umastringde formato livre.
command-auth → command-status — consulte
Plugin SDK migration → Active deprecations.
Relacionado
- Plugin SDK migration — descontinuações ativas e cronograma de remoção
- Building plugins
- Plugin SDK overview
- Plugin entry points
- Internal hooks
- Plugin architecture internals