agent-sdk/hooks.md +10 −10
24 </Step>24 </Step>
25 25
26 <Step title="Le SDK collecte les hooks enregistrés">26 <Step title="Le SDK collecte les hooks enregistrés">
2727 Le SDK vérifie les hooks enregistrés pour ce type d'événement. Cela inclut les hooks de rappel que vous transmettez dans `options.hooks` et les hooks de commande shell à partir des fichiers de paramètres lorsque l'entrée [`settingSources`](/fr/agent-sdk/typescript#setting-source) ou [`setting_sources`](/fr/agent-sdk/python#setting-source) correspondante est activée, ce qui est le cas pour les options `query()` par défaut. Le SDK vérifie les hooks enregistrés pour ce type d'événement. Cela inclut les hooks de rappel que vous transmettez dans `options.hooks` et les hooks de commande shell à partir des fichiers de paramètres lorsque l'entrée [`settingSources`](/fr/agent-sdk/typescript#settingSources) ou [`setting_sources`](/fr/agent-sdk/python#settingSources) correspondante est activée, ce qui est le cas pour les options `query()` par défaut.
28 </Step>28 </Step>
29 29
30 <Step title="Les matchers filtrent les hooks qui s'exécutent">30 <Step title="Les matchers filtrent les hooks qui s'exécutent">
225 225
226Chaque rappel hook reçoit trois arguments :226Chaque rappel hook reçoit trois arguments :
227 227
228228* **Données d'entrée :** un objet typé contenant les détails de l'événement. Chaque type de hook a sa propre forme d'entrée (par exemple, `PreToolUseHookInput` inclut `tool_name` et `tool_input`, tandis que `NotificationHookInput` inclut `message`). Consultez les définitions de type complètes dans les références du SDK [TypeScript](/fr/agent-sdk/typescript#hook-input) et [Python](/fr/agent-sdk/python#hook-input).* **Données d'entrée :** un objet typé contenant les détails de l'événement. Chaque type de hook a sa propre forme d'entrée (par exemple, `PreToolUseHookInput` inclut `tool_name` et `tool_input`, tandis que `NotificationHookInput` inclut `message`). Consultez les définitions de type complètes dans les références du SDK [TypeScript](/fr/agent-sdk/typescript#hookinput) et [Python](/fr/agent-sdk/python#hookinput).
229 * Toutes les entrées de hook partagent `session_id`, `cwd` et `hook_event_name`.229 * Toutes les entrées de hook partagent `session_id`, `cwd` et `hook_event_name`.
230 * `agent_id` et `agent_type` sont remplis lorsque le hook se déclenche à l'intérieur d'un sous-agent. En TypeScript, ceux-ci se trouvent sur l'entrée de hook de base et sont disponibles pour tous les types de hook. En Python, ils se trouvent uniquement sur `PreToolUse`, `PostToolUse` et `PostToolUseFailure`.230 * `agent_id` et `agent_type` sont remplis lorsque le hook se déclenche à l'intérieur d'un sous-agent. En TypeScript, ceux-ci se trouvent sur l'entrée de hook de base et sont disponibles pour tous les types de hook. En Python, ils se trouvent uniquement sur `PreToolUse`, `PostToolUse` et `PostToolUseFailure`.
231* **ID d'utilisation d'outil** (`str | None` / `string | undefined`) : met en corrélation les événements `PreToolUse` et `PostToolUse` pour le même appel d'outil.231* **ID d'utilisation d'outil** (`str | None` / `string | undefined`) : met en corrélation les événements `PreToolUse` et `PostToolUse` pour le même appel d'outil.
236Votre rappel retourne un objet avec deux catégories de champs :236Votre rappel retourne un objet avec deux catégories de champs :
237 237
238* **Champs de niveau supérieur** contrôlent la conversation : `systemMessage` injecte un message dans la conversation visible au modèle, et `continue` (`continue_` en Python) détermine si l'agent continue à s'exécuter après ce hook.238* **Champs de niveau supérieur** contrôlent la conversation : `systemMessage` injecte un message dans la conversation visible au modèle, et `continue` (`continue_` en Python) détermine si l'agent continue à s'exécuter après ce hook.
239239* **`hookSpecificOutput`** contrôle l'opération actuelle. Les champs à l'intérieur dépendent du type d'événement hook. Pour les hooks `PreToolUse`, c'est là que vous définissez `permissionDecision` (`"allow"`, `"deny"` ou `"ask"`), `permissionDecisionReason` et `updatedInput`. Dans le SDK TypeScript, `permissionDecision` accepte également `"defer"` pour terminer la requête et [reprendre plus tard](/fr/hooks#defer-a-tool-call-for-later) ; cette valeur n'est pas disponible dans le SDK Python. Pour les hooks `PostToolUse`, vous pouvez définir `additionalContext` pour ajouter des informations au résultat de l'outil, ou `updatedToolOutput` pour remplacer entièrement la sortie de l'outil avant que Claude ne la voie.* **`hookSpecificOutput`** contrôle l'opération actuelle. Les champs à l'intérieur dépendent du type d'événement hook. Pour les hooks `PreToolUse`, c'est là que vous définissez `permissionDecision` (`"allow"`, `"deny"`, `"ask"` ou `"defer"`), `permissionDecisionReason` et `updatedInput`. Retourner `"defer"` termine la requête pour que vous puissiez [la reprendre plus tard](/fr/hooks#defer-a-tool-call-for-later). Pour les hooks `PostToolUse`, vous pouvez définir `additionalContext` pour ajouter des informations au résultat de l'outil, ou `updatedToolOutput` pour remplacer entièrement la sortie de l'outil avant que Claude ne la voie.
240 240
241241Retournez `{}` pour autoriser l'opération sans modifications. Les hooks de rappel du SDK utilisent le même format de sortie JSON que les [hooks de commande shell Claude Code](/fr/hooks#json-output), qui documente chaque champ et option spécifique à l'événement. Pour les définitions de type du SDK, consultez les références du SDK [TypeScript](/fr/agent-sdk/typescript#sync-hook-json-output) et [Python](/fr/agent-sdk/python#sync-hook-json-output).Retournez `{}` pour autoriser l'opération sans modifications. Les hooks de rappel du SDK utilisent le même format de sortie JSON que les [hooks de commande shell Claude Code](/fr/hooks#json-output), qui documente chaque champ et option spécifique à l'événement. Pour les définitions de type du SDK, consultez les références du SDK [TypeScript](/fr/agent-sdk/typescript#synchookjsonoutput) et [Python](/fr/agent-sdk/python#synchookjsonoutput).
242 242
243<Note>243<Note>
244 Lorsque plusieurs hooks ou règles de permission s'appliquent, **deny** a priorité sur **defer**, qui a priorité sur **ask**, qui a priorité sur **allow**. Si un hook retourne `deny`, l'opération est bloquée indépendamment des autres hooks.244 Lorsque plusieurs hooks ou règles de permission s'appliquent, **deny** a priorité sur **defer**, qui a priorité sur **ask**, qui a priorité sur **allow**. Si un hook retourne `deny`, l'opération est bloquée indépendamment des autres hooks.
326</CodeGroup>326</CodeGroup>
327 327
328<Note>328<Note>
329329 Lors de l'utilisation de `updatedInput`, vous devez également inclure `permissionDecision: 'allow'`. Retournez toujours un nouvel objet plutôt que de muter le `tool_input` original. Lors de l'utilisation de `updatedInput`, vous devez également inclure `permissionDecision: 'allow'` pour approuver automatiquement l'entrée modifiée ou `permissionDecision: 'ask'` pour la montrer à l'utilisateur. Avec `'defer'`, `updatedInput` est ignoré. Retournez toujours un nouvel objet plutôt que de muter le `tool_input` original.
330</Note>330</Note>
331 331
332### Ajouter du contexte et bloquer un outil332### Ajouter du contexte et bloquer un outil
489 489
490### Suivre l'activité des sous-agents490### Suivre l'activité des sous-agents
491 491
492492Utilisez les hooks `SubagentStop` pour surveiller quand les sous-agents terminent leur travail. Consultez le type d'entrée complet dans les références du SDK [TypeScript](/fr/agent-sdk/typescript#hook-input) et [Python](/fr/agent-sdk/python#hook-input). Cet exemple enregistre un résumé chaque fois qu'un sous-agent se termine :Utilisez les hooks `SubagentStop` pour surveiller quand les sous-agents terminent leur travail. Consultez le type d'entrée complet dans les références du SDK [TypeScript](/fr/agent-sdk/typescript#hookinput) et [Python](/fr/agent-sdk/python#hookinput). Cet exemple enregistre un résumé chaque fois qu'un sous-agent se termine :
493 493
494<CodeGroup>494<CodeGroup>
495 ```python Python theme={null}495 ```python Python theme={null}
621 621
622### Transférer les notifications à Slack622### Transférer les notifications à Slack
623 623
624624Utilisez les hooks `Notification` pour recevoir les notifications système de l'agent et les transférer vers des services externes. Les notifications se déclenchent pour des types d'événements spécifiques : `permission_prompt` (Claude a besoin d'une permission), `idle_prompt` (Claude attend une entrée), `auth_success` (authentification terminée) et `elicitation_dialog` (Claude invite l'utilisateur). Chaque notification inclut un champ `message` avec une description lisible par l'homme et optionnellement un `title`.Utilisez les hooks `Notification` pour recevoir les notifications système de l'agent et les transférer vers des services externes. Les notifications se déclenchent pour des types d'événements spécifiques : `permission_prompt` (Claude a besoin d'une permission), `idle_prompt` (Claude attend une entrée), `auth_success` (authentification terminée), `elicitation_dialog` (Claude invite l'utilisateur), `elicitation_response` (l'utilisateur a répondu à une élicitation), et `elicitation_complete` (une élicitation s'est fermée). Chaque notification inclut un champ `message` avec une description lisible par l'homme et optionnellement un `title`.
625 625
626Cet exemple transfère chaque notification à un canal Slack. Il nécessite une [URL de webhook entrant Slack](https://api.slack.com/messaging/webhooks), que vous créez en ajoutant une application à votre espace de travail Slack et en activant les webhooks entrants :626Cet exemple transfère chaque notification à un canal Slack. Il nécessite une [URL de webhook entrant Slack](https://api.slack.com/messaging/webhooks), que vous créez en ajoutant une application à votre espace de travail Slack et en activant les webhooks entrants :
627 627
727* Vérifiez que votre motif matcher correspond exactement au nom de l'outil727* Vérifiez que votre motif matcher correspond exactement au nom de l'outil
728* Assurez-vous que le hook se trouve sous le type d'événement correct dans `options.hooks`728* Assurez-vous que le hook se trouve sous le type d'événement correct dans `options.hooks`
729* Pour les hooks non basés sur les outils comme `Stop` et `SubagentStop`, les matchers correspondent à des champs différents (consultez [motifs matcher](/fr/hooks#matcher-patterns))729* Pour les hooks non basés sur les outils comme `Stop` et `SubagentStop`, les matchers correspondent à des champs différents (consultez [motifs matcher](/fr/hooks#matcher-patterns))
730730* Les hooks peuvent ne pas se déclencher lorsque l'agent atteint la limite [`max_turns`](/fr/agent-sdk/python#claude-agent-options) car la session se termine avant que les hooks puissent s'exécuter* Les hooks peuvent ne pas se déclencher lorsque l'agent atteint la limite [`max_turns`](/fr/agent-sdk/python#claudeagentoptions) car la session se termine avant que les hooks puissent s'exécuter
731 731
732### Matcher ne filtre pas comme prévu732### Matcher ne filtre pas comme prévu
733 733
769 };769 };
770 ```770 ```
771 771
772772* Vous devez également retourner `permissionDecision: 'allow'` pour que la modification d'entrée prenne effet* Vous devez également retourner `permissionDecision: 'allow'` ou `'ask'` pour que la modification d'entrée prenne effet
773 773
774* Incluez `hookEventName` dans `hookSpecificOutput` pour identifier le type de hook pour lequel la sortie est destinée774* Incluez `hookEventName` dans `hookSpecificOutput` pour identifier le type de hook pour lequel la sortie est destinée
775 775
776### Hooks de session non disponibles en Python776### Hooks de session non disponibles en Python
777 777
778778`SessionStart` et `SessionEnd` peuvent être enregistrés en tant que hooks de rappel du SDK en TypeScript, mais ne sont pas disponibles dans le SDK Python (`HookEvent` les omet). En Python, ils ne sont disponibles que comme [hooks de commande shell](/fr/hooks#hook-events) définis dans les fichiers de paramètres (par exemple, `.claude/settings.json`). Pour charger les hooks de commande shell à partir de votre application SDK, incluez la source de paramètre appropriée avec [`setting_sources`](/fr/agent-sdk/python#setting-source) ou [`settingSources`](/fr/agent-sdk/typescript#setting-source) :`SessionStart` et `SessionEnd` peuvent être enregistrés en tant que hooks de rappel du SDK en TypeScript, mais ne sont pas disponibles dans le SDK Python (`HookEvent` les omet). En Python, ils ne sont disponibles que comme [hooks de commande shell](/fr/hooks#hook-events) définis dans les fichiers de paramètres (par exemple, `.claude/settings.json`). Pour charger les hooks de commande shell à partir de votre application SDK, incluez la source de paramètre appropriée avec [`setting_sources`](/fr/agent-sdk/python#settingsource) ou [`settingSources`](/fr/agent-sdk/typescript#settingsource) :
779 779
780<CodeGroup>780<CodeGroup>
781 ```python Python theme={null}781 ```python Python theme={null}