agents.
Panoramica
Puoi creare subagenti in tre modi:- A livello di programmazione: utilizza il parametro
agentsnelle tue opzioniquery()(TypeScript, 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-purposeintegrato in qualsiasi momento tramite lo strumento Agent senza che tu debba definire nulla
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 subagenteresearch-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 subagentistyle-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 subagentedatabase-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 subagentedoc-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
Definizione programmatica (consigliata)
Definisci i subagenti direttamente nel tuo codice utilizzando il parametroagents. Questo esempio crea due subagenti: un revisore di codice con accesso in sola lettura e un esecutore di test che può eseguire comandi. 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.
Configurazione di AgentDefinition
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
description | string | Sì | Descrizione in linguaggio naturale di quando utilizzare questo agente |
prompt | string | Sì | Il prompt di sistema dell’agente che definisce il suo ruolo e comportamento |
tools | string[] | No | Array di nomi di strumenti consentiti. Se omesso, eredita tutti gli strumenti |
disallowedTools | string[] | No | Array di nomi di strumenti da rimuovere dal set di strumenti dell’agente. Sono accettati anche i pattern a livello di server MCP: mcp__server o mcp__server__* rimuove ogni strumento da quel server, e mcp__* rimuove ogni strumento MCP da qualsiasi server |
model | string | No | Override del modello per questo agente. Accetta un alias come 'fable', 'opus', 'sonnet', 'haiku', 'inherit', o un ID modello completo. Predefinito al modello principale se omesso |
skills | string[] | No | Elenco di nomi di skill da precaricare nel contesto dell’agente all’avvio. Le skill non elencate rimangono invocabili tramite lo strumento Skill |
memory | 'user' | 'project' | 'local' | No | Fonte di memoria per questo agente |
mcpServers | (string | object)[] | No | Server MCP disponibili per questo agente, per nome o configurazione inline |
initialPrompt | string | No | Inviato automaticamente come primo turno utente quando questo agente viene eseguito come agente del thread principale. Ignorato quando l’agente viene richiamato come subagente |
maxTurns | number | No | Numero massimo di turni agentici prima che l’agente si fermi |
background | boolean | No | Esegui questo agente come attività di background non bloccante quando richiamato |
effort | 'low' | 'medium' | 'high' | 'xhigh' | 'max' | number | No | Livello di sforzo di ragionamento per questo agente |
permissionMode | PermissionMode | No | Modalità di autorizzazione per l’esecuzione dello strumento all’interno di questo agente |
AgentDefinition per i dettagli.
A partire da Claude Code v2.1.172, i subagenti possono generare i propri subagenti. Un subagente di background cinque livelli al di sotto dell’agente principale non può generare ulteriori subagenti; i subagenti in primo piano possono generare a qualsiasi profondità. 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 (nessuna conversazione genitore) ma non è vuota. L’unico canale 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.| Il subagente riceve | Il subagente non riceve |
|---|---|
Il suo prompt di sistema (AgentDefinition.prompt) e il prompt dello strumento Agent | La cronologia della conversazione del genitore o i risultati degli strumenti |
CLAUDE.md del progetto (caricato tramite settingSources) | Contenuto di skill precaricato, a meno che non sia elencato in AgentDefinition.skills |
Definizioni degli strumenti (ereditate dal genitore, o il sottoinsieme in tools) | Il prompt di sistema del genitore |
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().Richiamo dei subagenti
Richiamo automatico
Claude decide automaticamente quando richiamare 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 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: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
I subagenti vengono richiamati tramite lo strumento Agent. Per rilevare quando un subagente viene richiamato, controlla i blocchitool_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.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
I subagenti possono essere ripresi per continuare da dove si erano fermati. I subagenti ripresi mantengono la loro cronologia di conversazione completa, incluse tutte le chiamate agli strumenti precedenti, i risultati e il ragionamento. Il subagente riprende esattamente da dove si era fermato piuttosto che iniziare da zero. Quando un subagente si completa, il risultato dello strumento Agent include un blocco di testo contenenteagentId: <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:
- Cattura l’ID della sessione: Estrai
session_iddai messaggi durante la prima query - Estrai l’ID dell’agente: Analizza
agentIddal testo del risultato dello strumento Agent - Riprendi la sessione: Passa
resume: sessionIdnelle 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.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.
- 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. Puoi riprendere un subagente dopo il riavvio di Claude Code riprendendo la stessa sessione.
- Pulizia automatica: Le trascrizioni vengono pulite in base all’impostazione
cleanupPeriodDays(predefinito: 30 giorni).
Restrizioni degli strumenti
I subagenti possono avere accesso agli strumenti limitato tramite il campotools:
- Ometti il campo: l’agente eredita tutti gli strumenti disponibili (predefinito)
- Specifica gli strumenti: l’agente può utilizzare solo gli strumenti elencati
Combinazioni di strumenti comuni
| Caso d’uso | Strumenti | Descrizione |
|---|---|---|
| Analisi in sola lettura | Read, Grep, Glob | Può esaminare il codice ma non modificare o eseguire |
| Esecuzione di test | Bash, Read, Grep | Può eseguire comandi e analizzare l’output |
| Modifica del codice | Read, Edit, Write, Grep, Glob | Accesso completo in lettura/scrittura senza esecuzione di comandi |
| Accesso completo | Tutti gli strumenti | Eredita tutti gli strumenti dal genitore (ometti il campo tools) |
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:- Verifica che le invocazioni di Agent siano approvate: includi
AgentinallowedToolsper approvare automaticamente le chiamate ai subagenti. Senza di esso, le invocazioni di Agent passano al tuo callbackcanUseTooloppure, 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 il subagente dovrebbe essere utilizzato in modo che Claude possa abbinare i compiti in modo appropriato
Agenti basati su file system non caricati
Gli agenti definiti in.claude/agents/ vengono caricati solo all’avvio. Se crei un nuovo file di agente mentre Claude Code è in esecuzione, riavvia la sessione per caricarlo.
Windows: errori di prompt lungo
Su Windows, i subagenti con prompt molto lunghi potrebbero non riuscire a causa dei limiti di lunghezza della riga di comando (8191 caratteri). Mantieni i prompt concisi o utilizza agenti basati su file system per istruzioni complesse.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