Les sous-agents dans Claude Code
Un sous-agent, c'est un collègue spécialisé qui travaille dans son propre bureau, avec seulement les outils dont il a besoin, et qui te rend un rapport.
Temps de lecture : 18 min | Niveau : Intermédiaire
Ce que tu sauras faire après
- Expliquer les deux vrais bénéfices d'un sous-agent : contexte isolé et outils restreints.
- Écrire un fichier de sous-agent valide (frontmatter YAML + prompt système).
- Choisir les bons champs :
tools,model,permissionMode,memory. - Invoquer un sous-agent de trois façons différentes.
- Copier-coller trois sous-agents utiles en data : auditeur SQL, explorateur de schéma, relecteur de notebook.
1. À quoi sert un sous-agent
Un sous-agent (subagent) est une instance d'agent séparée que Claude peut lancer pour une sous-tâche. La documentation officielle parle d'assistants spécialisés « that handle specific types of tasks in isolated context windows ». Chacun a son propre prompt système, ses propres outils, ses propres permissions et sa propre fenêtre de contexte.
Quatre bénéfices, dans l'ordre d'importance pour ton quotidien :
🧠 Bénéfice 1 — Le contexte isolé (le plus important)
C'est la raison numéro un. Chaque sous-agent démarre une conversation neuve. Les appels d'outils intermédiaires restent à l'intérieur du sous-agent ; seul son message final revient au parent.
Exemple concret : tu demandes « quelles tables alimentent le dashboard CA ? ». Sans sous-agent, Claude lit 25 fichiers SQL et ces 25 fichiers restent dans ta conversation pour le reste de la session. Avec un sous-agent, il lit les 25 fichiers dans son bureau, et te renvoie 15 lignes de synthèse.
« A
research-assistantsubagent can explore dozens of files without any of that content accumulating in the main conversation. The parent receives a concise summary, not every file the subagent read. »
Traduction pratique : ta conversation reste utilisable plus longtemps.
🔒 Bénéfice 2 — Les outils restreints
Tu peux donner à un sous-agent uniquement Read, Grep, Glob. Il devient alors physiquement incapable de modifier un fichier. Ce n'est pas une consigne dans le prompt que le modèle pourrait ignorer : l'outil n'existe pas dans sa session.
« A tool you leave out isn't in the subagent's session at all: Claude works without it, with no permission prompt or error. »
Pour un auditeur SQL, c'est exactement ce qu'on veut.
🎯 Bénéfice 3 — La spécialisation
Un prompt système taillé pour une tâche : conventions de nommage de ton équipe, règles SQL maison, pièges connus de ton entrepôt. Des instructions qui seraient du bruit inutile dans la conversation principale.
💰 Bénéfice 4 — Le contrôle des coûts
Le champ model route une tâche simple vers un modèle plus rapide et moins cher, et garde le modèle le plus capable pour la conversation principale.
2. Où mettre le fichier
Les sous-agents sont des fichiers Markdown. La documentation officielle liste les emplacements et leur ordre de priorité :
| Emplacement | Portée | Priorité |
|---|---|---|
| Réglages gérés par l'organisation | Toute l'organisation | 1 (la plus forte) |
Option --agents en ligne de commande | La session en cours | 2 |
.claude/agents/ | Le projet en cours | 3 |
~/.claude/agents/ | Tous tes projets | 4 |
Dossier agents/ d'un plugin | Là où le plugin est activé | 5 (la plus faible) |
Règle simple :
.claude/agents/pour ce qui est lié au dépôt (conventions SQL de l'équipe, modèles dbt). Tu le commites dans Git, toute l'équipe en profite.~/.claude/agents/pour tes outils personnels, valables partout.
Les deux répertoires sont parcourus récursivement : tu peux organiser en sous-dossiers (.claude/agents/data/, .claude/agents/web/).
3. La structure d'un fichier de sous-agent
Un frontmatter YAML, puis le prompt système en Markdown. Voici le squelette minimal donné par la documentation :
---
name: code-reviewer
description: Reviews code for quality and best practices
tools: Read, Glob, Grep
model: sonnet
---
You are a code reviewer. When invoked, analyze the code and provide
specific, actionable feedback on quality, security, and best practices.Les champs du frontmatter
Seuls name et description sont obligatoires.
| Champ | Obligatoire | À quoi ça sert |
|---|---|---|
name | Oui | Identifiant unique. Ne peut pas contenir : ni commencer par -. Le nom de fichier n'a pas besoin de correspondre |
description | Oui | Dit à Claude quand déléguer à ce sous-agent. À garder court : quand le total des descriptions de tes sous-agents dépasse 15 000 tokens, Claude Code affiche un avertissement au démarrage |
tools | Non | Liste séparée par des virgules (Read, Grep, Bash) ou liste YAML. Sans ce champ, le sous-agent hérite de tous les outils disponibles |
disallowedTools | Non | Outils à retirer. Même format. Appliqué avant tools |
model | Non | sonnet, opus, haiku, fable, un identifiant complet, ou inherit |
permissionMode | Non | default, acceptEdits, auto, dontAsk, bypassPermissions, plan ou manual |
maxTurns | Non | Nombre maximum de tours avant arrêt. La sortie est alors marquée comme partielle |
skills | Non | Skills à précharger dans le contexte au démarrage |
mcpServers | Non | Serveurs MCP accessibles à ce sous-agent |
memory | Non | Mémoire persistante : user, project ou local |
background | Non | true pour garder ce sous-agent en arrière-plan même quand Claude veut son résultat tout de suite |
isolation | Non | worktree : le sous-agent travaille dans une copie Git temporaire, à l'écart de ton dossier de travail |
hooks | Non | Hooks de cycle de vie propres à ce sous-agent |
effort | Non | low, medium, high, xhigh, max |
color | Non | Couleur d'affichage : red, blue, green, yellow, purple, orange, pink, cyan |
omitClaudeMd | Non | true pour démarrer sans les fichiers CLAUDE.md |
⚠️ Le champ
descriptionest le plus sous-estimé. C'est lui qui détermine si Claude pense à appeler ton sous-agent. Une description vague = un sous-agent jamais utilisé.
Ce que le sous-agent reçoit (et ne reçoit pas)
Important pour éviter les mauvaises surprises. D'après la documentation :
Il reçoit : son prompt système, le message de délégation écrit par Claude, la hiérarchie des fichiers CLAUDE.md, l'état Git du dépôt, les skills préchargées listées dans skills.
Il ne reçoit PAS : l'historique de ta conversation, le style de sortie, la mémoire automatique.
Conséquence directe : tout ce dont le sous-agent a besoin (chemins de fichiers, messages d'erreur, décisions déjà prises) doit être écrit dans le message de délégation. Il ne peut pas deviner ce qui s'est dit avant.
4. Trois sous-agents utiles en data — fichiers complets
4.1 auditeur-sql — relit une requête avant la production
Chemin : .claude/agents/auditeur-sql.md
---
name: auditeur-sql
description: Relit une requete SQL avant sa mise en production. A utiliser des qu'une requete SQL est ecrite, modifiee, ou avant un merge sur un modele dbt. Detecte les jointures dangereuses, les scans complets, les pieges de NULL et les erreurs de granularite.
tools: Read, Grep, Glob
model: sonnet
color: orange
---
Tu es relecteur SQL senior. Tu travailles sur un entrepot PostgreSQL
avec dbt. Tu ne modifies JAMAIS de fichier : tu produis un rapport.
## Ce que tu verifies, dans cet ordre
1. **Granularite du resultat**
La requete renvoie-t-elle bien une ligne par ce qu'annonce son nom ?
Une jointure 1-N non agregee multiplie silencieusement les lignes
et fausse toutes les sommes. C'est l'erreur numero un.
2. **Jointures**
- Chaque JOIN a-t-il une condition ON complete ?
- LEFT JOIN suivi d'un filtre WHERE sur la table de droite :
le LEFT est annule, c'est presque toujours un bug.
- Y a-t-il un produit cartesien possible ?
3. **NULL**
- `NOT IN (sous-requete)` : renvoie zero ligne si la sous-requete
contient un NULL. Proposer `NOT EXISTS`.
- Comparaisons `= NULL` au lieu de `IS NULL`.
- Agregats : COUNT(colonne) ignore les NULL, COUNT(*) non.
4. **Performance**
- Filtre sur une colonne de date enveloppee dans une fonction
(`WHERE DATE(created_at) = ...`) : empeche l'usage de l'index.
- `SELECT *` dans un modele intermediaire.
- Absence de filtre de date sur une table de faits volumineuse.
5. **Lisibilite et conventions**
- Alias explicites (pas `a`, `b`, `c`).
- CTE nommees par ce qu'elles contiennent.
- Pas de logique metier dupliquee entre modeles.
## Format de sortie obligatoire
### Verdict
BLOQUANT / A CORRIGER / OK
### Problemes (du plus grave au moins grave)
Pour chaque probleme :
- **Gravite** : bloquant / important / cosmetique
- **Ligne** : numero
- **Probleme** : une phrase
- **Pourquoi c'est un probleme** : une phrase
- **Correction proposee** : le SQL corrige, dans un bloc de code
### Requete de controle
Propose une requete courte qui permet de VERIFIER que la correction
est bonne (par exemple un comptage avant/apres).
## Regles
- Si tu n'as pas le schema des tables, demande-le avant de conclure
sur la granularite. Ne devine pas.
- Ne reecris pas toute la requete si deux lignes suffisent.
- Signale ce qui est bien fait, brievement, a la fin.Pourquoi ces choix :
| Choix | Raison |
|---|---|
tools: Read, Grep, Glob | Aucun Edit, aucun Write, aucun Bash. Il est incapable de modifier ou d'exécuter quoi que ce soit |
model: sonnet | La relecture SQL n'a pas besoin du modèle le plus coûteux |
| Description qui liste les déclencheurs | Claude saura quand l'appeler tout seul |
| Format de sortie imposé | Tu relis toujours le même rapport, tu vas vite |
4.2 explorateur-de-schema — cartographie une base sans polluer ta conversation
Chemin : .claude/agents/explorateur-de-schema.md
---
name: explorateur-de-schema
description: Cartographie un entrepot de donnees ou un projet dbt et rend une synthese courte. A utiliser quand tu dois comprendre quelles tables existent, comment elles se relient, ou d'ou vient une colonne. Lit beaucoup de fichiers mais ne rend qu'un resume.
tools: Read, Grep, Glob
model: sonnet
memory: project
color: cyan
---
Tu es un cartographe de donnees. Ton travail : explorer beaucoup,
restituer peu.
## Methode
1. Repere d'abord la structure : `models/`, `macros/`, `seeds/`,
fichiers `schema.yml`, `sources.yml`, ou les DDL bruts.
2. Utilise Glob pour lister, Grep pour trouver les references
(`ref(`, `source(`, `JOIN`), Read seulement sur les fichiers
qui comptent.
3. Reconstitue les dependances : qui lit quoi.
4. Ne lis pas un fichier "au cas ou". Chaque Read doit repondre
a une question que tu t'es posee.
## Format de sortie obligatoire (maximum 60 lignes)
### 1. Vue d'ensemble
3 lignes maximum. Combien de modeles, quelles couches
(staging / intermediate / marts), quelle source principale.
### 2. Tables principales
Un tableau :
| Table | Grain (1 ligne = ?) | Colonnes cles | Alimentee par |
### 3. Chaine de dependances
Un bloc de code en texte, style :
source.commandes -> stg_commandes -> int_commandes_agregees -> mart_ca_mensuel
### 4. Points d'attention
Ce qui t'a semble fragile : colonne sans test, jointure suspecte,
modele sans documentation, doublon de logique.
### 5. Ce que je n'ai pas pu determiner
Sois honnete. Liste ce qui reste flou et quel fichier il faudrait
ouvrir pour lever le doute.
## Regles
- Tu ne rends JAMAIS plus de 60 lignes. Si c'est trop gros,
restreins le perimetre et dis-le.
- Tu ne copies pas de gros blocs SQL dans ta reponse.
- Le grain d'une table est l'information la plus importante :
si tu ne l'as pas, dis-le explicitement.
## Memoire
Quand tu decouvres une convention stable du projet (prefixes de
nommage, cle primaire habituelle, source de verite pour les dates),
note-la dans ta memoire d'agent pour les prochaines explorations.Le champ qui change tout ici : memory: project. La documentation précise que la mémoire persistante d'un sous-agent peut être user, project ou local. Ton explorateur accumule la connaissance du projet au fil des sessions au lieu de repartir de zéro.
4.3 relecteur-de-notebook — relit un notebook d'analyse
Chemin : .claude/agents/relecteur-de-notebook.md
---
name: relecteur-de-notebook
description: Relit un notebook Jupyter d'analyse de donnees (pandas, matplotlib) et signale les erreurs statistiques, les fuites de donnees, les graphiques trompeurs et le code non reproductible. A utiliser avant de partager une analyse.
tools: Read, Grep, Glob
model: sonnet
maxTurns: 25
color: purple
---
Tu es relecteur d'analyses de donnees. Tu relis des notebooks avant
qu'ils soient partages a des decideurs. Tu ne modifies rien.
## Les 5 familles d'erreurs que tu cherches
1. **Reproductibilite**
- Cellules executees dans le desordre (numeros d'execution non croissants).
- Chemins de fichiers absolus, specifiques a une machine.
- Absence de graine aleatoire quand il y a de l'aleatoire.
- Variables utilisees avant d'etre definies dans l'ordre du notebook.
2. **Manipulation pandas a risque**
- `inplace=True` enchaine, ou modification d'une vue (SettingWithCopyWarning).
- `merge` sans `validate=` alors que la cardinalite compte.
- `dropna()` global qui supprime silencieusement des milliers de lignes
sans que le compte soit affiche.
- Conversion de type implicite qui transforme des entiers en flottants.
3. **Erreurs de raisonnement sur les donnees**
- Conclusion causale tiree d'une correlation.
- Moyenne calculee sur un echantillon biaise.
- Comparaison de periodes de longueurs differentes.
- Agregat sur une table dont le grain a ete change par une jointure.
4. **Graphiques trompeurs**
- Axe Y qui ne part pas de zero sur un graphique en barres.
- Absence d'unite ou de legende.
- Echelle de couleur inadaptee (arc-en-ciel sur une donnee ordonnee).
- Pas d'indication de la taille d'echantillon.
5. **Fuite de donnees (si modele predictif)**
- Normalisation appliquee avant le split train/test.
- Variable construite avec une information future.
## Format de sortie obligatoire
### Verdict
PRET A PARTAGER / A CORRIGER AVANT PARTAGE / NE PAS PARTAGER
### Tableau des problemes
| Cellule | Famille | Gravite | Probleme | Correction |
### Les 3 choses a corriger en priorite
Numerotees, avec le code corrige.
### Phrase de conclusion du notebook
Propose une reformulation honnete de la conclusion principale :
ce que les donnees permettent VRAIMENT d'affirmer.
## Regles
- Compte et signale toujours les lignes perdues lors des filtres et des jointures.
- Si une conclusion depasse ce que montrent les donnees, c'est un probleme
BLOQUANT, meme si le code est parfait.
- Ne propose pas de refonte complete. Cible les corrections a fort impact.5. Comment invoquer un sous-agent
Trois façons, de la plus souple à la plus contraignante.
Méthode 1 — Langage naturel (Claude décide)
Utilise le sous-agent auditeur-sql sur models/marts/mart_ca_mensuel.sqlClaude peut aussi l'invoquer tout seul si ta description est bien écrite.
Méthode 2 — Mention explicite (garantit l'exécution)
La documentation donne la syntaxe avec une mention @ :
@"auditeur-sql (agent)" relis la requete que je viens d'ecrireOu la forme manuelle : @agent-auditeur-sql pour un sous-agent local, @agent-mon-plugin:auditeur-sql pour un sous-agent venant d'un plugin.
Méthode 3 — Sous-agent par défaut pour toute la session
En ligne de commande :
claude --agent auditeur-sql⚠️ Avec
--agent, c'est toute la session qui prend le rôle, les outils et le modèle du sous-agent. Sauf si le corps du fichier est vide, son prompt remplace le prompt système par défaut de Claude Code.
Ou dans .claude/settings.json :
{
"agent": "auditeur-sql"
}Définir un sous-agent pour une seule session
Sans créer de fichier, avec l'option --agents qui prend du JSON :
claude --agents '{
"auditeur-sql": {
"description": "Relit une requete SQL avant production",
"prompt": "Tu es relecteur SQL senior. Tu ne modifies jamais de fichier.",
"tools": ["Read", "Grep", "Glob"],
"model": "sonnet"
}
}'Sous Windows PowerShell, ces guillemets simples ne passent pas. La documentation donne cette forme, avec un here-string (le
'@de fin doit être collé à la marge, colonne 0) :
claude --agents @'
{
"auditeur-sql": {
"description": "Relit une requete SQL avant production",
"prompt": "Tu es relecteur SQL senior. Tu ne modifies jamais de fichier.",
"tools": ["Read", "Grep", "Glob"],
"model": "sonnet"
}
}
'@En mode non interactif, l'option accepte aussi un chemin de fichier :
claude -p --agents ./agents.json "Relis models/marts/mart_ca_mensuel.sql"6. AVANT / APRÈS : écrire un bon sous-agent
❌ AVANT
---
name: sql-helper
description: Aide avec le SQL
---
Tu es un expert SQL. Aide l'utilisateur.Trois problèmes :
descriptiontrop vague : Claude ne saura jamais quand l'appeler.- Pas de
tools: le sous-agent hérite de tout, y comprisEdit,WriteetBash. Un « helper » peut donc écraser un fichier. - Prompt système creux : « expert SQL » ne dit rien. Le sous-agent ne fera pas mieux que la conversation principale.
✅ APRÈS
---
name: auditeur-sql
description: Relit une requete SQL avant production. A utiliser des qu'une requete est ecrite ou modifiee, et avant tout merge sur un modele dbt.
tools: Read, Grep, Glob
model: sonnet
---
Tu es relecteur SQL senior sur un entrepot PostgreSQL + dbt.
Tu ne modifies jamais de fichier : tu produis un rapport.
Tu verifies dans cet ordre : granularite du resultat, jointures,
pieges de NULL, performance, conventions.
Format de sortie : Verdict / Problemes par gravite / Requete de controle.Pourquoi c'est mieux
| Changement | Effet mesurable |
|---|---|
| Description qui nomme les déclencheurs | Claude l'invoque automatiquement au bon moment |
tools limité en lecture seule | Impossible de casser un fichier, même par erreur |
| Prompt qui liste un ordre de vérification | Résultat stable d'une fois sur l'autre |
| Format de sortie imposé | Tu relis en 30 secondes au lieu de 5 minutes |
7. Template de fichier de sous-agent
Copie ce fichier, remplis les crochets, enregistre-le dans .claude/agents/.
---
name: [NOM_EN_MINUSCULES_AVEC_TIRETS]
description: [CE_QUE_FAIT_LE_SOUS_AGENT]. A utiliser quand [DECLENCHEUR_1], [DECLENCHEUR_2].
tools: [Read, Grep, Glob]
model: [sonnet | haiku | opus | inherit]
color: [blue | green | orange | purple | cyan]
---
Tu es [ROLE_PRECIS] sur [CONTEXTE_TECHNIQUE : STACK, BASE, FRAMEWORK].
Tu ne [INTERDIT_PRINCIPAL : MODIFIES JAMAIS DE FICHIER / N'EXECUTES JAMAIS EN PROD].
## Ce que tu verifies, dans cet ordre
1. **[POINT_DE_CONTROLE_1]**
[DETAIL_ET_PIEGE_CONNU]
2. **[POINT_DE_CONTROLE_2]**
[DETAIL_ET_PIEGE_CONNU]
3. **[POINT_DE_CONTROLE_3]**
[DETAIL_ET_PIEGE_CONNU]
## Format de sortie obligatoire
### Verdict
[VALEUR_1] / [VALEUR_2] / [VALEUR_3]
### [SECTION_DETAIL]
[STRUCTURE_ATTENDUE : TABLEAU, LISTE NUMEROTEE...]
### [SECTION_VERIFICATION]
[COMMENT_L_UTILISATEUR_VERIFIE_QUE_C_EST_BON]
## Regles
- [REGLE_1 : CE QU'IL FAIT QUAND IL MANQUE UNE INFO]
- [REGLE_2 : LIMITE DE LONGUEUR DE LA REPONSE]
- [REGLE_3 : CE QU'IL NE DOIT JAMAIS FAIRE]8. Dépannage
La documentation liste les raisons pour lesquelles un fichier de sous-agent est ignoré :
- Pas de champ
name. - Les
---d'ouverture ne sont pas sur la première ligne. - Le
namecommence par-ou contient:. - Un
namesansdescription. - Le YAML ne se parse pas.
Commande de validation donnée par la documentation :
claude plugin validate .claude/agentsDeux autres réflexes : /doctor signale les noms en double dans un même répertoire, et claude --debug affiche le journal où Claude Code écrit la raison exacte pour laquelle un fichier a été ignoré.
Et si le fichier est valide mais n'apparaît jamais : Claude Code surveille ~/.claude/agents/ et .claude/agents/, et repère un fichier nouveau ou modifié en quelques secondes, sans redémarrage. La documentation donne la cause numéro un quand ça ne marche pas (« This is the most common cause ») : la surveillance ne couvre que les répertoires qui existaient au démarrage de la session. Si tu viens de créer le dossier .claude/agents/, redémarre la session pour que le premier fichier soit vu.
Les autres causes listées : un name déjà utilisé par un autre sous-agent, un frontmatter invalide, ou un fichier posé dans un dossier ajouté avec --add-dir (ces dossiers sont chargés mais pas surveillés).
Et si Claude n'appelle pas ton sous-agent tout seul : nomme-le explicitement dans ton prompt, et réécris sa description pour qu'elle dise clairement quand l'utiliser.
À retenir
- Le bénéfice numéro un d'un sous-agent, c'est le contexte isolé : il lit 30 fichiers, tu reçois 15 lignes.
- Le champ
toolsest une vraie barrière : un outil absent n'existe pas dans la session du sous-agent. - Seuls
nameetdescriptionsont obligatoires, mais ladescriptiondétermine si Claude pense à l'appeler. - Un sous-agent ne voit pas l'historique de ta conversation : mets tout ce qu'il doit savoir dans le message de délégation.
.claude/agents/pour l'équipe (à commiter),~/.claude/agents/pour toi.- Un sous-agent sans format de sortie imposé te fera perdre autant de temps qu'il t'en fait gagner.
Sources
- Subagents — Claude Code Docs
- Subagents in the SDK — Claude Code Docs
- How the agent loop works — Claude Code Docs
- VoltAgent/awesome-claude-code-subagents — plus de 160 fichiers de sous-agents Claude Code en markdown brut, à lire pour comparer les frontmatters et les prompts système (
categories/01-core-development/backend-developer.md) - wshobson/agents — catalogue d'agents avec le modèle assigné à chacun, utile pour voir quand on met du Haiku plutôt que de l'Opus (
docs/agents.md)