agent-sdk/agent-loop.md +395 −0 created
1> ## Documentation Index
2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
3> Use this file to discover all available pages before exploring further.
4
5# Come funziona il ciclo dell'agente
6
7> Comprendere il ciclo di vita dei messaggi, l'esecuzione degli strumenti, la finestra di contesto e l'architettura che alimentano gli agenti SDK.
8
9L'Agent SDK consente di incorporare il ciclo dell'agente autonomo di Claude Code nelle proprie applicazioni. L'SDK è un pacchetto autonomo che fornisce il controllo programmatico su strumenti, autorizzazioni, limiti di costo e output. Non è necessario avere Claude Code CLI installato per utilizzarlo.
10
11Quando avviate un agente, l'SDK esegue lo stesso [ciclo di esecuzione che alimenta Claude Code](/it/how-claude-code-works#the-agentic-loop): Claude valuta il vostro prompt, chiama gli strumenti per agire, riceve i risultati e ripete fino al completamento dell'attività. Questa pagina spiega cosa accade all'interno di quel ciclo in modo che possiate costruire, eseguire il debug e ottimizzare i vostri agenti in modo efficace.
12
13## Il ciclo a colpo d'occhio
14
15Ogni sessione dell'agente segue lo stesso ciclo:
16
17<img src="https://mintcdn.com/claude-code/gvy2DIUELtNA8qD3/images/agent-loop-diagram.svg?fit=max&auto=format&n=gvy2DIUELtNA8qD3&q=85&s=192e1bd6c8a2950a16e5ee0b94e27e26" alt="Agent loop: prompt enters, Claude evaluates, branches to tool calls or final answer" width="680" height="150" data-path="images/agent-loop-diagram.svg" />
18
191. **Ricevere il prompt.** Claude riceve il vostro prompt, insieme al prompt di sistema, alle definizioni degli strumenti e alla cronologia della conversazione. L'SDK produce un [`SystemMessage`](#message-types) con sottotipo `"init"` contenente i metadati della sessione.
202. **Valutare e rispondere.** Claude valuta lo stato attuale e determina come procedere. Può rispondere con testo, richiedere una o più chiamate di strumenti, o entrambi. L'SDK produce un [`AssistantMessage`](#message-types) contenente il testo e le richieste di chiamate di strumenti.
213. **Eseguire gli strumenti.** L'SDK esegue ogni strumento richiesto e raccoglie i risultati. Ogni set di risultati degli strumenti viene restituito a Claude per la decisione successiva. Potete utilizzare [hooks](/it/agent-sdk/hooks) per intercettare, modificare o bloccare le chiamate di strumenti prima che vengano eseguite.
224. **Ripetere.** I passaggi 2 e 3 si ripetono come un ciclo. Ogni ciclo completo è un turno. Claude continua a chiamare gli strumenti ed elaborare i risultati fino a quando non produce una risposta senza chiamate di strumenti.
235. **Restituire il risultato.** L'SDK produce un [`AssistantMessage`](#message-types) finale con la risposta di testo (senza chiamate di strumenti), seguito da un [`ResultMessage`](#message-types) con il testo finale, l'utilizzo dei token, il costo e l'ID della sessione.
24
25Una domanda rapida ("quali file ci sono qui?") potrebbe richiedere uno o due turni di chiamata di `Glob` e risposta con i risultati. Un'attività complessa ("refactorizza il modulo di autenticazione e aggiorna i test") può concatenare dozzine di chiamate di strumenti su molti turni, leggendo file, modificando codice ed eseguendo test, con Claude che adatta il suo approccio in base a ogni risultato.
26
27## Turni e messaggi
28
29Un turno è un viaggio di andata e ritorno all'interno del ciclo: Claude produce output che include chiamate di strumenti, l'SDK esegue quegli strumenti e i risultati vengono restituiti a Claude automaticamente. Questo accade senza cedere il controllo al vostro codice. I turni continuano fino a quando Claude non produce output senza chiamate di strumenti, a quel punto il ciclo termina e il risultato finale viene consegnato.
30
31Considerate come potrebbe apparire una sessione completa per il prompt "Correggi i test falliti in auth.ts".
32
33Per prima cosa, l'SDK invia il vostro prompt a Claude e produce un [`SystemMessage`](#message-types) con i metadati della sessione. Poi il ciclo inizia:
34
351. **Turno 1:** Claude chiama `Bash` per eseguire `npm test`. L'SDK produce un [`AssistantMessage`](#message-types) con la chiamata dello strumento, esegue il comando, poi produce un [`UserMessage`](#message-types) con l'output (tre errori).
362. **Turno 2:** Claude chiama `Read` su `auth.ts` e `auth.test.ts`. L'SDK restituisce il contenuto dei file e produce un `AssistantMessage`.
373. **Turno 3:** Claude chiama `Edit` per correggere `auth.ts`, poi chiama `Bash` per rieseguire `npm test`. Tutti e tre i test passano. L'SDK produce un `AssistantMessage`.
384. **Turno finale:** Claude produce una risposta solo di testo senza chiamate di strumenti: "Corretto il bug di autenticazione, tutti e tre i test passano ora." L'SDK produce un `AssistantMessage` finale con questo testo, poi un [`ResultMessage`](#message-types) con lo stesso testo più costo e utilizzo.
39
40Erano quattro turni: tre con chiamate di strumenti, uno con risposta solo di testo finale.
41
42Potete limitare il ciclo con `max_turns` / `maxTurns`, che conta solo i turni di utilizzo degli strumenti. Ad esempio, `max_turns=2` nel ciclo precedente si sarebbe fermato prima del passaggio di modifica. Potete anche utilizzare `max_budget_usd` / `maxBudgetUsd` per limitare i turni in base a una soglia di spesa.
43
44Senza limiti, il ciclo viene eseguito fino a quando Claude non termina da solo, il che va bene per attività ben definite ma può durare a lungo su prompt aperti ("migliora questo codebase"). Impostare un budget è una buona impostazione predefinita per gli agenti di produzione. Vedere [Turni e budget](#turns-and-budget) di seguito per il riferimento alle opzioni.
45
46## Tipi di messaggi
47
48Mentre il ciclo viene eseguito, l'SDK produce un flusso di messaggi. Ogni messaggio ha un tipo che vi dice da quale fase del ciclo proviene. I cinque tipi principali sono:
49
50* **`SystemMessage`:** eventi del ciclo di vita della sessione. Il campo `subtype` li distingue: `"init"` è il primo messaggio (metadati della sessione), e `"compact_boundary"` si attiva dopo la [compattazione](#automatic-compaction). In TypeScript, il confine di compattazione è il suo proprio tipo [`SDKCompactBoundaryMessage`](/it/agent-sdk/typescript#sdkcompactboundarymessage) piuttosto che un sottotipo di `SDKSystemMessage`.
51* **`AssistantMessage`:** emesso dopo ogni risposta di Claude, inclusa quella finale solo di testo. Contiene blocchi di contenuto di testo e blocchi di chiamate di strumenti da quel turno.
52* **`UserMessage`:** emesso dopo ogni esecuzione di strumento con il risultato dello strumento inviato di nuovo a Claude. Emesso anche per qualsiasi input dell'utente che trasmettete a metà ciclo.
53* **`StreamEvent`:** emesso solo quando i messaggi parziali sono abilitati. Contiene eventi di streaming API grezzi (delta di testo, chunk di input dello strumento). Vedere [Stream responses](/it/agent-sdk/streaming-output).
54* **`ResultMessage`:** segna la fine del ciclo dell'agente. Contiene il risultato di testo finale, l'utilizzo dei token, il costo e l'ID della sessione. Controllate il campo `subtype` per determinare se l'attività ha avuto successo o ha raggiunto un limite. Un piccolo numero di eventi di sistema finali, come `prompt_suggestion`, può arrivare dopo di esso, quindi iterate il flusso fino al completamento piuttosto che interrompere al risultato. Vedere [Gestire il risultato](#handle-the-result).
55
56Questi cinque tipi coprono l'intero ciclo di vita del ciclo dell'agente in entrambi gli SDK. L'SDK TypeScript produce anche eventi di osservabilità aggiuntivi (eventi di hook, progresso dello strumento, limiti di velocità, notifiche di attività) che forniscono dettagli extra ma non sono necessari per guidare il ciclo. Vedere il [riferimento ai tipi di messaggi Python](/it/agent-sdk/python#message-types) e il [riferimento ai tipi di messaggi TypeScript](/it/agent-sdk/typescript#message-types) per gli elenchi completi.
57
58### Gestire i messaggi
59
60Quali messaggi gestite dipende da ciò che state costruendo:
61
62* **Solo risultati finali:** gestite `ResultMessage` per ottenere l'output, il costo e se l'attività ha avuto successo o ha raggiunto un limite.
63* **Aggiornamenti di progresso:** gestite `AssistantMessage` per vedere cosa sta facendo Claude ad ogni turno, inclusi gli strumenti che ha chiamato.
64* **Streaming in tempo reale:** abilitate i messaggi parziali (`include_partial_messages` in Python, `includePartialMessages` in TypeScript) per ottenere messaggi `StreamEvent` in tempo reale. Vedere [Stream responses in real-time](/it/agent-sdk/streaming-output).
65
66Come controllate i tipi di messaggi dipende dall'SDK:
67
68* **Python:** controllate i tipi di messaggi con `isinstance()` rispetto alle classi importate da `claude_agent_sdk` (ad esempio, `isinstance(message, ResultMessage)`).
69* **TypeScript:** controllate il campo stringa `type` (ad esempio, `message.type === "result"`). `AssistantMessage` e `UserMessage` avvolgono il messaggio API grezzo in un campo `.message`, quindi i blocchi di contenuto si trovano in `message.message.content`, non in `message.content`.
70
71<Accordion title="Esempio: Controllare i tipi di messaggi e gestire i risultati">
72 <CodeGroup>
73 ```python Python theme={null}
74 from claude_agent_sdk import query, AssistantMessage, ResultMessage
75
76 async for message in query(prompt="Summarize this project"):
77 if isinstance(message, AssistantMessage):
78 print(f"Turn completed: {len(message.content)} content blocks")
79 if isinstance(message, ResultMessage):
80 if message.subtype == "success":
81 print(message.result)
82 else:
83 print(f"Stopped: {message.subtype}")
84 ```
85
86 ```typescript TypeScript theme={null}
87 import { query } from "@anthropic-ai/claude-agent-sdk";
88
89 for await (const message of query({ prompt: "Summarize this project" })) {
90 if (message.type === "assistant") {
91 console.log(`Turn completed: ${message.message.content.length} content blocks`);
92 }
93 if (message.type === "result") {
94 if (message.subtype === "success") {
95 console.log(message.result);
96 } else {
97 console.log(`Stopped: ${message.subtype}`);
98 }
99 }
100 }
101 ```
102 </CodeGroup>
103</Accordion>
104
105## Esecuzione degli strumenti
106
107Gli strumenti danno al vostro agente la capacità di agire. Senza strumenti, Claude può solo rispondere con testo. Con gli strumenti, Claude può leggere file, eseguire comandi, cercare codice e interagire con servizi esterni.
108
109### Strumenti integrati
110
111L'SDK include gli stessi strumenti che alimentano Claude Code:
112
113| Categoria | Strumenti | Cosa fanno |
114| :--------------------- | :----------------------------------------------- | :--------------------------------------------------------------------------------------- |
115| **Operazioni su file** | `Read`, `Edit`, `Write` | Leggere, modificare e creare file |
116| **Ricerca** | `Glob`, `Grep` | Trovare file per pattern, cercare contenuto con regex |
117| **Esecuzione** | `Bash` | Eseguire comandi shell, script, operazioni git |
118| **Web** | `WebSearch`, `WebFetch` | Cercare il web, recuperare e analizzare pagine |
119| **Scoperta** | `ToolSearch` | Trovare e caricare dinamicamente gli strumenti su richiesta invece di precaricarli tutti |
120| **Orchestrazione** | `Agent`, `Skill`, `AskUserQuestion`, `TodoWrite` | Generare subagenti, invocare skills, chiedere all'utente, tracciare attività |
121
122Oltre agli strumenti integrati, potete:
123
124* **Connettere servizi esterni** con [server MCP](/it/agent-sdk/mcp) (database, browser, API)
125* **Definire strumenti personalizzati** con [gestori di strumenti personalizzati](/it/agent-sdk/custom-tools)
126* **Caricare skills del progetto** tramite [setting sources](/it/agent-sdk/claude-code-features) per flussi di lavoro riutilizzabili
127
128### Autorizzazioni degli strumenti
129
130Claude determina quali strumenti chiamare in base all'attività, ma voi controllate se quelle chiamate sono autorizzate a essere eseguite. Potete approvare automaticamente strumenti specifici, bloccare altri completamente, o richiedere l'approvazione per tutto. Tre opzioni lavorano insieme per determinare cosa viene eseguito:
131
132* **`allowed_tools` / `allowedTools`** approva automaticamente gli strumenti elencati. Un agente di sola lettura con `["Read", "Glob", "Grep"]` nel suo elenco di strumenti consentiti esegue quegli strumenti senza chiedere. Gli strumenti non elencati sono ancora disponibili ma richiedono autorizzazione.
133* **`disallowed_tools` / `disallowedTools`** blocca gli strumenti elencati, indipendentemente da altre impostazioni. Vedere [Autorizzazioni](/it/agent-sdk/permissions) per l'ordine in cui le regole vengono controllate prima che uno strumento venga eseguito.
134* **`permission_mode` / `permissionMode`** controlla cosa accade agli strumenti che non sono coperti da regole di consentimento o negazione. Vedere [Modalità di autorizzazione](#permission-mode) per le modalità disponibili.
135
136Potete anche limitare gli strumenti individuali con regole come `"Bash(npm *)"` per consentire solo comandi specifici. Vedere [Autorizzazioni](/it/agent-sdk/permissions) per la sintassi completa delle regole.
137
138Quando uno strumento viene negato, Claude riceve un messaggio di rifiuto come risultato dello strumento e in genere tenta un approccio diverso o segnala che non potrebbe procedere.
139
140### Esecuzione parallela degli strumenti
141
142Quando Claude richiede più chiamate di strumenti in un singolo turno, entrambi gli SDK possono eseguirli contemporaneamente o sequenzialmente a seconda dello strumento. Gli strumenti di sola lettura (come `Read`, `Glob`, `Grep` e strumenti MCP contrassegnati come di sola lettura) possono essere eseguiti contemporaneamente. Gli strumenti che modificano lo stato (come `Edit`, `Write` e `Bash`) vengono eseguiti sequenzialmente per evitare conflitti.
143
144Gli strumenti personalizzati predefiniti per l'esecuzione sequenziale. Per abilitare l'esecuzione parallela per uno strumento personalizzato, impostare `readOnlyHint` nelle sue annotazioni. Sia l'SDK [TypeScript](/it/agent-sdk/typescript#tool) che [Python](/it/agent-sdk/python#tool) utilizzano questo nome di campo dall'SDK MCP.
145
146## Controllare come viene eseguito il ciclo
147
148Potete limitare quanti turni il ciclo prende, quanto costa, quanto profondamente Claude ragiona e se gli strumenti richiedono approvazione prima di essere eseguiti. Tutti questi sono campi su [`ClaudeAgentOptions`](/it/agent-sdk/python#claudeagentoptions) (Python) / [`Options`](/it/agent-sdk/typescript#options) (TypeScript).
149
150### Turni e budget
151
152| Opzione | Cosa controlla | Predefinito |
153| :--------------------------------------------- | :--------------------------------------------- | :------------ |
154| Max turni (`max_turns` / `maxTurns`) | Massimi round trip di utilizzo degli strumenti | Nessun limite |
155| Max budget (`max_budget_usd` / `maxBudgetUsd`) | Costo massimo prima di fermarsi | Nessun limite |
156
157Quando uno dei due limiti viene raggiunto, l'SDK restituisce un `ResultMessage` con un sottotipo di errore corrispondente (`error_max_turns` o `error_max_budget_usd`). Vedere [Gestire il risultato](#handle-the-result) per come controllare questi sottotipi e [`ClaudeAgentOptions`](/it/agent-sdk/python#claudeagentoptions) / [`Options`](/it/agent-sdk/typescript#options) per la sintassi.
158
159### Livello di sforzo
160
161L'opzione `effort` controlla quanto ragionamento Claude applica. I livelli di sforzo inferiori utilizzano meno token per turno e riducono il costo. Non tutti i modelli supportano il parametro di sforzo. Vedere [Effort](https://platform.claude.com/docs/en/build-with-claude/effort) per quali modelli lo supportano.
162
163| Livello | Comportamento | Buono per |
164| :--------- | :----------------------------------- | :------------------------------------------------------ |
165| `"low"` | Ragionamento minimo, risposte veloci | Ricerche di file, elenco di directory |
166| `"medium"` | Ragionamento equilibrato | Modifiche di routine, attività standard |
167| `"high"` | Analisi approfondita | Refactoring, debug |
168| `"xhigh"` | Profondità di ragionamento estesa | Attività di codifica e agentic; consigliato su Opus 4.7 |
169| `"max"` | Profondità di ragionamento massima | Problemi multi-step che richiedono analisi profonda |
170
171Se non impostate `effort`, l'SDK Python lascia il parametro non impostato e rimanda al comportamento predefinito del modello. L'SDK TypeScript predefinisce a `"high"`.
172
173<Note>
174 `effort` scambia latenza e costo dei token per profondità di ragionamento all'interno di ogni risposta. [Extended thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) è una funzione separata che produce blocchi di catena di pensiero visibili nell'output. Sono indipendenti: potete impostare `effort: "low"` con extended thinking abilitato, o `effort: "max"` senza di esso.
175</Note>
176
177Utilizzate uno sforzo inferiore per gli agenti che eseguono attività semplici e ben definite (come elencare file o eseguire un singolo grep) per ridurre il costo e la latenza. Impostare `effort` nelle opzioni di livello superiore `query()` per l'intera sessione, o per subagente con il campo `effort` su [`AgentDefinition`](/it/agent-sdk/subagents#agentdefinition-configuration) per sovrascrivere il livello di sessione.
178
179### Modalità di autorizzazione
180
181L'opzione della modalità di autorizzazione (`permission_mode` in Python, `permissionMode` in TypeScript) controlla se l'agente chiede l'approvazione prima di utilizzare gli strumenti:
182
183| Modalità | Comportamento |
184| :------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
185| `"default"` | Gli strumenti non coperti da regole di consentimento attivano il vostro callback di approvazione; nessun callback significa negare |
186| `"acceptEdits"` | Approva automaticamente le modifiche ai file e i comandi comuni del filesystem (`mkdir`, `touch`, `mv`, `cp`, ecc.); altri comandi Bash seguono le regole predefinite |
187| `"plan"` | Gli strumenti di sola lettura vengono eseguiti; Claude esplora e produce un piano senza modificare i vostri file sorgente |
188| `"dontAsk"` | Non chiede mai. Gli strumenti pre-approvati da [regole di autorizzazione](/it/settings#permission-settings) vengono eseguiti, tutto il resto viene negato |
189| `"auto"` (solo TypeScript) | Utilizza un classificatore di modello per approvare o negare ogni chiamata di strumento. Vedere [Modalità Auto](/it/permission-modes#eliminate-prompts-with-auto-mode) per disponibilità e comportamento |
190| `"bypassPermissions"` | Esegue tutti gli strumenti consentiti senza chiedere. Non può essere utilizzato quando si esegue come root su Unix. Utilizzare solo in ambienti isolati dove le azioni dell'agente non possono influenzare i sistemi che vi interessano |
191
192Per le applicazioni interattive, utilizzate `"default"` con un callback di approvazione dello strumento per visualizzare i prompt di approvazione. Per gli agenti autonomi su una macchina di sviluppo, `"acceptEdits"` approva automaticamente le modifiche ai file e i comandi comuni del filesystem (`mkdir`, `touch`, `mv`, `cp`, ecc.) mentre ancora limita altri comandi `Bash` dietro le regole di consentimento. Riservate `"bypassPermissions"` per CI, container o altri ambienti isolati. Vedere [Autorizzazioni](/it/agent-sdk/permissions) per i dettagli completi.
193
194### Modello
195
196Se non impostate `model`, l'SDK utilizza il predefinito di Claude Code, che dipende dal vostro metodo di autenticazione e dall'abbonamento. Impostatelo esplicitamente (ad esempio, `model="claude-sonnet-4-6"`) per fissare un modello specifico o per utilizzare un modello più piccolo per agenti più veloci e economici. Vedere [models](https://platform.claude.com/docs/en/about-claude/models) per gli ID disponibili.
197
198## La finestra di contesto
199
200La finestra di contesto è la quantità totale di informazioni disponibili a Claude durante una sessione. Non si ripristina tra i turni all'interno di una sessione. Tutto si accumula: il prompt di sistema, le definizioni degli strumenti, la cronologia della conversazione, gli input degli strumenti e gli output degli strumenti. Il contenuto che rimane lo stesso tra i turni (prompt di sistema, definizioni degli strumenti, CLAUDE.md) viene automaticamente [prompt cached](https://platform.claude.com/docs/en/build-with-claude/prompt-caching), il che riduce il costo e la latenza per i prefissi ripetuti.
201
202### Cosa consuma il contesto
203
204Ecco come ogni componente influisce sul contesto nell'SDK:
205
206| Fonte | Quando viene caricato | Impatto |
207| :--------------------------------- | :------------------------------------------------------------------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
208| **Prompt di sistema** | Ogni richiesta | Costo fisso piccolo, sempre presente |
209| **File CLAUDE.md** | Inizio della sessione, tramite [`settingSources`](/it/agent-sdk/claude-code-features) | Contenuto completo in ogni richiesta (ma prompt-cached, quindi solo la prima richiesta paga il costo completo) |
210| **Definizioni degli strumenti** | Ogni richiesta | Ogni strumento aggiunge il suo schema; utilizzare [ricerca di strumenti MCP](/it/agent-sdk/mcp#mcp-tool-search) per caricare gli strumenti su richiesta invece di tutti in una volta |
211| **Cronologia della conversazione** | Si accumula nel corso dei turni | Cresce con ogni turno: prompt, risposte, input degli strumenti, output degli strumenti |
212| **Descrizioni delle skills** | Inizio della sessione, tramite setting sources | Brevi riassunti; il contenuto completo viene caricato solo quando invocato |
213
214I grandi output degli strumenti consumano un contesto significativo. Leggere un file grande o eseguire un comando con output dettagliato può utilizzare migliaia di token in un singolo turno. Il contesto si accumula nel corso dei turni, quindi le sessioni più lunghe con molte chiamate di strumenti accumulano significativamente più contesto rispetto a quelle brevi.
215
216### Compattazione automatica
217
218Quando la finestra di contesto si avvicina al suo limite, l'SDK compatta automaticamente la conversazione: riassume la cronologia più vecchia per liberare spazio, mantenendo intatti gli scambi più recenti e le decisioni chiave. L'SDK emette un messaggio con `type: "system"` e `subtype: "compact_boundary"` nel flusso quando questo accade (in Python questo è un `SystemMessage`; in TypeScript è un tipo separato `SDKCompactBoundaryMessage`).
219
220La compattazione sostituisce i messaggi più vecchi con un riassunto, quindi le istruzioni specifiche dall'inizio della conversazione potrebbero non essere preservate. Le regole persistenti appartengono a CLAUDE.md (caricato tramite [`settingSources`](/it/agent-sdk/claude-code-features)) piuttosto che al prompt iniziale, perché il contenuto di CLAUDE.md viene reiniettato ad ogni richiesta.
221
222Potete personalizzare il comportamento della compattazione in diversi modi:
223
224* **Istruzioni di riassunto in CLAUDE.md:** Il compattatore legge il vostro CLAUDE.md come qualsiasi altro contesto, quindi potete includere una sezione che gli dice cosa preservare quando riassume. L'intestazione della sezione è libera (non una stringa magica); il compattatore corrisponde all'intento.
225* **Hook `PreCompact`:** Eseguire logica personalizzata prima che si verifichi la compattazione, ad esempio per archiviare la trascrizione completa. L'hook riceve un campo `trigger` (`manual` o `auto`). Vedere [hooks](/it/agent-sdk/hooks).
226* **Compattazione manuale:** Inviare `/compact` come stringa di prompt per attivare la compattazione su richiesta. (I comandi slash inviati in questo modo sono input SDK, non scorciatoie solo CLI. Vedere [slash commands nell'SDK](/it/agent-sdk/slash-commands).)
227
228<Accordion title="Esempio: Istruzioni di riassunto in CLAUDE.md">
229 Aggiungete una sezione al vostro CLAUDE.md del progetto dicendo al compattatore cosa preservare. Il nome dell'intestazione non è speciale; utilizzate qualsiasi etichetta chiara.
230
231 ```markdown CLAUDE.md theme={null}
232 # Summary instructions
233
234 When summarizing this conversation, always preserve:
235 - The current task objective and acceptance criteria
236 - File paths that have been read or modified
237 - Test results and error messages
238 - Decisions made and the reasoning behind them
239 ```
240</Accordion>
241
242### Mantenere il contesto efficiente
243
244Alcune strategie per gli agenti a lunga durata:
245
246* **Utilizzare subagenti per sottoattività.** Ogni subagente inizia con una conversazione fresca (nessuna cronologia di messaggi precedenti, anche se carica il suo prompt di sistema e il contesto a livello di progetto come CLAUDE.md). Non vede i turni del genitore e solo la sua risposta finale ritorna al genitore come risultato dello strumento. Il contesto dell'agente principale cresce per quel riassunto, non per la trascrizione completa della sottoattività. Vedere [Cosa ereditano i subagenti](/it/agent-sdk/subagents#what-subagents-inherit) per i dettagli.
247* **Essere selettivi con gli strumenti.** Ogni definizione di strumento occupa spazio di contesto. Utilizzate il campo `tools` su [`AgentDefinition`](/it/agent-sdk/subagents#agentdefinition-configuration) per limitare i subagenti al set minimo di cui hanno bisogno, e utilizzate [ricerca di strumenti MCP](/it/agent-sdk/mcp#mcp-tool-search) per caricare gli strumenti su richiesta invece di precaricarli tutti.
248* **Controllare i costi dei server MCP.** Ogni server MCP aggiunge tutti i suoi schemi di strumenti a ogni richiesta. Pochi server con molti strumenti possono consumare un contesto significativo prima che l'agente faccia qualsiasi lavoro. Lo strumento `ToolSearch` può aiutare caricando gli strumenti su richiesta invece di precaricarli tutti. Vedere [ricerca di strumenti MCP](/it/agent-sdk/mcp#mcp-tool-search) per la configurazione.
249* **Utilizzare uno sforzo inferiore per attività di routine.** Impostare [effort](#effort-level) a `"low"` per gli agenti che hanno solo bisogno di leggere file o elencare directory. Questo riduce l'utilizzo dei token e il costo.
250
251Per una ripartizione dettagliata dei costi di contesto per funzione, vedere [Comprendere i costi di contesto](/it/features-overview#understand-context-costs).
252
253## Sessioni e continuità
254
255Ogni interazione con l'SDK crea o continua una sessione. Catturate l'ID della sessione da `ResultMessage.session_id` (disponibile in entrambi gli SDK) per riprendere in seguito. L'SDK TypeScript lo espone anche come campo diretto sul `SystemMessage` init; in Python è annidato in `SystemMessage.data`.
256
257Quando riprendete, il contesto completo dai turni precedenti viene ripristinato: file che sono stati letti, analisi che è stata eseguita e azioni che sono state intraprese. Potete anche fare un fork di una sessione per diramarvisi in un approccio diverso senza modificare l'originale.
258
259Vedere [Gestione della sessione](/it/agent-sdk/sessions) per la guida completa sui pattern di ripresa, continuazione e fork.
260
261<Note>
262 In Python, `ClaudeSDKClient` gestisce gli ID di sessione automaticamente tra più chiamate. Vedere il [riferimento SDK Python](/it/agent-sdk/python#choosing-between-query-and-claudesdkclient) per i dettagli.
263</Note>
264
265## Gestire il risultato
266
267Quando il ciclo termina, il `ResultMessage` vi dice cosa è successo e vi fornisce l'output. Il campo `subtype` (disponibile in entrambi gli SDK) è il modo principale per controllare lo stato di terminazione.
268
269| Sottotipo del risultato | Cosa è successo | Campo `result` disponibile? |
270| :------------------------------------ | :-------------------------------------------------------------------------------------- | :-------------------------: |
271| `success` | Claude ha completato l'attività normalmente | Sì |
272| `error_max_turns` | Ha raggiunto il limite di `maxTurns` prima di terminare | No |
273| `error_max_budget_usd` | Ha raggiunto il limite di `maxBudgetUsd` prima di terminare | No |
274| `error_during_execution` | Un errore ha interrotto il ciclo (ad esempio, un errore API o una richiesta annullata) | No |
275| `error_max_structured_output_retries` | La convalida dell'output strutturato ha fallito dopo il limite di tentativi configurato | No |
276
277Il campo `result` (l'output di testo finale) è presente solo sulla variante `success`, quindi controllate sempre il sottotipo prima di leggerlo. Tutti i sottotipi di risultato portano `total_cost_usd`, `usage`, `num_turns` e `session_id` in modo che possiate tracciare il costo e riprendere anche dopo gli errori. In Python, `total_cost_usd` e `usage` sono tipizzati come opzionali e possono essere `None` su alcuni percorsi di errore, quindi proteggete prima di formattarli. Vedere [Tracciamento di costi e utilizzo](/it/agent-sdk/cost-tracking) per i dettagli sull'interpretazione dei campi `usage`.
278
279Il risultato include anche un campo `stop_reason` (`string | null` in TypeScript, `str | None` in Python) che indica perché il modello ha smesso di generare al suo turno finale. I valori comuni sono `end_turn` (il modello ha terminato normalmente), `max_tokens` (ha raggiunto il limite di token di output) e `refusal` (il modello ha rifiutato la richiesta). Su sottotipi di risultato di errore, `stop_reason` porta il valore dall'ultima risposta dell'assistente prima che il ciclo terminasse. Per rilevare i rifiuti, controllate `stop_reason === "refusal"` (TypeScript) o `stop_reason == "refusal"` (Python). Vedere [`SDKResultMessage`](/it/agent-sdk/typescript#sdkresultmessage) (TypeScript) o [`ResultMessage`](/it/agent-sdk/python#resultmessage) (Python) per il tipo completo.
280
281## Hooks
282
283[Hooks](/it/agent-sdk/hooks) sono callback che si attivano in punti specifici del ciclo: prima che uno strumento venga eseguito, dopo che ritorna, quando l'agente termina e così via. Alcuni hook comunemente utilizzati sono:
284
285| Hook | Quando si attiva | Usi comuni |
286| :------------------------------- | :---------------------------------------------- | :--------------------------------------------------------- |
287| `PreToolUse` | Prima che uno strumento venga eseguito | Convalidare gli input, bloccare i comandi pericolosi |
288| `PostToolUse` | Dopo che uno strumento ritorna | Controllare gli output, attivare effetti collaterali |
289| `UserPromptSubmit` | Quando un prompt viene inviato | Iniettare contesto aggiuntivo nei prompt |
290| `Stop` | Quando l'agente termina | Convalidare il risultato, salvare lo stato della sessione |
291| `SubagentStart` / `SubagentStop` | Quando un subagente viene generato o completato | Tracciare e aggregare i risultati delle attività parallele |
292| `PreCompact` | Prima della compattazione del contesto | Archiviare la trascrizione completa prima di riassumere |
293
294Gli hook vengono eseguiti nel vostro processo di applicazione, non all'interno della finestra di contesto dell'agente, quindi non consumano contesto. Gli hook possono anche cortocircuitare il ciclo: un hook `PreToolUse` che rifiuta una chiamata di strumento impedisce che venga eseguita e Claude riceve il messaggio di rifiuto invece.
295
296Entrambi gli SDK supportano tutti gli eventi precedenti. L'SDK TypeScript include eventi aggiuntivi che Python non supporta ancora. Vedere [Controllare l'esecuzione con gli hooks](/it/agent-sdk/hooks) per l'elenco completo degli eventi, la disponibilità per SDK e l'API di callback completa.
297
298## Mettere tutto insieme
299
300Questo esempio combina i concetti chiave di questa pagina in un singolo agente che corregge i test falliti. Configura l'agente con strumenti consentiti (pre-approvati in modo che l'agente funzioni autonomamente), impostazioni del progetto e limiti di sicurezza su turni e sforzo di ragionamento. Mentre il ciclo viene eseguito, cattura l'ID della sessione per una potenziale ripresa, gestisce il risultato finale e stampa il costo totale.
301
302<CodeGroup>
303 ```python Python theme={null}
304 import asyncio
305 from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
306
307
308 async def run_agent():
309 session_id = None
310
311 async for message in query(
312 prompt="Find and fix the bug causing test failures in the auth module",
313 options=ClaudeAgentOptions(
314 allowed_tools=[
315 "Read",
316 "Edit",
317 "Bash",
318 "Glob",
319 "Grep",
320 ], # Listing tools here auto-approves them (no prompting)
321 setting_sources=[
322 "project"
323 ], # Load CLAUDE.md, skills, hooks from current directory
324 max_turns=30, # Prevent runaway sessions
325 effort="high", # Thorough reasoning for complex debugging
326 ),
327 ):
328 # Handle the final result
329 if isinstance(message, ResultMessage):
330 session_id = message.session_id # Save for potential resumption
331
332 if message.subtype == "success":
333 print(f"Done: {message.result}")
334 elif message.subtype == "error_max_turns":
335 # Agent ran out of turns. Resume with a higher limit.
336 print(f"Hit turn limit. Resume session {session_id} to continue.")
337 elif message.subtype == "error_max_budget_usd":
338 print("Hit budget limit.")
339 else:
340 print(f"Stopped: {message.subtype}")
341 if message.total_cost_usd is not None:
342 print(f"Cost: ${message.total_cost_usd:.4f}")
343
344
345 asyncio.run(run_agent())
346 ```
347
348 ```typescript TypeScript theme={null}
349 import { query } from "@anthropic-ai/claude-agent-sdk";
350
351 let sessionId: string | undefined;
352
353 for await (const message of query({
354 prompt: "Find and fix the bug causing test failures in the auth module",
355 options: {
356 allowedTools: ["Read", "Edit", "Bash", "Glob", "Grep"], // Listing tools here auto-approves them (no prompting)
357 settingSources: ["project"], // Load CLAUDE.md, skills, hooks from current directory
358 maxTurns: 30, // Prevent runaway sessions
359 effort: "high" // Thorough reasoning for complex debugging
360 }
361 })) {
362 // Save the session ID to resume later if needed
363 if (message.type === "system" && message.subtype === "init") {
364 sessionId = message.session_id;
365 }
366
367 // Handle the final result
368 if (message.type === "result") {
369 if (message.subtype === "success") {
370 console.log(`Done: ${message.result}`);
371 } else if (message.subtype === "error_max_turns") {
372 // Agent ran out of turns. Resume with a higher limit.
373 console.log(`Hit turn limit. Resume session ${sessionId} to continue.`);
374 } else if (message.subtype === "error_max_budget_usd") {
375 console.log("Hit budget limit.");
376 } else {
377 console.log(`Stopped: ${message.subtype}`);
378 }
379 console.log(`Cost: $${message.total_cost_usd.toFixed(4)}`);
380 }
381 }
382 ```
383</CodeGroup>
384
385## Passaggi successivi
386
387Ora che comprendete il ciclo, ecco dove andare a seconda di ciò che state costruendo:
388
389* **Non avete ancora eseguito un agente?** Iniziate con la [quickstart](/it/agent-sdk/quickstart) per ottenere l'SDK installato e vedere un esempio completo in esecuzione da capo a fondo.
390* **Pronti a collegarvi al vostro progetto?** [Caricate CLAUDE.md, skills e filesystem hooks](/it/agent-sdk/claude-code-features) in modo che l'agente segua automaticamente le convenzioni del vostro progetto.
391* **State costruendo un'interfaccia utente interattiva?** Abilitate lo [streaming](/it/agent-sdk/streaming-output) per mostrare testo e chiamate di strumenti in tempo reale mentre il ciclo viene eseguito.
392* **Avete bisogno di un controllo più stretto su ciò che l'agente può fare?** Bloccate l'accesso agli strumenti con [autorizzazioni](/it/agent-sdk/permissions) e utilizzate [hooks](/it/agent-sdk/hooks) per controllare, bloccare o trasformare le chiamate di strumenti prima che vengano eseguite.
393* **State eseguendo attività lunghe o costose?** Delegate il lavoro isolato ai [subagenti](/it/agent-sdk/subagents) per mantenere il vostro contesto principale snello.
394
395Per il quadro concettuale più ampio del ciclo agentic (non specifico dell'SDK), vedere [Come funziona Claude Code](/it/how-claude-code-works).