Passer au contenu principal
Les sous-agents sont des instances d’agent distinctes que votre agent principal peut créer pour gérer des sous-tâches ciblées. Utilisez les sous-agents pour isoler le contexte, exécuter plusieurs analyses en parallèle et appliquer des instructions spécialisées sans surcharger l’invite de l’agent principal. Ce guide explique comment définir et utiliser les sous-agents dans le SDK en utilisant le paramètre agents.

Aperçu

Vous pouvez créer des sous-agents de trois façons :
  • Par programmation : utilisez le paramètre agents dans vos options query(). Consultez les références TypeScript et Python
  • Basé sur le système de fichiers : définissez les agents comme des fichiers markdown dans les répertoires .claude/agents/. Consultez définir les sous-agents comme fichiers
  • Général intégré : Claude peut invoquer le sous-agent general-purpose intégré à tout moment via l’outil Agent sans que vous ayez besoin de rien définir
Ce guide se concentre sur l’approche programmatique, qui est recommandée pour les applications SDK. Lorsque vous définissez des sous-agents, Claude détermine s’il faut les invoquer en fonction du champ description de chaque sous-agent. Écrivez des descriptions claires qui expliquent quand utiliser le sous-agent, et Claude délèguera automatiquement les tâches appropriées. Vous pouvez également demander explicitement un sous-agent par son nom dans votre invite, par exemple « Utilisez l’agent code-reviewer pour… ».

Avantages de l’utilisation des sous-agents

Isolation du contexte

Chaque sous-agent s’exécute dans sa propre conversation nouvelle. Les appels d’outils intermédiaires et les résultats restent à l’intérieur du sous-agent ; seul son message final revient au parent. Voir Ce que les sous-agents héritent pour savoir exactement ce qui se trouve dans le contexte du sous-agent. Exemple : un sous-agent research-assistant peut explorer des dizaines de fichiers sans que le contenu de ces fichiers s’accumule dans la conversation principale. Le parent reçoit un résumé concis, pas chaque fichier que le sous-agent a lu.

Parallélisation

Plusieurs sous-agents peuvent s’exécuter simultanément, de sorte que les sous-tâches indépendantes se terminent dans le temps du plus lent plutôt que la somme de tous. Exemple : lors d’une révision de code, vous pouvez exécuter les sous-agents style-checker, security-scanner et test-coverage simultanément au lieu de séquentiellement.

Instructions et connaissances spécialisées

Chaque sous-agent peut avoir des invites système adaptées avec une expertise spécifique, des meilleures pratiques et des contraintes. Exemple : un sous-agent database-migration peut avoir des connaissances détaillées sur les meilleures pratiques SQL, les stratégies de restauration et les vérifications d’intégrité des données qui seraient du bruit inutile dans les instructions du principal agent.

Restrictions d’outils

Les sous-agents peuvent être limités à des outils spécifiques, réduisant le risque d’actions involontaires. Exemple : un sous-agent doc-reviewer pourrait n’avoir accès qu’aux outils Read et Grep, garantissant qu’il peut analyser mais ne peut jamais modifier accidentellement vos fichiers de documentation.

Créer des sous-agents

Définissez les sous-agents directement dans votre code en utilisant le paramètre agents. Claude invoque les sous-agents via l’outil Agent, donc incluez Agent dans allowedTools pour approuver automatiquement les invocations de sous-agents sans invite de permission. La plupart des exemples de cette page n’impriment que le résultat final. Pour confirmer que Claude a délégué à un sous-agent plutôt que de répondre directement, voir Détecter l’invocation de sous-agent. Cet exemple crée deux sous-agents : un examinateur de code avec accès en lecture seule et un exécuteur de tests qui peut exécuter des commandes.

Configuration AgentDefinition

Dans le SDK Python, les noms de champs multi-mots tels que disallowedTools et mcpServers conservent leur orthographe camelCase pour correspondre au format de transmission plutôt que de suivre la convention snake_case de Python. Voir la référence AgentDefinition pour plus de détails. Deux comportements de sous-agent ont changé dans Claude Code v2.1.198 :
  • Les sous-agents s’exécutent en arrière-plan par défaut. Un appel d’outil Agent qui omet l’entrée run_in_background lance un sous-agent en arrière-plan, et Claude définit run_in_background: false lorsqu’il a besoin du résultat avant de continuer. Avant v2.1.198, l’omission de run_in_background exécutait le sous-agent de manière synchrone. Définissez le champ background à true pour forcer l’exécution en arrière-plan pour un agent spécifique indépendamment de ce que Claude demande.
  • Un sous-agent hérite de la configuration de la réflexion étendue de la session principale. Sur les versions antérieures, la réflexion étendue est désactivée à l’intérieur des sous-agents indépendamment du paramètre de la session principale.
À partir de Claude Code v2.1.172, les sous-agents peuvent créer leurs propres sous-agents. Un sous-agent cinq niveaux en dessous de l’agent principal ne peut pas créer d’autres sous-agents, indépendamment du fait qu’il s’exécute au premier plan ou en arrière-plan. Pour empêcher un sous-agent de créer d’autres agents, omettez Agent de son tableau tools ou ajoutez-le à disallowedTools. Voir sous-agents imbriqués pour les règles de profondeur complètes.

Définition basée sur le système de fichiers (alternative)

Vous pouvez également définir les sous-agents comme des fichiers markdown dans les répertoires .claude/agents/. Voir la documentation des sous-agents Claude Code pour plus de détails sur cette approche. Les agents définis par programmation ont la priorité sur les agents basés sur le système de fichiers portant le même nom.
Même sans définir de sous-agents personnalisés, Claude peut créer le sous-agent general-purpose intégré. Ceci est utile pour déléguer des tâches de recherche ou d’exploration sans créer d’agents spécialisés. Incluez Agent dans allowedTools afin que ces invocations s’approuvent automatiquement sans invite de permission.

Ce que les sous-agents héritent

La fenêtre de contexte d’un sous-agent commence fraîche, sans conversation parent, mais n’est pas vide. Le seul contenu que vous transmettez du parent au sous-agent est la chaîne d’invite de l’outil Agent, donc incluez tous les chemins de fichiers, messages d’erreur ou décisions dont le sous-agent a besoin directement dans cette invite. Un sous-agent qui dispose de l’outil SendMessage commence avec une liste des autres agents nommés exécutés dans la session, il sait donc quels noms il peut utiliser pour envoyer des messages. Claude Code ajoute la liste au premier tour du sous-agent automatiquement. Un fork n’obtient pas la liste car il hérite de la conversation parent à la place. La liste nécessite Claude Code v2.1.206 ou ultérieur.
Le parent reçoit le message final du sous-agent tel quel comme résultat de l’outil Agent, mais peut le résumer dans sa propre réponse. Pour préserver la sortie du sous-agent tel quel dans la réponse visible par l’utilisateur, incluez une instruction pour le faire dans l’invite ou l’option systemPrompt que vous transmettez à l’appel query() principal.
Une erreur API qui termine le sous-agent prématurément, comme une limite de débit, n’est jamais livrée comme résultat. Si une limite de débit, une surcharge ou une erreur serveur interrompt un sous-agent au premier plan qui a déjà produit une sortie textuelle, l’outil Agent retourne cette sortie partielle avec une note indiquant que le sous-agent n’a pas terminé. Un sous-agent qui n’a rien produit, ou dont la seule sortie était des appels d’outils sans texte, échoue avec un message d’erreur, Agent terminated early due to an API error, suivi du détail de l’erreur. Consultez API errors in subagents pour le comportement au premier plan et en arrière-plan. Cette gestion des sorties partielles nécessite Claude Code v2.1.199 ou ultérieur. Dans v2.1.199, une limite de débit, une surcharge ou une erreur serveur laissait la forme contenant uniquement des appels d’outils avec un résultat partiel vide contenant seulement la note d’interruption.

Invoquer les sous-agents

Invocation automatique

Claude décide automatiquement quand invoquer les sous-agents en fonction de la tâche et de la description de chaque sous-agent. Par exemple, si vous définissez un sous-agent performance-optimizer avec la description « Spécialiste de l’optimisation des performances pour l’optimisation des requêtes », Claude l’invoquera lorsque votre invite mentionne l’optimisation des requêtes. Écrivez des descriptions claires et spécifiques pour que Claude puisse faire correspondre les tâches au bon sous-agent.

Invocation explicite

Pour garantir que Claude utilise un sous-agent spécifique, mentionnez-le par son nom dans votre invite :
Cela contourne la correspondance automatique et invoque directement le sous-agent nommé.

Configuration d’agent dynamique

Vous pouvez créer des définitions d’agent dynamiquement en fonction des conditions d’exécution. Cet exemple crée un examinateur de sécurité avec différents niveaux de rigueur, en utilisant un modèle plus puissant pour les révisions strictes.

Détection de l’invocation de sous-agents

Claude invoque les sous-agents via l’outil Agent. Pour détecter quand un sous-agent est invoqué, vérifiez les blocs tool_usename est "Agent". Les messages provenant du contexte d’un sous-agent incluent un champ parent_tool_use_id.
Le nom de l’outil a été renommé de "Task" à "Agent" dans Claude Code v2.1.63. Les versions actuelles du SDK émettent "Agent" dans les blocs tool_use mais utilisent toujours "Task" dans la liste des outils system:init et dans result.permission_denials[].tool_name. Vérifier les deux valeurs dans block.name assure la compatibilité entre les versions du SDK.
La structure du message diffère entre les SDK. En Python, les blocs de contenu sont accessibles directement via message.content. En TypeScript, SDKAssistantMessage enveloppe le message de l’API Claude, donc le contenu est accessible via message.message.content. Cet exemple itère à travers les messages en continu, enregistrant quand un sous-agent est invoqué et quand les messages suivants proviennent du contexte d’exécution de ce sous-agent.

Reprise des sous-agents

Vous pouvez reprendre un sous-agent pour continuer là où il s’est arrêté plutôt que de recommencer à zéro. Un sous-agent repris conserve son historique de conversation complet, y compris tous les appels d’outils précédents, les résultats et le raisonnement. Lorsqu’un sous-agent se termine, le résultat de l’outil Agent inclut un bloc de texte contenant agentId: <id>. Les agents intégrés Explore et Plan sont ponctuels et ne retournent pas d’agentId, donc utilisez un agent personnalisé ou general-purpose lorsque vous avez besoin de reprendre. Pour reprendre un sous-agent par programmation :
  1. Capturez l’ID de session : Extrayez session_id des messages lors de la première requête
  2. Extrayez l’ID d’agent : Analysez agentId du texte du résultat de l’outil Agent
  3. Reprenez la session : Passez resume: sessionId dans les options de la deuxième requête, et incluez l’ID d’agent dans votre invite
Vous devez reprendre la même session pour accéder à la transcription du sous-agent. Chaque appel query() démarre une nouvelle session par défaut, donc passez resume: sessionId pour continuer dans la même session.Lorsque vous utilisez un agent personnalisé, passez la même définition d’agent dans le paramètre agents pour les deux requêtes.
L’exemple ci-dessous définit un agent personnalisé endpoint-finder. La première requête l’exécute et capture l’ID de session et l’ID d’agent du résultat de l’outil Agent, puis la deuxième requête reprend la session pour poser une question de suivi qui nécessite le contexte de la première analyse.
Les transcriptions des sous-agents persistent indépendamment de la conversation principale :
  • Compaction de la conversation principale : Lorsque la conversation principale se compacte, les transcriptions des sous-agents ne sont pas affectées. Elles sont stockées dans des fichiers séparés.
  • Persistance de la session : Les transcriptions des sous-agents persistent au sein de leur session. Vous pouvez reprendre un sous-agent après avoir redémarré Claude Code en reprenant la même session.
  • Nettoyage automatique : Les transcriptions sont nettoyées en fonction du paramètre cleanupPeriodDays, qui est défini par défaut à 30 jours.

Restrictions d’outils

Les sous-agents peuvent avoir un accès aux outils restreint via le champ tools :
  • Omettez le champ : l’agent hérite de tous les outils disponibles (par défaut)
  • Spécifiez les outils : l’agent ne peut utiliser que les outils listés
Cet exemple crée un agent d’analyse en lecture seule qui peut examiner le code mais ne peut pas modifier les fichiers ou exécuter des commandes.

Combinaisons d’outils courantes

Augmenter l’échelle avec des flux de travail dynamiques

Les sous-agents fonctionnent bien pour quelques tâches déléguées par tour. Pour les exécutions qui coordonnent des dizaines à des centaines d’agents, utilisez l’outil Workflow, qui déplace l’orchestration dans un script que le runtime exécute en dehors du contexte de conversation. Voir flux de travail dynamiques pour savoir comment les flux de travail diffèrent de la délégation de sous-agents tour par tour. L’outil Workflow est disponible dans le TypeScript Agent SDK v0.3.149 et versions ultérieures. Incluez Workflow dans allowedTools pour approuver automatiquement les exécutions de flux de travail. Les schémas d’entrée et de sortie de l’outil sont listés dans la référence TypeScript.

Dépannage

Claude ne délègue pas aux sous-agents

Si Claude complète les tâches directement au lieu de déléguer à votre sous-agent :
  • Vérifiez que les invocations d’Agent sont approuvées : incluez Agent dans allowedTools pour approuver automatiquement les appels de sous-agent. Sans cela, les invocations d’Agent passent par votre callback canUseTool ou, en mode dontAsk, sont refusées
  • Utilisez des invites explicites : mentionnez le sous-agent par son nom dans votre invite, par exemple « Utilisez l’agent code-reviewer pour… »
  • Écrivez une description claire : expliquez exactement quand utiliser le sous-agent pour que Claude puisse faire correspondre les tâches de manière appropriée

Les agents basés sur le système de fichiers ne se chargent pas

Claude Code surveille ~/.claude/agents/ et .claude/agents/ et détecte un fichier d’agent nouveau ou modifié en quelques secondes, sans redémarrage nécessaire. Si une définition n’apparaît jamais, vérifiez ces causes :
  • Nouveau répertoire agents : le moniteur couvre uniquement les répertoires qui existaient au démarrage de la session, donc le premier fichier dans un nouveau répertoire nécessite un redémarrage de session. C’est la cause la plus courante.
  • Frontmatter invalide ou name en doublon : vérifiez le YAML du fichier et si un agent existant utilise déjà le name.
  • --disable-slash-commands : les sessions démarrées avec ce flag ne surveillent pas ces répertoires et nécessitent toujours un redémarrage pour charger les nouveaux fichiers.
  • Un agent programmatique avec le même nom : les agents passés à query() remplacent un agent du système de fichiers avec le même nom.
Pour le format de fichier, consultez comment écrire des fichiers de sous-agent.

Échecs d’invite longue sur Windows

Sur Windows, les sous-agents avec des invites très longues peuvent échouer en raison de la limite de longueur de ligne de commande de 8191 caractères. Gardez les invites concises ou utilisez des agents basés sur le système de fichiers pour les instructions complexes.
  • Sous-agents Claude Code : documentation complète des sous-agents incluant les définitions basées sur le système de fichiers
  • Flux de travail dynamiques : orchestrez de nombreux sous-agents à partir d’un script pour les tâches trop importantes pour une seule conversation
  • Aperçu du SDK : prise en main du Claude Agent SDK