Skip to main content
I subagenti sono istanze di agenti separate che il tuo agente principale può generare per gestire sottoattività mirate. Usali per isolare il contesto, eseguire più analisi in parallelo e applicare istruzioni specializzate senza aggiungere al prompt dell’agente principale.

Panoramica

È possibile creare subagent in tre modi:
  • A livello programmatico: utilizzare il parametro agents nelle opzioni di query(). Consultare i riferimenti TypeScript e Python
  • Basato sul file system: definire gli agenti come file markdown nelle directory .claude/agents/. Consultare definizione di subagent come file
  • Generale integrato: Claude può invocare il subagent general-purpose integrato in qualsiasi momento tramite lo strumento Agent senza che sia necessario definire nulla
Questa guida si concentra sull’approccio programmatico, consigliato per le applicazioni SDK.

Vantaggi dell’utilizzo di subagent

Poiché i subagent sono istanze di agente separate, delegare il lavoro a loro offre quattro vantaggi:
  • Isolamento del contesto: ogni subagent viene eseguito nella propria conversazione, che inizia da zero a meno che il subagent non sia un fork. In ogni caso, le chiamate agli strumenti intermedi e i risultati rimangono all’interno del subagent; solo il suo messaggio finale ritorna al genitore. Un subagent research-assistant può esplorare dozzine di file senza che nessuno di questi contenuti si accumuli nella conversazione principale. Il genitore riceve un riassunto conciso, non ogni file che il subagent ha letto. Vedere What subagents inherit per sapere esattamente cosa c’è nel contesto del subagent.
  • Parallelizzazione: più subagent possono essere eseguiti contemporaneamente, quindi i sottocompiti indipendenti si completano nel tempo di quello più lento piuttosto che nella somma di tutti loro. Durante una revisione del codice, è possibile eseguire i subagent style-checker, security-scanner e test-coverage simultaneamente invece che sequenzialmente.
  • Istruzioni e conoscenze specializzate: ogni subagent può avere un prompt di sistema personalizzato con competenze specifiche, best practice e vincoli. Un subagent database-migration può avere conoscenze dettagliate sulle best practice SQL, strategie di rollback e controlli di integrità dei dati che sarebbero rumore inutile nelle istruzioni dell’agente principale.
  • Restrizioni degli strumenti: i subagent possono essere limitati a strumenti specifici, riducendo il rischio di azioni indesiderate. Un subagent doc-reviewer potrebbe avere accesso solo ai tool Read e Grep, assicurando che possa analizzare ma non modifichi mai accidentalmente i file di documentazione.

Creare subagent

Definisci i subagent direttamente nel tuo codice utilizzando il parametro agents. Claude invoca i subagent attraverso lo strumento Agent. La maggior parte degli esempi in questa pagina stampa solo il risultato finale. Per confermare che Claude ha delegato a un subagent piuttosto che rispondere direttamente, vedi Rilevare l’invocazione di subagent. Questo esempio crea due subagent: un revisore di codice con accesso in sola lettura e un esecutore di test che può eseguire comandi.

Configurazione di AgentDefinition

In Python SDK, i nomi di campo con più parole come disallowedTools e mcpServers mantengono la loro ortografia camelCase per corrispondere al formato wire piuttosto che seguire la convenzione snake_case di Python. Vedi il riferimento AgentDefinition per i dettagli. I subagent vengono eseguiti in background per impostazione predefinita. Una chiamata dello strumento Agent che omette l’input run_in_background avvia un subagent di background, e Claude imposta run_in_background: false quando ha bisogno del risultato prima di continuare. Imposta il campo background su true per forzare l’esecuzione in background per un agente specifico indipendentemente da ciò che Claude richiede. Prima di Claude Code v2.1.198, l’impostazione predefinita di background era in fase di implementazione graduale, e una chiamata dello strumento Agent che ometteva run_in_background poteva eseguire il subagent in modo sincrono. I subagent possono anche generare subagent propri. Per limitare quanto profonda sia quella nidificazione, quanti subagent vengono eseguiti contemporaneamente e quanto una query spende, vedi Limitare la profondità, la concorrenza e la spesa dei subagent.

Definizione basata su filesystem (alternativa)

Puoi anche definire i subagent come file markdown nelle directory .claude/agents/. Vedi la documentazione dei subagent di Claude Code per i dettagli su questo approccio. Gli agenti definiti programmaticamente hanno la precedenza sugli agenti basati su filesystem con lo stesso nome.
Quando Claude chiama lo strumento Agent senza un subagent_type, ottiene il subagent general-purpose integrato, che Claude può generare anche quando non definisci agenti tuoi. Impostando CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS=1 rimuovi quel valore predefinito, e tale chiamata fallisce con subagent_type is required.

Cosa ereditano i subagent

A meno che il subagent non sia un fork, la sua finestra di contesto inizia da zero, senza la conversazione padre, ma non è vuota. L’unico contenuto che trasmetti dal padre al subagent è la stringa di prompt dello strumento Agent, quindi includi direttamente in quel prompt tutti i percorsi di file, i messaggi di errore o le decisioni di cui il subagent ha bisogno. Un subagent che dispone dello strumento SendMessage inizia con un elenco degli altri agenti denominati in esecuzione nella sessione, quindi sa quali nomi può utilizzare per inviare messaggi. Claude Code aggiunge automaticamente l’elenco al primo turno del subagent. Un fork non riceve l’elenco perché eredita invece la conversazione padre. Un subagent eredita anche la configurazione del pensiero esteso della sessione principale. La tabella seguente elenca ciò che il contesto di un subagent non-fork contiene e ciò che omette.
Il padre riceve il messaggio finale del subagent come risultato dello strumento Agent, ma potrebbe riassumerlo nella sua risposta. Per preservare l’output del subagent verbatim nella risposta rivolta all’utente, includi un’istruzione per farlo nel prompt o nell’opzione systemPrompt che passi alla chiamata principale query().Nella versione 2.1.210 e successive, Claude Code scansiona il messaggio finale per modelli a forma di istruzione prima che il padre lo legga. La scansione tratta tre tipi di modello diversamente:
  • Imitazione di tag di controllo: Claude Code neutralizza un tag che solo l’harness emette, come un blocco <system-reminder>, sul posto. Inserisce una barra rovesciata dopo la parentesi angolare di apertura e non elimina nulla.
  • Menzioni di configurazione delle autorizzazioni: Claude Code mantiene i riferimenti alla configurazione delle autorizzazioni, come .claude/settings.json, bypassPermissions, o --dangerously-skip-permissions, come scritti.
  • Marcatori di turno: una riga che inizia con Human: o Assistant: riceve una barra rovesciata prima dei due punti, in modo che il messaggio non possa imitare un confine di turno di conversazione.
Per una corrispondenza di tag di controllo o configurazione delle autorizzazioni, Claude Code antepone una riga marcatore [harness: ...] che nomina i modelli corrispondenti; una corrispondenza di marcatore di turno non aggiunge la riga marcatore. Queste sono le uniche modifiche che la scansione apporta: non rimuove mai o riformula il testo del subagent.
Un errore API che termina il subagent anticipatamente, come un limite di velocità, non viene mai consegnato come suo risultato. Vedi Errori API nei subagent per il comportamento in primo piano e in background.

Invocare subagenti

Invocazione automatica

Claude decide automaticamente quando invocare i subagenti in base al compito e alla description di ogni subagente. Ad esempio, se definisci un subagente performance-optimizer con la descrizione “Performance optimization specialist for query tuning”, Claude lo invocherà quando il tuo prompt menziona l’ottimizzazione delle query. Scrivi descrizioni chiare e specifiche in modo che Claude possa abbinare i compiti al subagente giusto.

Invocazione esplicita

Per garantire che Claude utilizzi un subagente specifico, menzionalo per nome nel tuo prompt:
Questo bypassa l’abbinamento automatico e invoca direttamente il subagente denominato.

Configurazione dinamica dell’agente

Puoi creare definizioni di agenti dinamicamente in base alle condizioni di runtime. Questo esempio crea un revisore di sicurezza con diversi livelli di rigore, utilizzando un modello più capace per revisioni rigorose.

Rilevare l’invocazione di subagent

Claude invoca i subagent tramite lo strumento Agent. Per rilevare quando un subagent viene invocato, verificare i blocchi tool_use dove name è "Agent". I messaggi provenienti dal contesto di un subagent includono un campo parent_tool_use_id.
Lo strumento appare come "Agent" nei blocchi tool_use ma come "Task" nell’elenco degli strumenti system:init. Prima di Claude Code v2.1.63, i blocchi tool_use lo denominano anche "Task". Per mantenere il rilevamento funzionante tra le versioni dell’SDK, abbinare entrambi i valori in block.name.
La struttura del messaggio differisce tra gli SDK. In Python, si accede ai blocchi di contenuto direttamente tramite message.content. In TypeScript, SDKAssistantMessage racchiude il messaggio dell’API Claude, quindi si accede al contenuto tramite message.message.content. Questo esempio itera attraverso i messaggi in streaming, registrando quando un subagent viene invocato e quando i messaggi successivi provengono dal contesto di esecuzione di quel subagent.

Riprendere i subagent

È possibile riprendere un subagent per continuare da dove si era fermato piuttosto che ricominciare da capo. Un subagent ripreso mantiene la sua intera cronologia di conversazione, incluse tutte le chiamate agli strumenti precedenti, i risultati e il ragionamento. Quando un subagent si ferma al limite di maxTurns, Claude Code contrassegna l’output nel risultato dello strumento Agent come parziale, in modo che Claude sappia che l’esecuzione è incompleta. Quando un subagent si completa, il risultato dello strumento Agent include un blocco di testo contenente agentId: <id>. Gli agenti Explore e Plan integrati sono monouso e non restituiscono un agentId, quindi utilizzare un agente personalizzato o general-purpose quando è necessario riprendere. Per riprendere un subagent a livello di programmazione:
  1. Acquisire l’ID della sessione: estrarre session_id dai messaggi durante la prima query
  2. Estrarre l’ID dell’agente: analizzare agentId dal testo del risultato dello strumento Agent
  3. Riprendere la sessione: passare resume: sessionId nelle opzioni della seconda query e includere l’ID dell’agente nel prompt. Ogni chiamata query() avvia una nuova sessione per impostazione predefinita ed è necessario riprendere la stessa sessione per accedere alla trascrizione del subagent.
Quando si utilizza un agente personalizzato, passare la stessa definizione di agente nel parametro agents per entrambe le query.
L’esempio seguente definisce un agente personalizzato endpoint-finder. La prima query lo esegue e acquisisce l’ID della sessione e l’ID dell’agente dal risultato dello strumento Agent, quindi la seconda query riprende la sessione per porre una domanda di follow-up che richiede il contesto della prima analisi.
Le trascrizioni dei subagent sono archiviate in file separati e persistono indipendentemente dalla conversazione principale. Vedere riprendere i subagent in Claude Code per il comportamento di compattazione e il periodo di pulizia cleanupPeriodDays.

Restrizioni degli strumenti

Utilizzare il campo tools per limitare ciò che un subagent può fare:
  • Omettere tools: il subagent ottiene ogni strumento disponibile per i subagent
  • Elencare gli strumenti: il subagent ottiene solo quelli. Ad esempio, un revisore di codice che non dovrebbe mai modificare file ottiene ["Read", "Grep", "Glob"]
Uno strumento che si omette non è affatto nella sessione del subagent: Claude funziona senza di esso, senza alcun prompt di autorizzazione o errore. Questo esempio crea un agente di analisi di sola lettura che può esaminare il codice ma non può modificare file o eseguire comandi.

Combinazioni comuni di strumenti

Limitare la profondità, la concorrenza e la spesa dei subagent

Questa sezione descrive TypeScript SDK v0.3.219 e Python SDK v0.2.127 e versioni successive, i rilasci che includono Claude Code v2.1.219 o versioni successive. Nei rilasci precedenti, alcuni di questi limiti sono assenti o hanno valori predefiniti diversi, quindi eseguire l’aggiornamento prima di fare affidamento su di essi per limitare un’esecuzione. Il riferimento alle variabili di ambiente e turni e budget registrano la versione di Claude Code che ha aggiunto ogni variabile e l’applicazione del limite di spesa del subagent.
Claude decide autonomamente quando generare un subagent e quanti generare. Ogni subagent effettua le proprie richieste API, che contano verso il total_cost_usd della query, e un subagent può generare subagent propri, quindi un prompt può trasformarsi in un albero di agenti. È possibile limitare questa crescita in tre modi: quanto profondamente i subagent si annidano, quanti vengono eseguiti contemporaneamente e quanto spende l’intera query. Impostare i limiti di profondità e concorrenza come variabili di ambiente tramite l’opzione env e il limite di spesa come opzione di query: I due SDK trattano l’opzione env diversamente: TypeScript SDK sostituisce l’ambiente del sottoprocesso con esso, quindi diffondere process.env in esso per mantenere variabili come PATH, mentre Python SDK lo unisce all’ambiente ereditato. Questo esempio disattiva l’annidamento, consente al massimo cinque subagent alla volta e arresta la query una volta che la spesa stimata raggiunge $5:
Quello che vedete dipende da quale limite, se presente, raggiunge la query:
  • Sotto il limite di spesa: vedete success e il costo stimato.
  • Al limite di spesa: vedete error_max_budget_usd con un costo pari o superiore a 5, e quindi il gestore degli errori viene eseguito.
  • Al limite di concorrenza: vedete un blocco tool_result nel flusso di messaggi che contiene Concurrent subagent limit reached. Claude riceve lo stesso blocco come risultato dello strumento Agent.

Eseguire Opus 5 con subagent

Claude Opus 5 delega ai subagent più prontamente rispetto ai modelli precedenti, quindi i limiti di profondità, concorrenza e spesa sono più importanti nelle query che eseguono Opus 5. La guida al prompting di Opus 5 contiene un’istruzione di delega che è possibile aggiungere a qualsiasi prompt. Se Claude Code aggiunge un’istruzione propria dipende da quale system prompt utilizzate:
  • Preset claude_code: quando il modello è Opus 5, Claude Code aggiunge una riga al suo system prompt dicendo a Claude di non chiamare lo strumento Agent a meno che non gli venga chiesto. Lo strumento Agent rimane disponibile.
  • Un prompt personalizzato, o nessun systemPrompt: Claude Code non costruisce il suo system prompt, quindi quella riga è assente. Aggiungete l’istruzione di delega della guida al prompting al vostro prompt.
Entrambe le istruzioni solo indirizzano Claude, quindi impostate anche i limiti. Claude Code li applica comunque in base a come Claude decide di delegare.

Scalare con flussi di lavoro dinamici

I subagenti funzionano bene per alcuni compiti delegati per turno. Per esecuzioni che coordinano dozzine o centinaia di agenti, utilizza lo strumento Workflow, che sposta l’orchestrazione in uno script che il runtime esegue al di fuori del contesto della conversazione. Vedi flussi di lavoro dinamici per come i flussi di lavoro differiscono dalla delegazione dei subagenti turno per turno. Lo strumento Workflow è disponibile nell’SDK TypeScript Agent v0.3.149 e versioni successive. Includi Workflow in allowedTools per approvare automaticamente le esecuzioni dei flussi di lavoro. Gli schemi di input e output dello strumento sono elencati nel riferimento TypeScript.

Risoluzione dei problemi

Claude non delega ai subagenti

Se Claude completa i compiti direttamente invece di delegare al tuo subagente:
  • Usa prompt espliciti: menziona il subagente per nome nel tuo prompt, ad esempio “Usa l’agente code-reviewer per controllare il modulo di autenticazione”
  • Scrivi una descrizione chiara: spiega esattamente quando utilizzare il subagente in modo che Claude possa abbinare i compiti in modo appropriato

Agenti basati su file system non caricati

Claude Code monitora ~/.claude/agents/ e .claude/agents/ e rileva un file di agente nuovo o modificato entro pochi secondi, senza necessità di riavvio. Se una definizione non appare mai, esamina queste cause:
  • Nuova directory agents: il monitoraggio copre solo le directory che esistevano all’avvio della sessione, quindi il primo file in una nuova directory richiede un riavvio della sessione. Questa è la causa più comune.
  • Frontmatter non valido o un name duplicato: controlla il YAML del file e se un agente esistente utilizza già il name.
  • --disable-slash-commands: le sessioni avviate con questo flag non monitorano queste directory e richiedono sempre un riavvio per caricare i nuovi file.
  • Un file in una directory aggiunta: Claude Code carica .claude/agents/ dalle directory aggiunte con l’opzione add_dirs (Python) o additionalDirectories (TypeScript), oppure con --add-dir o /add-dir della CLI, ma non le monitora, quindi un file nuovo o modificato lì richiede un riavvio della sessione.
  • Un agente programmatico con lo stesso nome: gli agents passati a query() sovrascrivono un agente del file system con lo stesso nome.
Per il formato del file, vedi come scrivere file di subagente.