agent-sdk/hooks.md +10 −10
24 </Step>24 </Step>
25 25
26 <Step title="El SDK recopila hooks registrados">26 <Step title="El SDK recopila hooks registrados">
2727 El SDK verifica si hay hooks registrados para ese tipo de evento. Esto incluye hooks de devolución de llamada que pasa en `options.hooks` y hooks de comandos de shell de archivos de configuración cuando la entrada [`settingSources`](/es/agent-sdk/typescript#setting-source) o [`setting_sources`](/es/agent-sdk/python#setting-source) correspondiente está habilitada, lo cual lo está para las opciones predeterminadas de `query()`. El SDK verifica si hay hooks registrados para ese tipo de evento. Esto incluye hooks de devolución de llamada que pasa en `options.hooks` y hooks de comandos de shell de archivos de configuración cuando la entrada [`settingSources`](/es/agent-sdk/typescript#settingSources) o [`setting_sources`](/es/agent-sdk/python#settingSources) correspondiente está habilitada, lo cual lo está para las opciones predeterminadas de `query()`.
28 </Step>28 </Step>
29 29
30 <Step title="Los matchers filtran qué hooks se ejecutan">30 <Step title="Los matchers filtran qué hooks se ejecutan">
225 225
226Cada devolución de llamada de hook recibe tres argumentos:226Cada devolución de llamada de hook recibe tres argumentos:
227 227
228228* **Datos de entrada:** un objeto tipado que contiene detalles del evento. Cada tipo de hook tiene su propia forma de entrada (por ejemplo, `PreToolUseHookInput` incluye `tool_name` y `tool_input`, mientras que `NotificationHookInput` incluye `message`). Vea las definiciones de tipo completas en las referencias del SDK de [TypeScript](/es/agent-sdk/typescript#hook-input) y [Python](/es/agent-sdk/python#hook-input).* **Datos de entrada:** un objeto tipado que contiene detalles del evento. Cada tipo de hook tiene su propia forma de entrada (por ejemplo, `PreToolUseHookInput` incluye `tool_name` y `tool_input`, mientras que `NotificationHookInput` incluye `message`). Vea las definiciones de tipo completas en las referencias del SDK de [TypeScript](/es/agent-sdk/typescript#hookinput) y [Python](/es/agent-sdk/python#hookinput).
229 * Todas las entradas de hook comparten `session_id`, `cwd` y `hook_event_name`.229 * Todas las entradas de hook comparten `session_id`, `cwd` y `hook_event_name`.
230 * `agent_id` y `agent_type` se rellenan cuando el hook se dispara dentro de un subagente. En TypeScript, estos están en la entrada de hook base y disponibles para todos los tipos de hook. En Python, están solo en `PreToolUse`, `PostToolUse` y `PostToolUseFailure`.230 * `agent_id` y `agent_type` se rellenan cuando el hook se dispara dentro de un subagente. En TypeScript, estos están en la entrada de hook base y disponibles para todos los tipos de hook. En Python, están solo en `PreToolUse`, `PostToolUse` y `PostToolUseFailure`.
231* **ID de uso de herramienta** (`str | None` / `string | undefined`): correlaciona eventos `PreToolUse` y `PostToolUse` para la misma llamada de herramienta.231* **ID de uso de herramienta** (`str | None` / `string | undefined`): correlaciona eventos `PreToolUse` y `PostToolUse` para la misma llamada de herramienta.
236Su devolución de llamada devuelve un objeto con dos categorías de campos:236Su devolución de llamada devuelve un objeto con dos categorías de campos:
237 237
238* **Campos de nivel superior** controlan la conversación: `systemMessage` inyecta un mensaje en la conversación visible para el modelo, y `continue` (`continue_` en Python) determina si el agente sigue ejecutándose después de este hook.238* **Campos de nivel superior** controlan la conversación: `systemMessage` inyecta un mensaje en la conversación visible para el modelo, y `continue` (`continue_` en Python) determina si el agente sigue ejecutándose después de este hook.
239239* **`hookSpecificOutput`** controla la operación actual. Los campos dentro dependen del tipo de evento de hook. Para hooks `PreToolUse`, aquí es donde establece `permissionDecision` (`"allow"`, `"deny"` o `"ask"`), `permissionDecisionReason` e `updatedInput`. En el SDK de TypeScript, `permissionDecision` también acepta `"defer"` para finalizar la consulta y [reanudar más tarde](/es/hooks#defer-a-tool-call-for-later); este valor no está disponible en el SDK de Python. Para hooks `PostToolUse`, puede establecer `additionalContext` para agregar información al resultado de la herramienta, o `updatedToolOutput` para reemplazar completamente la salida de la herramienta antes de que Claude la vea.* **`hookSpecificOutput`** controla la operación actual. Los campos dentro dependen del tipo de evento de hook. Para hooks `PreToolUse`, aquí es donde establece `permissionDecision` (`"allow"`, `"deny"`, `"ask"` o `"defer"`), `permissionDecisionReason` e `updatedInput`. Devolver `"defer"` finaliza la consulta para que pueda [reanudarla más tarde](/es/hooks#defer-a-tool-call-for-later). Para hooks `PostToolUse`, puede establecer `additionalContext` para agregar información al resultado de la herramienta, o `updatedToolOutput` para reemplazar completamente la salida de la herramienta antes de que Claude la vea.
240 240
241241Devuelva `{}` para permitir la operación sin cambios. Los hooks de devolución de llamada del SDK usan el mismo formato de salida JSON que [hooks de comandos de shell de Claude Code](/es/hooks#json-output), que documenta cada campo y opción específica del evento. Para las definiciones de tipo del SDK, vea las referencias del SDK de [TypeScript](/es/agent-sdk/typescript#sync-hook-json-output) y [Python](/es/agent-sdk/python#sync-hook-json-output).Devuelva `{}` para permitir la operación sin cambios. Los hooks de devolución de llamada del SDK usan el mismo formato de salida JSON que [hooks de comandos de shell de Claude Code](/es/hooks#json-output), que documenta cada campo y opción específica del evento. Para las definiciones de tipo del SDK, vea las referencias del SDK de [TypeScript](/es/agent-sdk/typescript#synchookjsonoutput) y [Python](/es/agent-sdk/python#synchookjsonoutput).
242 242
243<Note>243<Note>
244 Cuando se aplican múltiples hooks o reglas de permiso, **deny** tiene prioridad sobre **defer**, que tiene prioridad sobre **ask**, que tiene prioridad sobre **allow**. Si algún hook devuelve `deny`, la operación se bloquea independientemente de otros hooks.244 Cuando se aplican múltiples hooks o reglas de permiso, **deny** tiene prioridad sobre **defer**, que tiene prioridad sobre **ask**, que tiene prioridad sobre **allow**. Si algún hook devuelve `deny`, la operación se bloquea independientemente de otros hooks.
326</CodeGroup>326</CodeGroup>
327 327
328<Note>328<Note>
329329 Cuando use `updatedInput`, también debe incluir `permissionDecision: 'allow'`. Siempre devuelva un nuevo objeto en lugar de mutar el `tool_input` original. Cuando use `updatedInput`, también debe incluir `permissionDecision: 'allow'` para aprobar automáticamente la entrada modificada o `permissionDecision: 'ask'` para mostrársela al usuario. Con `'defer'`, `updatedInput` se ignora. Siempre devuelva un nuevo objeto en lugar de mutar el `tool_input` original.
330</Note>330</Note>
331 331
332### Agregar contexto y bloquear una herramienta332### Agregar contexto y bloquear una herramienta
489 489
490### Rastrear actividad de subagente490### Rastrear actividad de subagente
491 491
492492Use hooks `SubagentStop` para monitorear cuándo los subagentes terminan su trabajo. Vea el tipo de entrada completo en las referencias del SDK de [TypeScript](/es/agent-sdk/typescript#hook-input) y [Python](/es/agent-sdk/python#hook-input). Este ejemplo registra un resumen cada vez que un subagente se completa:Use hooks `SubagentStop` para monitorear cuándo los subagentes terminan su trabajo. Vea el tipo de entrada completo en las referencias del SDK de [TypeScript](/es/agent-sdk/typescript#hookinput) y [Python](/es/agent-sdk/python#hookinput). Este ejemplo registra un resumen cada vez que un subagente se completa:
493 493
494<CodeGroup>494<CodeGroup>
495 ```python Python theme={null}495 ```python Python theme={null}
621 621
622### Reenviar notificaciones a Slack622### Reenviar notificaciones a Slack
623 623
624624Use hooks `Notification` para recibir notificaciones del sistema del agente y reenviarlas a servicios externos. Las notificaciones se disparan para tipos de evento específicos: `permission_prompt` (Claude necesita permiso), `idle_prompt` (Claude está esperando entrada), `auth_success` (autenticación completada) y `elicitation_dialog` (Claude está solicitando al usuario). Cada notificación incluye un campo `message` con una descripción legible por humanos y opcionalmente un `title`.Use hooks `Notification` para recibir notificaciones del sistema del agente y reenviarlas a servicios externos. Las notificaciones se disparan para tipos de evento específicos: `permission_prompt` (Claude necesita permiso), `idle_prompt` (Claude está esperando entrada), `auth_success` (autenticación completada), `elicitation_dialog` (Claude está solicitando al usuario), `elicitation_response` (el usuario respondió a una elicitación), y `elicitation_complete` (una elicitación se cerró). Cada notificación incluye un campo `message` con una descripción legible por humanos y opcionalmente un `title`.
625 625
626Este ejemplo reenvía cada notificación a un canal de Slack. Requiere una [URL de webhook entrante de Slack](https://api.slack.com/messaging/webhooks), que crea agregando una aplicación a su espacio de trabajo de Slack y habilitando webhooks entrantes:626Este ejemplo reenvía cada notificación a un canal de Slack. Requiere una [URL de webhook entrante de Slack](https://api.slack.com/messaging/webhooks), que crea agregando una aplicación a su espacio de trabajo de Slack y habilitando webhooks entrantes:
627 627
727* Verifique que su patrón de matcher coincida exactamente con el nombre de la herramienta727* Verifique que su patrón de matcher coincida exactamente con el nombre de la herramienta
728* Asegúrese de que el hook esté bajo el tipo de evento correcto en `options.hooks`728* Asegúrese de que el hook esté bajo el tipo de evento correcto en `options.hooks`
729* Para hooks que no son de herramientas como `Stop` y `SubagentStop`, los matchers coinciden contra campos diferentes (vea [patrones de matcher](/es/hooks#matcher-patterns))729* Para hooks que no son de herramientas como `Stop` y `SubagentStop`, los matchers coinciden contra campos diferentes (vea [patrones de matcher](/es/hooks#matcher-patterns))
730730* Los hooks pueden no dispararse cuando el agente alcanza el límite [`max_turns`](/es/agent-sdk/python#claude-agent-options) porque la sesión termina antes de que los hooks puedan ejecutarse* Los hooks pueden no dispararse cuando el agente alcanza el límite [`max_turns`](/es/agent-sdk/python#claudeagentoptions) porque la sesión termina antes de que los hooks puedan ejecutarse
731 731
732### Matcher no filtra como se esperaba732### Matcher no filtra como se esperaba
733 733
769 };769 };
770 ```770 ```
771 771
772772* También debe devolver `permissionDecision: 'allow'` para que la modificación de entrada surta efecto* También debe devolver `permissionDecision: 'allow'` u `'ask'` para que la modificación de entrada surta efecto
773 773
774* Incluya `hookEventName` en `hookSpecificOutput` para identificar para qué tipo de hook es la salida774* Incluya `hookEventName` en `hookSpecificOutput` para identificar para qué tipo de hook es la salida
775 775
776### Hooks de sesión no disponibles en Python776### Hooks de sesión no disponibles en Python
777 777
778778`SessionStart` y `SessionEnd` pueden registrarse como hooks de devolución de llamada del SDK en TypeScript, pero no están disponibles en el SDK de Python (`HookEvent` los omite). En Python, solo están disponibles como [hooks de comandos de shell](/es/hooks#hook-events) definidos en archivos de configuración (por ejemplo, `.claude/settings.json`). Para cargar hooks de comandos de shell desde su aplicación SDK, incluya la fuente de configuración apropiada con [`setting_sources`](/es/agent-sdk/python#setting-source) o [`settingSources`](/es/agent-sdk/typescript#setting-source):`SessionStart` y `SessionEnd` pueden registrarse como hooks de devolución de llamada del SDK en TypeScript, pero no están disponibles en el SDK de Python (`HookEvent` los omite). En Python, solo están disponibles como [hooks de comandos de shell](/es/hooks#hook-events) definidos en archivos de configuración (por ejemplo, `.claude/settings.json`). Para cargar hooks de comandos de shell desde su aplicación SDK, incluya la fuente de configuración apropiada con [`setting_sources`](/es/agent-sdk/python#settingsource) o [`settingSources`](/es/agent-sdk/typescript#settingsource):
779 779
780<CodeGroup>780<CodeGroup>
781 ```python Python theme={null}781 ```python Python theme={null}