HOOK.md instalado por el operador para eventos de comandos y del Gateway como
/new, /reset, /stop, agent:bootstrap o gateway:startup.
Inicio rápido
Registra hooks tipados de Plugin conapi.on(...) desde la entrada de tu Plugin:
priority. Los hooks con la misma prioridad
mantienen el orden de registro.
Catálogo de hooks
Los hooks se agrupan por la superficie que extienden. Los nombres en negrita aceptan un resultado de decisión (bloquear, cancelar, sobrescribir o requerir aprobación); todos los demás son solo de observación. Turno del agentebefore_model_resolve— sobrescribe el proveedor o el modelo antes de que se carguen los mensajes de la sesiónbefore_prompt_build— añade contexto dinámico o texto del prompt del sistema antes de la llamada al modelobefore_agent_start— fase combinada solo por compatibilidad; prefiere los dos hooks anterioresbefore_agent_reply— interrumpe el turno del modelo con una respuesta sintética o silencioagent_end— observa los mensajes finales, el estado de éxito y la duración de la ejecución
model_call_started/model_call_ended— observa metadatos saneados de la llamada al proveedor/modelo, temporización, resultado y hashes acotados de id de solicitud sin contenido de prompt ni respuestallm_input— observa la entrada del proveedor (prompt del sistema, prompt, historial)llm_output— observa la salida del proveedor
before_tool_call— reescribe parámetros de herramientas, bloquea la ejecución o requiere aprobaciónafter_tool_call— observa resultados de herramientas, errores y duracióntool_result_persist— reescribe el mensaje del asistente producido a partir del resultado de una herramientabefore_message_write— inspecciona o bloquea una escritura de mensaje en progreso (poco frecuente)
inbound_claim— reclama un mensaje entrante antes del enrutamiento al agente (respuestas sintéticas)message_received— observa contenido entrante, remitente, hilo y metadatosmessage_sending— reescribe el contenido saliente o cancela la entregamessage_sent— observa el éxito o fallo de la entrega salientebefore_dispatch— inspecciona o reescribe un despacho saliente antes de entregarlo al canalreply_dispatch— participa en el pipeline final de despacho de respuestas
session_start/session_end— rastrean los límites del ciclo de vida de la sesiónbefore_compaction/after_compaction— observan o anotan ciclos de Compactionbefore_reset— observa eventos de restablecimiento de sesión (/reset, restablecimientos programáticos)
subagent_spawning/subagent_delivery_target/subagent_spawned/subagent_ended— coordinan el enrutamiento de subagentes y la entrega de finalización
gateway_start/gateway_stop— inician o detienen servicios propiedad del Plugin junto con el Gatewaybefore_install— inspecciona análisis de instalación de Skills o plugins y puede bloquearlos
Política de llamadas de herramientas
before_tool_call recibe:
event.toolNameevent.paramsevent.runIdopcionalevent.toolCallIdopcional- campos de contexto como
ctx.agentId,ctx.sessionKey,ctx.sessionIdyctx.tracede diagnóstico
block: truees terminal y omite los controladores de menor prioridad.block: falsese trata como ausencia de decisión.paramsreescribe los parámetros de la herramienta para la ejecución.requireApprovalpausa la ejecución del agente y solicita aprobación al usuario a través de las aprobaciones del Plugin. El comando/approvepuede aprobar tanto aprobaciones de exec como de Plugin.- Un
block: truede menor prioridad todavía puede bloquear después de que un hook de mayor prioridad haya solicitado aprobación. onResolutionrecibe la decisión de aprobación resuelta:allow-once,allow-always,deny,timeoutocancelled.
Hooks de prompt y modelo
Usa los hooks específicos por fase para plugins nuevos:before_model_resolve: recibe solo el prompt actual y los metadatos de adjuntos. DevuelveproviderOverrideomodelOverride.before_prompt_build: recibe el prompt actual y los mensajes de la sesión. DevuelveprependContext,systemPrompt,prependSystemContextoappendSystemContext.
before_agent_start se mantiene por compatibilidad. Prefiere los hooks explícitos anteriores
para que tu Plugin no dependa de una fase combinada heredada.
before_agent_start y agent_end incluyen event.runId cuando OpenClaw puede
identificar la ejecución activa. El mismo valor también está disponible en ctx.runId.
Usa model_call_started y model_call_ended para telemetría de llamadas al proveedor
que no deba recibir prompts brutos, historial, respuestas, cabeceras, cuerpos
de solicitud ni ids de solicitud del proveedor. Estos hooks incluyen metadatos estables como
runId, callId, provider, model, api/transport opcional,
durationMs/outcome terminales y upstreamRequestIdHash cuando OpenClaw puede derivar
un hash acotado del id de solicitud del proveedor.
Los plugins no integrados que necesiten llm_input, llm_output o agent_end deben establecer:
plugins.entries.<id>.hooks.allowPromptInjection=false.
Hooks de mensajes
Usa hooks de mensajes para políticas de enrutamiento y entrega a nivel de canal:message_received: observa contenido entrante, remitente,threadId,messageId,senderId, correlación opcional con ejecución/sesión y metadatos.message_sending: reescribecontento devuelve{ cancel: true }.message_sent: observa el éxito o fallo final.
content puede contener la transcripción hablada oculta
incluso cuando la carga útil del canal no tiene texto visible ni pie de medios. Reescribir ese
content actualiza solo la transcripción visible para hooks; no se representa como un
pie de medio.
Los contextos de hooks de mensajes exponen campos de correlación estables cuando están disponibles:
ctx.sessionKey, ctx.runId, ctx.messageId, ctx.senderId, ctx.trace,
ctx.traceId, ctx.spanId, ctx.parentSpanId y ctx.callDepth. Prefiere
estos campos de primera clase antes de leer metadatos heredados.
Prefiere los campos tipados threadId y replyToId antes de usar
metadatos específicos del canal.
Reglas de decisión:
message_sendingconcancel: truees terminal.message_sendingconcancel: falsese trata como ausencia de decisión.- El
contentreescrito continúa hacia hooks de menor prioridad a menos que un hook posterior cancele la entrega.
Hooks de instalación
before_install se ejecuta después del análisis integrado de instalaciones de Skills y plugins.
Devuelve hallazgos adicionales o { block: true, blockReason } para detener la
instalación.
block: true es terminal. block: false se trata como ausencia de decisión.
Ciclo de vida del Gateway
Usagateway_start para servicios del Plugin que necesiten estado propiedad del Gateway. El
contexto expone ctx.config, ctx.workspaceDir y ctx.getCron?.() para
inspección y actualización de Cron. Usa gateway_stop para limpiar recursos de larga duración.
No dependas del hook interno gateway:startup para servicios de tiempo de ejecución propiedad del Plugin.
Próximas deprecaciones
Algunas superficies adyacentes a hooks están deprecadas pero siguen siendo compatibles. Migra antes de la próxima versión mayor:- Sobres de canal en texto plano en los controladores
inbound_claimymessage_received. LeeBodyForAgenty los bloques estructurados de contexto de usuario en lugar de analizar texto plano del sobre. Consulta Sobres de canal en texto plano → BodyForAgent. before_agent_startse mantiene por compatibilidad. Los plugins nuevos deben usarbefore_model_resolveybefore_prompt_builden lugar de la fase combinada.onResolutionenbefore_tool_callahora usa la unión tipadaPluginApprovalResolution(allow-once/allow-always/deny/timeout/cancelled) en lugar de unstringde formato libre.
command-auth → command-status — consulta
Migración del SDK de Plugin → Deprecaciones activas.
Relacionado
- Migración del SDK de Plugin — deprecaciones activas y cronograma de eliminación
- Creación de plugins
- Descripción general del SDK de Plugin
- Puntos de entrada de Plugin
- Hooks internos
- Aspectos internos de la arquitectura de Plugin