Skip to main content

Hooks de session

hooks permet d’injecter du code dans chaque étape du cycle de vie d’une session Copilot. Vous pouvez ainsi ajouter le contrôle d’exécution d’outils, le journal d’audit, l’enrichissement de prompts, la gestion d’erreurs, etc., sans toucher au cœur de l’implémentation. Il s’agit d’une fonctionnalité distincte des hooks déclaratifs dans les définitions d’agents personnalisés et du chargement des hooks basés sur des fichiers. Pour la configuration par agent, consultez Agents personnalisés.

Découverte des hooks basés sur des fichiers

hookDirectories permet d’indiquer des racines explicites où découvrir des hooks basés sur des fichiers. Cela sert uniquement à la découverte et n’accorde pas à l’agent de permissions générales d’accès aux fichiers. Les racines explicites restent utilisables même si enableConfigDiscovery ou enableFileHooks sont désactivés. Les chemins relatifs sont résolus une seule fois, par rapport au workingDirectory effectif au moment de la spécification.
  • Omis ou null : les autres sources de découverte ne sont pas modifiées
  • [] : seules les racines SDK explicites sont effacées
Les réglages de désactivation par source des hooks et les Managed Settings continuent de s’appliquer. enableFileHooks contrôle les hooks de fichiers provenant du dépôt (.github/hooks/ et les racines des paramètres de dépôts de confiance). Il ne désactive ni les hookDirectories explicites ni les hooks de callbacks PHP.

Flux des hooks

Utilisation de base

Hooks disponibles

Renvoyer null maintient le comportement par défaut.

Bloquer un prompt

onUserPromptSubmitted peut refuser un prompt en renvoyant decision: 'block'. En cas de refus, aucun tour du modèle n’est lancé et le message utilisateur n’est pas enregistré. Si vous indiquez reason, son contenu est inclus dans un événement session.warning éphémère avec warningType: "policy_blocked".

Cas d’usage typiques

1) Contrôle des permissions (Permission control)

  • Utilisez onPreToolUse en mode allow-list
  • Les opérations destructrices déclenchent une validation humaine via permissionDecision: 'ask'
  • Précisez la raison du refus avec permissionDecisionReason
  • Les noms d’outils candidats se trouvent dans la liste Outils (ex. view, glob, bash)

2) Audit / conformité

  • Combinez les hooks du cycle de vie pour collecter des événements d’audit
  • Persistez les données collectées par ID de session

3) Enrichissement du prompt

  • Ajoutez à additionalContext les infos projet (langage, framework, conventions) via onSessionStart
  • Développez les raccourcis (/fix, /test) dans onUserPromptSubmitted

4) Filtrage des résultats

  • Masquez les API keys / tokens / mots de passe dans onPostToolUse
  • Résumez les résultats trop longs et ne renvoyez le détail qu’à la demande

5) Récupération d’erreur

  • Dans onErrorOccurred, effectuez un retry uniquement si model_call et recoverable=true
  • En cas d’erreur non récupérable, notifiez brièvement l’utilisateur via userNotification

6) Métriques de session

  • Enregistrez l’heure de début dans onSessionStart
  • Incrémentez les compteurs dans onPreToolUse / onUserPromptSubmitted
  • Émettez la durée, le nombre d’outils et la raison de fin dans onSessionEnd

Types d’entrée / sortie des hooks

Entrée commune (BaseHookInput)

agentId / agentType / parentAgentId sont disponibles dans les hooks dont l’acteur est un sous-agent. Ils ne sont pas inclus dans les hooks de l’agent racine. Avec les anciens runtimes, les champs eux-mêmes sont omis lorsque l’information est absente. Ils peuvent donc tous valoir null.

PreToolUseHookInput

PreToolUseHookOutput

PostToolUseHookInput

PostToolUseHookOutput

UserPromptSubmittedHookInput

UserPromptSubmittedHookOutput

SessionStartHookInput

SessionStartHookOutput

SessionEndHookInput

SessionEndHookOutput

ErrorOccurredHookInput

ErrorOccurredHookOutput

ToolResultObject

Objet standard représentant le résultat d’exécution d’un outil.

Bonnes pratiques

  1. N’exécutez pas trop de traitements synchrones lourds à l’intérieur des hooks. Passez à de l’asynchrone si nécessaire.
  2. Quand aucun changement n’est requis, renvoyez null pour laisser le comportement par défaut.
  3. Explicitez autant que possible permissionDecision.
  4. Ne masquez pas trop les erreurs critiques : conservez des chemins de log/notification.
  5. Gérez l’état par ID de session et nettoyez dans onSessionEnd.
Pour les dernières informations, consultez le dépôt GitHub.
Dernière modification le 19 octobre 2026