Skip to main content

Hook di sessione

Con hooks puoi inserire logica in ciascuna fase del ciclo di vita di una sessione Copilot. Puoi aggiungere controllo dell’esecuzione degli strumenti, log di audit, arricchimento del prompt, gestione degli errori e altro senza modificare l’implementazione core. Si tratta di una funzionalità distinta dagli hooks dichiarativi nella definizione di un agente personalizzato e dal caricamento degli hook basati su file. Per la configurazione per agente consulta Agenti personalizzati.

Rilevamento degli hook basati su file

In hookDirectories puoi specificare radici esplicite in cui rilevare gli hook basati su file. Serve solo per il rilevamento e non concede all’agente permessi generali di accesso ai file. Le radici esplicite sono utilizzabili anche se enableConfigDiscovery o enableFileHooks sono disabilitati. I percorsi relativi vengono risolti una sola volta rispetto alla workingDirectory effettiva al momento della specifica.
  • Omesso o null: non modifica le altre fonti di rilevamento
  • []: cancella solo le radici SDK specificate esplicitamente
Le impostazioni di disabilitazione delle fonti degli hook e le Managed Settings continuano ad applicarsi. enableFileHooks controlla gli hook su file provenienti dal repository (.github/hooks/ e le radici delle impostazioni di repository attendibili). Non disabilita le hookDirectories esplicite né gli hooks con callback PHP.

Flusso degli hook

Uso di base

Hook disponibili

Restituendo null prosegue il comportamento predefinito.

Blocco del prompt

onUserPromptSubmitted può rifiutare il prompt restituendo decision: 'block'. In caso di rifiuto, il turn del modello non viene avviato e il messaggio dell’utente non viene registrato. Se specifichi reason, il suo contenuto viene incluso in un evento temporaneo session.warning con warningType: "policy_blocked".

Casi d’uso tipici

1) Permission control (controllo esecuzione)

  • Usa onPreToolUse per applicare una allow-list di strumenti
  • Le operazioni distruttive richiedono approvazione umana con permissionDecision: 'ask'
  • Motiva il rifiuto con permissionDecisionReason
  • Consulta l’elenco di Tools per i possibili toolName (es. view, glob, bash)

2) Auditing / compliance

  • Combina gli hook del ciclo di vita per raccogliere eventi di audit
  • Persisti i dati raccolti per singolo ID sessione

3) Prompt enrichment (arricchimento input)

  • In onSessionStart aggiungi le informazioni del progetto (linguaggio, framework, convenzioni) in additionalContext
  • In onUserPromptSubmitted espandi shortcut (/fix, /test)

4) Result filtering (formattazione dei risultati)

  • In onPostToolUse maschera API key / token / password ecc.
  • Sintetizza i risultati troppo lunghi e restituisci i dettagli solo se necessario

5) Error recovery (ripristino)

  • In onErrorOccurred esegui retry solo quando model_call e recoverable=true
  • Per errori non recuperabili notifica in modo conciso l’utente tramite userNotification

6) Session metrics (misurazione)

  • In onSessionStart registra l’orario di inizio
  • In onPreToolUse / onUserPromptSubmitted aggiorna i contatori
  • In onSessionEnd emetti durata, numero di strumenti e motivo di terminazione

Tipi di input / output degli hook

Input comune (BaseHookInput)

agentId / agentType / parentAgentId sono disponibili negli hook in cui l’attore è un subagent. Non sono inclusi negli hook dell’agente root. Nei runtime meno recenti, se l’informazione non è disponibile, il campo stesso viene omesso. Per questo motivo, ciascuno di essi può essere null.

PreToolUseHookInput

PreToolUseHookOutput

PostToolUseHookInput

PostToolUseHookOutput

UserPromptSubmittedHookInput

UserPromptSubmittedHookOutput

SessionStartHookInput

SessionStartHookOutput

SessionEndHookInput

SessionEndHookOutput

ErrorOccurredHookInput

ErrorOccurredHookOutput

ToolResultObject

Oggetto standard per il risultato di uno strumento.

Best practice

  1. Non eseguire troppi processi sincroni pesanti direttamente negli hook. Se necessario, rendili asincroni.
  2. Quando non sono necessarie modifiche, restituisci null e lascia il comportamento predefinito.
  3. Rendi esplicito permissionDecision quando possibile.
  4. Non sopprimere eccessivamente gli errori critici: prevedi percorsi di log/notifica.
  5. Gestisci lo stato per sessione basandoti sull’ID e ripulisci in onSessionEnd.
Per le informazioni più recenti fai riferimento al repository GitHub.
Ultima modifica il 19 ottobre 2026