agent-sdk/hooks.md +11 −11
20 20
21<Steps>21<Steps>
22 <Step title="Un evento si attiva">22 <Step title="Un evento si attiva">
2323 Qualcosa accade durante l'esecuzione dell'agente e l'SDK attiva un evento: un strumento sta per essere chiamato (`PreToolUse`), uno strumento ha restituito un risultato (`PostToolUse`), un subagente è stato avviato o interrotto, l'agente è inattivo o l'esecuzione è terminata. Consultate l'[elenco completo degli eventi](#available-hooks). Qualcosa accade durante l'esecuzione dell'agente e l'SDK attiva un evento: uno strumento sta per essere chiamato (`PreToolUse`), uno strumento ha restituito un risultato (`PostToolUse`), un subagente è stato avviato o interrotto, l'agente è inattivo o l'esecuzione è terminata. Consultate l'[elenco completo degli eventi](#available-hooks).
24 </Step>24 </Step>
25 25
26 <Step title="L'SDK raccoglie gli hooks registrati">26 <Step title="L'SDK raccoglie gli hooks registrati">
2727 L'SDK verifica la presenza di hooks registrati per quel tipo di evento. Questo include gli hooks di callback che passate in `options.hooks` e gli hooks dei comandi shell dai file di impostazioni quando la voce [`settingSources`](/it/agent-sdk/typescript#setting-source) o [`setting_sources`](/it/agent-sdk/python#setting-source) corrispondente è abilitata, come avviene per le opzioni predefinite di `query()`. L'SDK verifica la presenza di hooks registrati per quel tipo di evento. Questo include gli hooks di callback che passate in `options.hooks` e gli hooks dei comandi shell dai file di impostazioni quando la voce [`settingSources`](/it/agent-sdk/typescript#settingsource) o [`setting_sources`](/it/agent-sdk/python#settingsource) corrispondente è abilitata, come avviene per le opzioni predefinite di `query()`.
28 </Step>28 </Step>
29 29
30 <Step title="I matcher filtrano quali hooks vengono eseguiti">30 <Step title="I matcher filtrano quali hooks vengono eseguiti">
225 225
226Ogni callback hook riceve tre argomenti:226Ogni callback hook riceve tre argomenti:
227 227
228228* **Dati di input:** un oggetto tipizzato contenente i dettagli dell'evento. Ogni tipo di hook ha la sua forma di input (ad esempio, `PreToolUseHookInput` include `tool_name` e `tool_input`, mentre `NotificationHookInput` include `message`). Consultate le definizioni di tipo complete nei riferimenti SDK [TypeScript](/it/agent-sdk/typescript#hook-input) e [Python](/it/agent-sdk/python#hook-input).* **Dati di input:** un oggetto tipizzato contenente i dettagli dell'evento. Ogni tipo di hook ha la sua forma di input (ad esempio, `PreToolUseHookInput` include `tool_name` e `tool_input`, mentre `NotificationHookInput` include `message`). Consultate le definizioni di tipo complete nei riferimenti SDK [TypeScript](/it/agent-sdk/typescript#hookinput) e [Python](/it/agent-sdk/python#hookinput).
229 * Tutti gli input hook condividono `session_id`, `cwd` e `hook_event_name`.229 * Tutti gli input hook condividono `session_id`, `cwd` e `hook_event_name`.
230 * `agent_id` e `agent_type` vengono popolati quando l'hook si attiva all'interno di un subagente. In TypeScript, questi si trovano sull'input hook di base e sono disponibili per tutti i tipi di hook. In Python, si trovano solo su `PreToolUse`, `PostToolUse` e `PostToolUseFailure`.230 * `agent_id` e `agent_type` vengono popolati quando l'hook si attiva all'interno di un subagente. In TypeScript, questi si trovano sull'input hook di base e sono disponibili per tutti i tipi di hook. In Python, si trovano solo su `PreToolUse`, `PostToolUse` e `PostToolUseFailure`.
231* **ID di utilizzo dello strumento** (`str | None` / `string | undefined`): correla gli eventi `PreToolUse` e `PostToolUse` per la stessa chiamata a uno strumento.231* **ID di utilizzo dello strumento** (`str | None` / `string | undefined`): correla gli eventi `PreToolUse` e `PostToolUse` per la stessa chiamata a uno strumento.
236Il vostro callback restituisce un oggetto con due categorie di campi:236Il vostro callback restituisce un oggetto con due categorie di campi:
237 237
238* **Campi di livello superiore** controllano la conversazione: `systemMessage` inietta un messaggio nella conversazione visibile al modello e `continue` (`continue_` in Python) determina se l'agente continua a funzionare dopo questo hook.238* **Campi di livello superiore** controllano la conversazione: `systemMessage` inietta un messaggio nella conversazione visibile al modello e `continue` (`continue_` in Python) determina se l'agente continua a funzionare dopo questo hook.
239239* **`hookSpecificOutput`** controlla l'operazione corrente. I campi all'interno dipendono dal tipo di evento hook. Per gli hook `PreToolUse`, è qui che impostate `permissionDecision` (`"allow"`, `"deny"` o `"ask"`), `permissionDecisionReason` e `updatedInput`. Nell'SDK TypeScript, `permissionDecision` accetta anche `"defer"` per terminare la query e [riprendere in seguito](/it/hooks#defer-a-tool-call-for-later); questo valore non è disponibile nell'SDK Python. Per gli hook `PostToolUse`, potete impostare `additionalContext` per aggiungere informazioni al risultato dello strumento, o `updatedToolOutput` per sostituire completamente l'output dello strumento prima che Claude lo veda.* **`hookSpecificOutput`** controlla l'operazione corrente. I campi all'interno dipendono dal tipo di evento hook. Per gli hook `PreToolUse`, è qui che impostate `permissionDecision` (`"allow"`, `"deny"`, `"ask"` o `"defer"`), `permissionDecisionReason` e `updatedInput`. Restituire `"defer"` termina la query in modo da poter [riprendere in seguito](/it/hooks#defer-a-tool-call-for-later). Per gli hook `PostToolUse`, potete impostare `additionalContext` per aggiungere informazioni al risultato dello strumento, o `updatedToolOutput` per sostituire completamente l'output dello strumento prima che Claude lo veda.
240 240
241241Restituite `{}` per consentire l'operazione senza modifiche. Gli hook di callback SDK utilizzano lo stesso formato di output JSON degli [hook dei comandi shell di Claude Code](/it/hooks#json-output), che documenta ogni campo e opzione specifica dell'evento. Per le definizioni di tipo SDK, consultate i riferimenti SDK [TypeScript](/it/agent-sdk/typescript#sync-hook-json-output) e [Python](/it/agent-sdk/python#sync-hook-json-output).Restituite `{}` per consentire l'operazione senza modifiche. Gli hook di callback SDK utilizzano lo stesso formato di output JSON degli [hook dei comandi shell di Claude Code](/it/hooks#json-output), che documenta ogni campo e opzione specifica dell'evento. Per le definizioni di tipo SDK, consultate i riferimenti SDK [TypeScript](/it/agent-sdk/typescript#synchookjsonoutput) e [Python](/it/agent-sdk/python#synchookjsonoutput).
242 242
243<Note>243<Note>
244 Quando si applicano più hook o regole di autorizzazione, **deny** ha priorità su **defer**, che ha priorità su **ask**, che ha priorità su **allow**. Se un hook restituisce `deny`, l'operazione viene bloccata indipendentemente dagli altri hook.244 Quando si applicano più hook o regole di autorizzazione, **deny** ha priorità su **defer**, che ha priorità su **ask**, che ha priorità su **allow**. Se un hook restituisce `deny`, l'operazione viene bloccata indipendentemente dagli altri hook.
326</CodeGroup>326</CodeGroup>
327 327
328<Note>328<Note>
329329 Quando utilizzate `updatedInput`, dovete anche includere `permissionDecision: 'allow'`. Restituite sempre un nuovo oggetto piuttosto che mutare l'originale `tool_input`. Quando utilizzate `updatedInput`, dovete anche includere `permissionDecision: 'allow'` per approvare automaticamente l'input modificato o `permissionDecision: 'ask'` per mostrarlo all'utente. Con `'defer'`, `updatedInput` viene ignorato. Restituite sempre un nuovo oggetto piuttosto che mutare l'originale `tool_input`.
330</Note>330</Note>
331 331
332### Aggiungere contesto e bloccare uno strumento332### Aggiungere contesto e bloccare uno strumento
489 489
490### Tracciare l'attività dei subagenti490### Tracciare l'attività dei subagenti
491 491
492492Utilizzate gli hook `SubagentStop` per monitorare quando i subagenti completano il loro lavoro. Consultate il tipo di input completo nei riferimenti SDK [TypeScript](/it/agent-sdk/typescript#hook-input) e [Python](/it/agent-sdk/python#hook-input). Questo esempio registra un riepilogo ogni volta che un subagente si completa:Utilizzate gli hook `SubagentStop` per monitorare quando i subagenti completano il loro lavoro. Consultate il tipo di input completo nei riferimenti SDK [TypeScript](/it/agent-sdk/typescript#hookinput) e [Python](/it/agent-sdk/python#hookinput). Questo esempio registra un riepilogo ogni volta che un subagente si completa:
493 493
494<CodeGroup>494<CodeGroup>
495 ```python Python theme={null}495 ```python Python theme={null}
621 621
622### Inoltrare le notifiche a Slack622### Inoltrare le notifiche a Slack
623 623
624624Utilizzate gli hook `Notification` per ricevere notifiche di sistema dall'agente e inoltrarle a servizi esterni. Le notifiche si attivano per tipi di evento specifici: `permission_prompt` (Claude ha bisogno di autorizzazione), `idle_prompt` (Claude è in attesa di input), `auth_success` (autenticazione completata) e `elicitation_dialog` (Claude sta richiedendo all'utente). Ogni notifica include un campo `message` con una descrizione leggibile dall'uomo e facoltativamente un `title`.Utilizzate gli hook `Notification` per ricevere notifiche di sistema dall'agente e inoltrarle a servizi esterni. Le notifiche si attivano per tipi di evento specifici: `permission_prompt` (Claude ha bisogno di autorizzazione), `idle_prompt` (Claude è in attesa di input), `auth_success` (autenticazione completata), `elicitation_dialog` (Claude sta richiedendo all'utente), `elicitation_response` (l'utente ha risposto a un'elicitazione) e `elicitation_complete` (un'elicitazione è stata chiusa). Ogni notifica include un campo `message` con una descrizione leggibile dall'uomo e facoltativamente un `title`.
625 625
626Questo esempio inoltra ogni notifica a un canale Slack. Richiede un [URL webhook in arrivo di Slack](https://api.slack.com/messaging/webhooks), che create aggiungendo un'app al vostro spazio di lavoro Slack e abilitando i webhook in arrivo:626Questo esempio inoltra ogni notifica a un canale Slack. Richiede un [URL webhook in arrivo di Slack](https://api.slack.com/messaging/webhooks), che create aggiungendo un'app al vostro spazio di lavoro Slack e abilitando i webhook in arrivo:
627 627
727* Controllate che il vostro modello di matcher corrisponda esattamente al nome dello strumento727* Controllate che il vostro modello di matcher corrisponda esattamente al nome dello strumento
728* Assicuratevi che l'hook sia sotto il tipo di evento corretto in `options.hooks`728* Assicuratevi che l'hook sia sotto il tipo di evento corretto in `options.hooks`
729* Per gli hook non basati su strumenti come `Stop` e `SubagentStop`, i matcher corrispondono a campi diversi (consultate [modelli di matcher](/it/hooks#matcher-patterns))729* Per gli hook non basati su strumenti come `Stop` e `SubagentStop`, i matcher corrispondono a campi diversi (consultate [modelli di matcher](/it/hooks#matcher-patterns))
730730* Gli hooks potrebbero non attivarsi quando l'agente raggiunge il limite [`max_turns`](/it/agent-sdk/python#claude-agent-options) perché la sessione termina prima che gli hooks possano essere eseguiti* Gli hooks potrebbero non attivarsi quando l'agente raggiunge il limite [`max_turns`](/it/agent-sdk/python#claudeagentoptions) perché la sessione termina prima che gli hooks possano essere eseguiti
731 731
732### Matcher non filtra come previsto732### Matcher non filtra come previsto
733 733
769 };769 };
770 ```770 ```
771 771
772772* Dovete anche restituire `permissionDecision: 'allow'` affinché la modifica dell'input abbia effetto* Dovete anche restituire `permissionDecision: 'allow'` o `'ask'` affinché la modifica dell'input abbia effetto
773 773
774* Includete `hookEventName` in `hookSpecificOutput` per identificare quale tipo di hook è l'output774* Includete `hookEventName` in `hookSpecificOutput` per identificare quale tipo di hook è l'output
775 775
776### Hook di sessione non disponibili in Python776### Hook di sessione non disponibili in Python
777 777
778778`SessionStart` e `SessionEnd` possono essere registrati come hook di callback SDK in TypeScript, ma non sono disponibili nell'SDK Python (`HookEvent` li omette). In Python, sono disponibili solo come [hook dei comandi shell](/it/hooks#hook-events) definiti nei file di impostazioni (ad esempio, `.claude/settings.json`). Per caricare gli hook dei comandi shell dalla vostra applicazione SDK, includete la fonte di impostazione appropriata con [`setting_sources`](/it/agent-sdk/python#setting-source) o [`settingSources`](/it/agent-sdk/typescript#setting-source):`SessionStart` e `SessionEnd` possono essere registrati come hook di callback SDK in TypeScript, ma non sono disponibili nell'SDK Python (`HookEvent` li omette). In Python, sono disponibili solo come [hook dei comandi shell](/it/hooks#hook-events) definiti nei file di impostazioni (ad esempio, `.claude/settings.json`). Per caricare gli hook dei comandi shell dalla vostra applicazione SDK, includete la fonte di impostazione appropriata con [`setting_sources`](/it/agent-sdk/python#settingsource) o [`settingSources`](/it/agent-sdk/typescript#settingsource):
779 779
780<CodeGroup>780<CodeGroup>
781 ```python Python theme={null}781 ```python Python theme={null}