IAMaîtriser l'IA générative Plan du corpus
Accueil/Agents et sous-agents/Les sous-agents dans Claude Code

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-assistant subagent 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é :

EmplacementPortéePriorité
Réglages gérés par l'organisationToute l'organisation1 (la plus forte)
Option --agents en ligne de commandeLa session en cours2
.claude/agents/Le projet en cours3
~/.claude/agents/Tous tes projets4
Dossier agents/ d'un pluginLà 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.

ChampObligatoireÀ quoi ça sert
nameOuiIdentifiant unique. Ne peut pas contenir : ni commencer par -. Le nom de fichier n'a pas besoin de correspondre
descriptionOuiDit à 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
toolsNonListe 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
disallowedToolsNonOutils à retirer. Même format. Appliqué avant tools
modelNonsonnet, opus, haiku, fable, un identifiant complet, ou inherit
permissionModeNondefault, acceptEdits, auto, dontAsk, bypassPermissions, plan ou manual
maxTurnsNonNombre maximum de tours avant arrêt. La sortie est alors marquée comme partielle
skillsNonSkills à précharger dans le contexte au démarrage
mcpServersNonServeurs MCP accessibles à ce sous-agent
memoryNonMémoire persistante : user, project ou local
backgroundNontrue pour garder ce sous-agent en arrière-plan même quand Claude veut son résultat tout de suite
isolationNonworktree : le sous-agent travaille dans une copie Git temporaire, à l'écart de ton dossier de travail
hooksNonHooks de cycle de vie propres à ce sous-agent
effortNonlow, medium, high, xhigh, max
colorNonCouleur d'affichage : red, blue, green, yellow, purple, orange, pink, cyan
omitClaudeMdNontrue pour démarrer sans les fichiers CLAUDE.md

⚠️ Le champ description est 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 :

ChoixRaison
tools: Read, Grep, GlobAucun Edit, aucun Write, aucun Bash. Il est incapable de modifier ou d'exécuter quoi que ce soit
model: sonnetLa relecture SQL n'a pas besoin du modèle le plus coûteux
Description qui liste les déclencheursClaude 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.sql

Claude 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'ecrire

Ou 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 :

  1. description trop vague : Claude ne saura jamais quand l'appeler.
  2. Pas de tools : le sous-agent hérite de tout, y compris Edit, Write et Bash. Un « helper » peut donc écraser un fichier.
  3. 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

ChangementEffet mesurable
Description qui nomme les déclencheursClaude l'invoque automatiquement au bon moment
tools limité en lecture seuleImpossible de casser un fichier, même par erreur
Prompt qui liste un ordre de vérificationRé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 name commence par - ou contient :.
  • Un name sans description.
  • Le YAML ne se parse pas.

Commande de validation donnée par la documentation :

claude plugin validate .claude/agents

Deux 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 tools est une vraie barrière : un outil absent n'existe pas dans la session du sous-agent.
  • Seuls name et description sont obligatoires, mais la description dé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

Corpus personnel de formation · genere le 26/09/2026 · source : 02-subagents-claude-code.md