Panoramica
È possibile creare subagent in tre modi:- A livello programmatico: utilizzare il parametro
agentsnelle opzioni diquery(). 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-purposeintegrato in qualsiasi momento tramite lo strumento Agent senza che sia necessario definire nulla
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-assistantpuò 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-scanneretest-coveragesimultaneamente 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-migrationpuò 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-reviewerpotrebbe avere accesso solo ai tool Read e Grep, assicurando che possa analizzare ma non modifichi mai accidentalmente i file di documentazione.
Creare subagent
Definizione programmatica (consigliata)
Definisci i subagent direttamente nel tuo codice utilizzando il parametroagents. 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 strumentoSendMessage 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:oAssistant:riceve una barra rovesciata prima dei due punti, in modo che il messaggio non possa imitare un confine di turno di conversazione.
[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.Invocare subagenti
Invocazione automatica
Claude decide automaticamente quando invocare i subagenti in base al compito e alladescription 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: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 blocchitool_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.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 dimaxTurns, 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:
- Acquisire l’ID della sessione: estrarre
session_iddai messaggi durante la prima query - Estrarre l’ID dell’agente: analizzare
agentIddal testo del risultato dello strumento Agent - Riprendere la sessione: passare
resume: sessionIdnelle opzioni della seconda query e includere l’ID dell’agente nel prompt. Ogni chiamataquery()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.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.
cleanupPeriodDays.
Restrizioni degli strumenti
Utilizzare il campotools 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"]
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.
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:
- Sotto il limite di spesa: vedete
successe il costo stimato. - Al limite di spesa: vedete
error_max_budget_usdcon un costo pari o superiore a5, e quindi il gestore degli errori viene eseguito. - Al limite di concorrenza: vedete un blocco
tool_resultnel flusso di messaggi che contieneConcurrent 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.
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 strumentoWorkflow, 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
nameduplicato: controlla il YAML del file e se un agente esistente utilizza già ilname. --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’opzioneadd_dirs(Python) oadditionalDirectories(TypeScript), oppure con--add-diro/add-dirdella 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
agentspassati aquery()sovrascrivono un agente del file system con lo stesso nome.
Documentazione correlata
- Subagenti Claude Code: documentazione completa sui subagenti incluse le definizioni basate su file system
- Flussi di lavoro dinamici: orchestra molti subagenti da uno script per lavori troppo grandi per una conversazione
- Panoramica dell’SDK: introduzione all’SDK Claude Agent