Skip to main content
I subagenti sono istanze di agente separate che il tuo agente principale può generare per gestire sottoattività mirate. Utilizza i subagenti per isolare il contesto, eseguire più analisi in parallelo e applicare istruzioni specializzate senza appesantire il prompt dell’agente principale. Questa guida spiega come definire e utilizzare i subagenti nell’SDK utilizzando il parametro agents.

Panoramica

Puoi creare subagenti in tre modi:
  • A livello di programmazione: utilizza il parametro agents nelle tue opzioni query(). Vedi i riferimenti TypeScript e Python
  • Basato su file system: definisci gli agenti come file markdown nelle directory .claude/agents/. Vedi definizione di subagenti come file
  • Generale integrato: Claude può richiamare il subagente general-purpose integrato in qualsiasi momento tramite lo strumento Agent senza che tu debba definire nulla
Questa guida si concentra sull’approccio programmatico, che è consigliato per le applicazioni SDK. Quando definisci i subagenti, Claude determina se richiamarli in base al campo description di ogni subagente. Scrivi descrizioni chiare che spieghino quando il subagente dovrebbe essere utilizzato, e Claude delegherà automaticamente i compiti appropriati. Puoi anche richiedere esplicitamente un subagente per nome nel tuo prompt, ad esempio “Usa l’agente code-reviewer per…”.

Vantaggi dell’utilizzo dei subagenti

Isolamento del contesto

Ogni subagente viene eseguito nella propria conversazione nuova. Le chiamate agli strumenti intermedi e i risultati rimangono all’interno del subagente; solo il suo messaggio finale ritorna al genitore. Vedi Cosa ereditano i subagenti per sapere esattamente cosa c’è nel contesto del subagente. Esempio: un subagente 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 subagente ha letto.

Parallelizzazione

Più subagenti possono essere eseguiti contemporaneamente, quindi i sottoincarichi indipendenti si completano nel tempo di quello più lento piuttosto che nella somma di tutti loro. Esempio: durante una revisione del codice, puoi eseguire i subagenti style-checker, security-scanner e test-coverage simultaneamente invece che sequenzialmente.

Istruzioni e conoscenze specializzate

Ogni subagente può avere prompt di sistema personalizzati con competenze specifiche, best practice e vincoli. Esempio: un subagente 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 subagenti possono essere limitati a strumenti specifici, riducendo il rischio di azioni indesiderate. Esempio: un subagente doc-reviewer potrebbe avere accesso solo agli strumenti Read e Grep, assicurando che possa analizzare ma non modifichi mai accidentalmente i tuoi file di documentazione.

Creazione di subagenti

Definisci i subagenti direttamente nel tuo codice utilizzando il parametro agents. Claude richiama i subagenti tramite lo strumento Agent, quindi includi Agent in allowedTools per approvare automaticamente le invocazioni dei subagenti senza una richiesta di autorizzazione. La maggior parte degli esempi in questa pagina stampa solo il risultato finale. Per confermare che Claude ha delegato a un subagente piuttosto che rispondere direttamente, vedi Rilevamento dell’invocazione del subagente. Questo esempio crea due subagenti: un revisore di codice con accesso in sola lettura e un esecutore di test che può eseguire comandi.

Configurazione di AgentDefinition

Nell’SDK Python, 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. Due comportamenti dei subagenti sono cambiati in Claude Code v2.1.198:
  • I subagenti vengono eseguiti in background per impostazione predefinita. Una chiamata dello strumento Agent che omette l’input run_in_background avvia un subagente in background, e Claude imposta run_in_background: false quando ha bisogno del risultato prima di continuare. Prima della v2.1.198, omettere run_in_background eseguiva il subagente in modo sincrono. Imposta il campo background su true per forzare l’esecuzione in background per un agente specifico indipendentemente da ciò che Claude richiede.
  • Un subagente eredita la configurazione del pensiero esteso della sessione principale. Nelle versioni precedenti, il pensiero esteso è disabilitato all’interno dei subagenti indipendentemente dall’impostazione della sessione principale.
A partire da Claude Code v2.1.172, i subagenti possono generare i propri subagenti. Un subagente cinque livelli al di sotto dell’agente principale non può generare ulteriori subagenti, indipendentemente dal fatto che venga eseguito in primo piano o in background. Per impedire a un subagente di generare altri, ometti Agent dal suo array tools o aggiungilo a disallowedTools. Vedi subagenti annidati per le regole di profondità complete.

Definizione basata su file system (alternativa)

Puoi anche definire i subagenti come file markdown nelle directory .claude/agents/. Vedi la documentazione dei subagenti Claude Code per i dettagli su questo approccio. Gli agenti definiti a livello di programmazione hanno la precedenza sugli agenti basati su file system con lo stesso nome.
Anche senza definire subagenti personalizzati, Claude può generare il subagente general-purpose integrato. Questo è utile per delegare attività di ricerca o esplorazione senza creare agenti specializzati. Includi Agent in allowedTools affinché queste invocazioni si approvino automaticamente senza una richiesta di autorizzazione.

Cosa ereditano i subagenti

La finestra di contesto di un subagente inizia da zero, senza conversazione genitore, ma non è vuota. L’unico contenuto che passi dal genitore al subagente è la stringa di prompt dello strumento Agent, quindi includi direttamente nel prompt qualsiasi percorso di file, messaggio di errore o decisione di cui il subagente ha bisogno. Un subagente che ha lo 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 subagente. Un fork non riceve l’elenco perché eredita invece la conversazione genitore. L’elenco richiede Claude Code v2.1.206 o successivo.
Il genitore riceve il messaggio finale del subagente verbatim come risultato dello strumento Agent, ma potrebbe riassumerlo nella sua risposta. Per preservare l’output del subagente verbatim nella risposta rivolta all’utente, includi un’istruzione per farlo nel prompt o nell’opzione systemPrompt che passi alla chiamata principale query().
Un errore API che termina il subagente anticipatamente, come un limite di velocità, non viene mai consegnato come risultato. Se un limite di velocità, un sovraccarico o un errore del server interrompe un subagente in primo piano che ha già prodotto output di testo, lo strumento Agent restituisce quell’output parziale con una nota che il subagente non ha terminato. Un subagente che non ha prodotto nulla, o il cui unico output erano chiamate di strumenti senza testo, fallisce con un messaggio di errore, Agent terminated early due to an API error, seguito dal dettaglio dell’errore. Vedi API errors in subagents per il comportamento in primo piano e in background. Questa gestione dell’output parziale richiede Claude Code v2.1.199 o successivo. Nella v2.1.199, un limite di velocità, un sovraccarico o un errore del server ha lasciato la forma con sole chiamate di strumenti con un risultato parziale vuoto contenente solo la nota di interruzione.

Richiamo dei subagenti

Richiamo automatico

Claude decide automaticamente quando richiamare 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 richiamerà 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.

Richiamo esplicito

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

Configurazione dinamica dell’agente

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

Rilevamento dell’invocazione del subagente

Claude richiama i subagenti tramite lo strumento Agent. Per rilevare quando un subagente viene richiamato, controlla i blocchi tool_use dove name è "Agent". I messaggi provenienti dal contesto di un subagente includono un campo parent_tool_use_id.
Il nome dello strumento è stato rinominato da "Task" a "Agent" in Claude Code v2.1.63. Le versioni attuali dell’SDK emettono "Agent" nei blocchi tool_use ma utilizzano ancora "Task" nell’elenco degli strumenti system:init e in result.permission_denials[].tool_name. Controllare entrambi i valori in block.name garantisce la compatibilità tra le versioni dell’SDK.
La struttura del messaggio differisce tra gli SDK. In Python, i blocchi di contenuto sono accessibili direttamente tramite message.content. In TypeScript, SDKAssistantMessage avvolge il messaggio dell’API Claude, quindi il contenuto è accessibile tramite message.message.content. Questo esempio itera attraverso i messaggi trasmessi, registrando quando un subagente viene richiamato e quando i messaggi successivi provengono dal contesto di esecuzione di quel subagente.

Ripresa dei subagenti

È possibile riprendere un subagente per continuare da dove si era fermato piuttosto che iniziare da zero. Un subagente ripreso mantiene la sua cronologia di conversazione completa, incluse tutte le chiamate agli strumenti precedenti, i risultati e il ragionamento. Quando un subagente si completa, il risultato dello strumento Agent include un blocco di testo contenente agentId: <id>. Gli agenti integrati Explore e Plan sono monouso e non restituiscono un agentId, quindi utilizzare un agente personalizzato o general-purpose quando è necessario riprendere. Per riprendere un subagente a livello di programmazione:
  1. Cattura l’ID della sessione: estrai session_id dai messaggi durante la prima query
  2. Estrai l’ID dell’agente: analizza agentId dal testo del risultato dello strumento Agent
  3. Riprendi la sessione: passa resume: sessionId nelle opzioni della seconda query e includi l’ID dell’agente nel tuo prompt
Devi riprendere la stessa sessione per accedere alla trascrizione del subagente. Ogni chiamata query() avvia una nuova sessione per impostazione predefinita, quindi passa resume: sessionId per continuare nella stessa sessione.Quando utilizzi un agente personalizzato, passa 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 cattura 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 subagenti persistono indipendentemente dalla conversazione principale:
  • Compattazione della conversazione principale: quando la conversazione principale si compatta, le trascrizioni dei subagenti non sono interessate. Sono archiviate in file separati.
  • Persistenza della sessione: le trascrizioni dei subagenti persistono all’interno della loro sessione. È possibile riprendere un subagente dopo il riavvio di Claude Code riprendendo la stessa sessione.
  • Pulizia automatica: le trascrizioni vengono pulite in base all’impostazione cleanupPeriodDays, che per impostazione predefinita è di 30 giorni.

Restrizioni degli strumenti

I subagenti possono avere accesso agli strumenti limitato tramite il campo tools:
  • Ometti il campo: l’agente eredita tutti gli strumenti disponibili (predefinito)
  • Specifica gli strumenti: l’agente può utilizzare solo gli strumenti elencati
Questo esempio crea un agente di analisi in sola lettura che può esaminare il codice ma non può modificare file o eseguire comandi.

Combinazioni di strumenti comuni

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:
  • Verifica che le invocazioni di Agent siano approvate: includi Agent in allowedTools per approvare automaticamente le chiamate ai subagenti. Senza di esso, le invocazioni di Agent passano al tuo callback canUseTool oppure, in modalità dontAsk, vengono negate
  • Usa prompt espliciti: menziona il subagente per nome nel tuo prompt, ad esempio “Usa l’agente code-reviewer per…”
  • 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 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.

Errori di prompt lungo su Windows

Su Windows, i subagenti con prompt molto lunghi potrebbero non riuscire a causa del limite di lunghezza della riga di comando di 8191 caratteri. Mantieni i prompt concisi o utilizza agenti basati su file system per istruzioni complesse.