agent-sdk/agent-loop.md +395 −0 created
1> ## Documentation Index
2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
3> Use this file to discover all available pages before exploring further.
4
5# Fonctionnement de la boucle d'agent
6
7> Comprenez le cycle de vie des messages, l'exécution des outils, la fenêtre de contexte et l'architecture qui alimentent vos agents SDK.
8
9Le SDK Agent vous permet d'intégrer la boucle d'agent autonome de Claude Code dans vos propres applications. Le SDK est un package autonome qui vous donne un contrôle programmatique sur les outils, les permissions, les limites de coûts et la sortie. Vous n'avez pas besoin d'avoir l'interface de ligne de commande Claude Code installée pour l'utiliser.
10
11Lorsque vous démarrez un agent, le SDK exécute la même [boucle d'exécution qui alimente Claude Code](/fr/how-claude-code-works#the-agentic-loop) : Claude évalue votre prompt, appelle les outils pour agir, reçoit les résultats et répète jusqu'à ce que la tâche soit terminée. Cette page explique ce qui se passe à l'intérieur de cette boucle afin que vous puissiez construire, déboguer et optimiser vos agents efficacement.
12
13## La boucle en un coup d'œil
14
15Chaque session d'agent suit le même cycle :
16
17<img src="https://mintcdn.com/claude-code/gvy2DIUELtNA8qD3/images/agent-loop-diagram.svg?fit=max&auto=format&n=gvy2DIUELtNA8qD3&q=85&s=192e1bd6c8a2950a16e5ee0b94e27e26" alt="Boucle d'agent : le prompt entre, Claude évalue, se divise en appels d'outils ou réponse finale" width="680" height="150" data-path="images/agent-loop-diagram.svg" />
18
191. **Recevoir le prompt.** Claude reçoit votre prompt, ainsi que le prompt système, les définitions d'outils et l'historique de conversation. Le SDK produit un [`SystemMessage`](#message-types) avec le sous-type `"init"` contenant les métadonnées de session.
202. **Évaluer et répondre.** Claude évalue l'état actuel et détermine comment procéder. Il peut répondre avec du texte, demander un ou plusieurs appels d'outils, ou les deux. Le SDK produit un [`AssistantMessage`](#message-types) contenant le texte et toutes les demandes d'appels d'outils.
213. **Exécuter les outils.** Le SDK exécute chaque outil demandé et collecte les résultats. Chaque ensemble de résultats d'outils est renvoyé à Claude pour la décision suivante. Vous pouvez utiliser des [hooks](/fr/agent-sdk/hooks) pour intercepter, modifier ou bloquer les appels d'outils avant qu'ils ne s'exécutent.
224. **Répéter.** Les étapes 2 et 3 se répètent en cycle. Chaque cycle complet est un tour. Claude continue à appeler les outils et à traiter les résultats jusqu'à ce qu'il produise une réponse sans appels d'outils.
235. **Retourner le résultat.** Le SDK produit un [`AssistantMessage`](#message-types) final avec la réponse textuelle (sans appels d'outils), suivi d'un [`ResultMessage`](#message-types) avec le texte final, l'utilisation des tokens, le coût et l'ID de session.
24
25Une question rapide (« quels fichiers sont ici ? ») peut prendre un ou deux tours d'appel de `Glob` et de réponse avec les résultats. Une tâche complexe (« refactorisez le module d'authentification et mettez à jour les tests ») peut enchaîner des dizaines d'appels d'outils sur plusieurs tours, en lisant des fichiers, en modifiant du code et en exécutant des tests, avec Claude ajustant son approche en fonction de chaque résultat.
26
27## Tours et messages
28
29Un tour est un aller-retour dans la boucle : Claude produit une sortie qui inclut des appels d'outils, le SDK exécute ces outils, et les résultats sont renvoyés à Claude automatiquement. Cela se produit sans rendre le contrôle à votre code. Les tours continuent jusqu'à ce que Claude produise une sortie sans appels d'outils, auquel point la boucle se termine et le résultat final est livré.
30
31Considérez ce qu'une session complète pourrait ressembler pour le prompt « Corrigez les tests défaillants dans auth.ts ».
32
33D'abord, le SDK envoie votre prompt à Claude et produit un [`SystemMessage`](#message-types) avec les métadonnées de session. Ensuite, la boucle commence :
34
351. **Tour 1 :** Claude appelle `Bash` pour exécuter `npm test`. Le SDK produit un [`AssistantMessage`](#message-types) avec l'appel d'outil, exécute la commande, puis produit un [`UserMessage`](#message-types) avec la sortie (trois défaillances).
362. **Tour 2 :** Claude appelle `Read` sur `auth.ts` et `auth.test.ts`. Le SDK retourne le contenu des fichiers et produit un `AssistantMessage`.
373. **Tour 3 :** Claude appelle `Edit` pour corriger `auth.ts`, puis appelle `Bash` pour relancer `npm test`. Les trois tests réussissent. Le SDK produit un `AssistantMessage`.
384. **Tour final :** Claude produit une réponse textuelle uniquement sans appels d'outils : « Correction du bug d'authentification, les trois tests réussissent maintenant. » Le SDK produit un `AssistantMessage` final avec ce texte, puis un [`ResultMessage`](#message-types) avec le même texte plus le coût et l'utilisation.
39
40C'était quatre tours : trois avec des appels d'outils, un final avec réponse textuelle uniquement.
41
42Vous pouvez limiter la boucle avec `max_turns` / `maxTurns`, qui compte uniquement les tours d'utilisation d'outils. Par exemple, `max_turns=2` dans la boucle ci-dessus aurait arrêté avant l'étape d'édition. Vous pouvez également utiliser `max_budget_usd` / `maxBudgetUsd` pour limiter les tours en fonction d'un seuil de dépense.
43
44Sans limites, la boucle s'exécute jusqu'à ce que Claude termine de lui-même, ce qui est correct pour les tâches bien délimitées mais peut s'exécuter longtemps sur des prompts ouverts (« améliorez cette base de code »). Définir un budget est une bonne valeur par défaut pour les agents de production. Voir [Tours et budget](#turns-and-budget) ci-dessous pour la référence des options.
45
46## Types de messages
47
48Lorsque la boucle s'exécute, le SDK produit un flux de messages. Chaque message porte un type qui vous indique à quel stade de la boucle il provient. Les cinq types principaux sont :
49
50* **`SystemMessage` :** événements du cycle de vie de la session. Le champ `subtype` les distingue : `"init"` est le premier message (métadonnées de session), et `"compact_boundary"` se déclenche après [compaction](#automatic-compaction). En TypeScript, la limite de compaction est son propre type [`SDKCompactBoundaryMessage`](/fr/agent-sdk/typescript#sdkcompactboundarymessage) plutôt qu'un sous-type de `SDKSystemMessage`.
51* **`AssistantMessage` :** émis après chaque réponse de Claude, y compris la réponse textuelle finale. Contient les blocs de contenu textuel et les blocs d'appels d'outils de ce tour.
52* **`UserMessage` :** émis après chaque exécution d'outil avec le résultat d'outil renvoyé à Claude. Également émis pour toute entrée utilisateur que vous diffusez en boucle.
53* **`StreamEvent` :** émis uniquement lorsque les messages partiels sont activés. Contient les événements de diffusion API bruts (deltas de texte, chunks d'entrée d'outil). Voir [Réponses en flux](/fr/agent-sdk/streaming-output).
54* **`ResultMessage` :** marque la fin de la boucle d'agent. Contient le résultat textuel final, l'utilisation des tokens, le coût et l'ID de session. Vérifiez le champ `subtype` pour déterminer si la tâche a réussi ou a atteint une limite. Un petit nombre d'événements système de fin, tels que `prompt_suggestion`, peuvent arriver après, donc itérez le flux jusqu'à la fin plutôt que de vous arrêter au résultat. Voir [Gérer le résultat](#handle-the-result).
55
56Ces cinq types couvrent le cycle de vie complet de la boucle d'agent dans les deux SDK. Le SDK TypeScript produit également des événements d'observabilité supplémentaires (événements de hooks, progression des outils, limites de débit, notifications de tâches) qui fournissent des détails supplémentaires mais ne sont pas nécessaires pour piloter la boucle. Voir la [référence des types de messages Python](/fr/agent-sdk/python#message-types) et la [référence des types de messages TypeScript](/fr/agent-sdk/typescript#message-types) pour les listes complètes.
57
58### Gérer les messages
59
60Les messages que vous gérez dépendent de ce que vous construisez :
61
62* **Résultats finaux uniquement :** gérez `ResultMessage` pour obtenir la sortie, le coût et si la tâche a réussi ou a atteint une limite.
63* **Mises à jour de progression :** gérez `AssistantMessage` pour voir ce que Claude fait à chaque tour, y compris les outils qu'il a appelés.
64* **Diffusion en direct :** activez les messages partiels (`include_partial_messages` en Python, `includePartialMessages` en TypeScript) pour obtenir les messages `StreamEvent` en temps réel. Voir [Réponses en flux en temps réel](/fr/agent-sdk/streaming-output).
65
66La façon dont vous vérifiez les types de messages dépend du SDK :
67
68* **Python :** vérifiez les types de messages avec `isinstance()` par rapport aux classes importées de `claude_agent_sdk` (par exemple, `isinstance(message, ResultMessage)`).
69* **TypeScript :** vérifiez le champ de chaîne `type` (par exemple, `message.type === "result"`). `AssistantMessage` et `UserMessage` enveloppent le message API brut dans un champ `.message`, donc les blocs de contenu sont à `message.message.content`, pas `message.content`.
70
71<Accordion title="Exemple : Vérifier les types de messages et gérer les résultats">
72 <CodeGroup>
73 ```python Python theme={null}
74 from claude_agent_sdk import query, AssistantMessage, ResultMessage
75
76 async for message in query(prompt="Summarize this project"):
77 if isinstance(message, AssistantMessage):
78 print(f"Turn completed: {len(message.content)} content blocks")
79 if isinstance(message, ResultMessage):
80 if message.subtype == "success":
81 print(message.result)
82 else:
83 print(f"Stopped: {message.subtype}")
84 ```
85
86 ```typescript TypeScript theme={null}
87 import { query } from "@anthropic-ai/claude-agent-sdk";
88
89 for await (const message of query({ prompt: "Summarize this project" })) {
90 if (message.type === "assistant") {
91 console.log(`Turn completed: ${message.message.content.length} content blocks`);
92 }
93 if (message.type === "result") {
94 if (message.subtype === "success") {
95 console.log(message.result);
96 } else {
97 console.log(`Stopped: ${message.subtype}`);
98 }
99 }
100 }
101 ```
102 </CodeGroup>
103</Accordion>
104
105## Exécution des outils
106
107Les outils donnent à votre agent la capacité d'agir. Sans outils, Claude ne peut que répondre avec du texte. Avec les outils, Claude peut lire des fichiers, exécuter des commandes, rechercher du code et interagir avec des services externes.
108
109### Outils intégrés
110
111Le SDK inclut les mêmes outils qui alimentent Claude Code :
112
113| Catégorie | Outils | Ce qu'ils font |
114| :-------------------------- | :----------------------------------------------- | :--------------------------------------------------------------------------------------------- |
115| **Opérations sur fichiers** | `Read`, `Edit`, `Write` | Lire, modifier et créer des fichiers |
116| **Recherche** | `Glob`, `Grep` | Trouver des fichiers par motif, rechercher du contenu avec regex |
117| **Exécution** | `Bash` | Exécuter des commandes shell, des scripts, des opérations git |
118| **Web** | `WebSearch`, `WebFetch` | Rechercher le web, récupérer et analyser des pages |
119| **Découverte** | `ToolSearch` | Trouver et charger dynamiquement les outils à la demande au lieu de les précharger tous |
120| **Orchestration** | `Agent`, `Skill`, `AskUserQuestion`, `TodoWrite` | Générer des sous-agents, invoquer des compétences, demander à l'utilisateur, suivre les tâches |
121
122Au-delà des outils intégrés, vous pouvez :
123
124* **Connecter des services externes** avec des [serveurs MCP](/fr/agent-sdk/mcp) (bases de données, navigateurs, API)
125* **Définir des outils personnalisés** avec des [gestionnaires d'outils personnalisés](/fr/agent-sdk/custom-tools)
126* **Charger les compétences du projet** via des [sources de paramètres](/fr/agent-sdk/claude-code-features) pour des flux de travail réutilisables
127
128### Permissions des outils
129
130Claude détermine les outils à appeler en fonction de la tâche, mais vous contrôlez si ces appels sont autorisés à s'exécuter. Vous pouvez approuver automatiquement des outils spécifiques, en bloquer d'autres entièrement, ou exiger une approbation pour tout. Trois options fonctionnent ensemble pour déterminer ce qui s'exécute :
131
132* **`allowed_tools` / `allowedTools`** approuve automatiquement les outils listés. Un agent en lecture seule avec `["Read", "Glob", "Grep"]` dans sa liste d'outils autorisés exécute ces outils sans demander. Les outils non listés sont toujours disponibles mais nécessitent une permission.
133* **`disallowed_tools` / `disallowedTools`** bloque les outils listés, indépendamment des autres paramètres. Voir [Permissions](/fr/agent-sdk/permissions) pour l'ordre dans lequel les règles sont vérifiées avant qu'un outil s'exécute.
134* **`permission_mode` / `permissionMode`** contrôle ce qui se passe pour les outils qui ne sont pas couverts par les règles d'autorisation ou de refus. Voir [Mode de permission](#permission-mode) pour les modes disponibles.
135
136Vous pouvez également délimiter les outils individuels avec des règles comme `"Bash(npm *)"` pour autoriser uniquement des commandes spécifiques. Voir [Permissions](/fr/agent-sdk/permissions) pour la syntaxe complète des règles.
137
138Lorsqu'un outil est refusé, Claude reçoit un message de rejet comme résultat d'outil et tente généralement une approche différente ou signale qu'il ne pouvait pas procéder.
139
140### Exécution parallèle des outils
141
142Lorsque Claude demande plusieurs appels d'outils en un seul tour, les deux SDK peuvent les exécuter de manière concurrente ou séquentielle selon l'outil. Les outils en lecture seule (comme `Read`, `Glob`, `Grep` et les outils MCP marqués comme en lecture seule) peuvent s'exécuter de manière concurrente. Les outils qui modifient l'état (comme `Edit`, `Write` et `Bash`) s'exécutent séquentiellement pour éviter les conflits.
143
144Les outils personnalisés s'exécutent par défaut de manière séquentielle. Pour activer l'exécution parallèle pour un outil personnalisé, définissez `readOnlyHint` dans ses annotations. Les deux SDK [TypeScript](/fr/agent-sdk/typescript#tool) et [Python](/fr/agent-sdk/python#tool) utilisent ce nom de champ du SDK MCP.
145
146## Contrôler le fonctionnement de la boucle
147
148Vous pouvez limiter le nombre de tours que la boucle prend, combien elle coûte, la profondeur du raisonnement de Claude et si les outils nécessitent une approbation avant de s'exécuter. Tous ces éléments sont des champs sur [`ClaudeAgentOptions`](/fr/agent-sdk/python#claudeagentoptions) (Python) / [`Options`](/fr/agent-sdk/typescript#options) (TypeScript).
149
150### Tours et budget
151
152| Option | Ce qu'elle contrôle | Valeur par défaut |
153| :--------------------------------------------- | :------------------------------------------- | :---------------- |
154| Tours max (`max_turns` / `maxTurns`) | Aller-retours maximum d'utilisation d'outils | Pas de limite |
155| Budget max (`max_budget_usd` / `maxBudgetUsd`) | Coût maximum avant arrêt | Pas de limite |
156
157Lorsque l'une de ces limites est atteinte, le SDK retourne un `ResultMessage` avec un sous-type d'erreur correspondant (`error_max_turns` ou `error_max_budget_usd`). Voir [Gérer le résultat](#handle-the-result) pour savoir comment vérifier ces sous-types et [`ClaudeAgentOptions`](/fr/agent-sdk/python#claudeagentoptions) / [`Options`](/fr/agent-sdk/typescript#options) pour la syntaxe.
158
159### Niveau d'effort
160
161L'option `effort` contrôle la profondeur du raisonnement que Claude applique. Les niveaux d'effort inférieur utilisent moins de tokens par tour et réduisent le coût. Tous les modèles ne supportent pas le paramètre d'effort. Voir [Effort](https://platform.claude.com/docs/fr/build-with-claude/effort) pour savoir quels modèles le supportent.
162
163| Niveau | Comportement | Bon pour |
164| :--------- | :------------------------------------- | :--------------------------------------------------------- |
165| `"low"` | Raisonnement minimal, réponses rapides | Recherches de fichiers, listage de répertoires |
166| `"medium"` | Raisonnement équilibré | Éditions de routine, tâches standard |
167| `"high"` | Analyse approfondie | Refactorisations, débogage |
168| `"xhigh"` | Profondeur de raisonnement étendue | Tâches de codage et d'agent ; recommandé sur Opus 4.7 |
169| `"max"` | Profondeur de raisonnement maximale | Problèmes multi-étapes nécessitant une analyse approfondie |
170
171Si vous ne définissez pas `effort`, le SDK Python laisse le paramètre non défini et s'en remet au comportement par défaut du modèle. Le SDK TypeScript utilise par défaut `"high"`.
172
173<Note>
174 `effort` échange la latence et le coût des tokens pour la profondeur du raisonnement dans chaque réponse. [Extended thinking](https://platform.claude.com/docs/fr/build-with-claude/extended-thinking) est une fonctionnalité distincte qui produit des blocs de chaîne de pensée visibles dans la sortie. Ils sont indépendants : vous pouvez définir `effort: "low"` avec extended thinking activé, ou `effort: "max"` sans lui.
175</Note>
176
177Utilisez un effort inférieur pour les agents effectuant des tâches simples et bien délimitées (comme lister des fichiers ou exécuter un seul grep) pour réduire le coût et la latence. Définissez `effort` dans les options de niveau supérieur `query()` pour la session entière, ou par sous-agent avec le champ `effort` sur [`AgentDefinition`](/fr/agent-sdk/subagents#agentdefinition-configuration) pour remplacer le niveau de session.
178
179### Mode de permission
180
181L'option de mode de permission (`permission_mode` en Python, `permissionMode` en TypeScript) contrôle si l'agent demande une approbation avant d'utiliser les outils :
182
183| Mode | Comportement |
184| :------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
185| `"default"` | Les outils non couverts par les règles d'autorisation déclenchent votre rappel d'approbation ; pas de rappel signifie refuser |
186| `"acceptEdits"` | Approuve automatiquement les éditions de fichiers et les commandes communes du système de fichiers (`mkdir`, `touch`, `mv`, `cp`, etc.) ; les autres commandes Bash suivent les règles par défaut |
187| `"plan"` | Les outils en lecture seule s'exécutent ; Claude explore et produit un plan sans éditer vos fichiers source |
188| `"dontAsk"` | Ne demande jamais. Les outils pré-approuvés par les [règles de permission](/fr/settings#permission-settings) s'exécutent, tout le reste est refusé |
189| `"auto"` (TypeScript uniquement) | Utilise un classificateur de modèle pour approuver ou refuser chaque appel d'outil. Voir [Mode auto](/fr/permission-modes#eliminate-prompts-with-auto-mode) pour la disponibilité et le comportement |
190| `"bypassPermissions"` | Exécute tous les outils autorisés sans demander. Ne peut pas être utilisé lors de l'exécution en tant que root sur Unix. À utiliser uniquement dans des environnements isolés où les actions de l'agent ne peuvent pas affecter les systèmes qui vous intéressent |
191
192Pour les applications interactives, utilisez `"default"` avec un rappel d'approbation d'outil pour afficher les invites d'approbation. Pour les agents autonomes sur une machine de développement, `"acceptEdits"` approuve automatiquement les éditions de fichiers et les commandes communes du système de fichiers (`mkdir`, `touch`, `mv`, `cp`, etc.) tout en gardant les autres commandes `Bash` derrière les règles d'autorisation. Réservez `"bypassPermissions"` pour CI, les conteneurs ou d'autres environnements isolés. Voir [Permissions](/fr/agent-sdk/permissions) pour les détails complets.
193
194### Modèle
195
196Si vous ne définissez pas `model`, le SDK utilise la valeur par défaut de Claude Code, qui dépend de votre méthode d'authentification et de votre abonnement. Définissez-le explicitement (par exemple, `model="claude-sonnet-4-6"`) pour épingler un modèle spécifique ou pour utiliser un modèle plus petit pour des agents plus rapides et moins chers. Voir [modèles](https://platform.claude.com/docs/fr/about-claude/models) pour les ID disponibles.
197
198## La fenêtre de contexte
199
200La fenêtre de contexte est la quantité totale d'informations disponibles pour Claude pendant une session. Elle ne se réinitialise pas entre les tours au sein d'une session. Tout s'accumule : le prompt système, les définitions d'outils, l'historique de conversation, les entrées d'outils et les sorties d'outils. Le contenu qui reste le même entre les tours (prompt système, définitions d'outils, CLAUDE.md) est automatiquement [mis en cache par prompt](https://platform.claude.com/docs/fr/build-with-claude/prompt-caching), ce qui réduit le coût et la latence pour les préfixes répétés.
201
202### Ce qui consomme du contexte
203
204Voici comment chaque composant affecte le contexte dans le SDK :
205
206| Source | Quand elle se charge | Impact |
207| :------------------------------ | :------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
208| **Prompt système** | Chaque requête | Petit coût fixe, toujours présent |
209| **Fichiers CLAUDE.md** | Démarrage de session, via [`settingSources`](/fr/agent-sdk/claude-code-features) | Contenu complet dans chaque requête (mais mis en cache par prompt, donc seule la première requête paie le coût complet) |
210| **Définitions d'outils** | Chaque requête | Chaque outil ajoute son schéma ; utilisez la [recherche d'outils MCP](/fr/agent-sdk/mcp#mcp-tool-search) pour charger les outils à la demande au lieu de tous à la fois |
211| **Historique de conversation** | S'accumule au fil des tours | Croît avec chaque tour : prompts, réponses, entrées d'outils, sorties d'outils |
212| **Descriptions de compétences** | Démarrage de session, via sources de paramètres | Résumés courts ; le contenu complet se charge uniquement lors de l'invocation |
213
214Les grandes sorties d'outils consomment un contexte significatif. Lire un gros fichier ou exécuter une commande avec une sortie détaillée peut utiliser des milliers de tokens en un seul tour. Le contexte s'accumule au fil des tours, donc les sessions plus longues avec de nombreux appels d'outils accumulent beaucoup plus de contexte que les courtes.
215
216### Compaction automatique
217
218Lorsque la fenêtre de contexte approche de sa limite, le SDK compacte automatiquement la conversation : il résume l'historique plus ancien pour libérer de l'espace, en gardant vos échanges les plus récents et les décisions clés intacts. Le SDK émet un message avec `type: "system"` et `subtype: "compact_boundary"` dans le flux lorsque cela se produit (en Python c'est un `SystemMessage` ; en TypeScript c'est un type `SDKCompactBoundaryMessage` distinct).
219
220La compaction remplace les messages plus anciens par un résumé, donc les instructions spécifiques du début de la conversation peuvent ne pas être préservées. Les règles persistantes appartiennent à CLAUDE.md (chargé via [`settingSources`](/fr/agent-sdk/claude-code-features)) plutôt qu'au prompt initial, car le contenu CLAUDE.md est réinjecté à chaque requête.
221
222Vous pouvez personnaliser le comportement de compaction de plusieurs façons :
223
224* **Instructions de résumé dans CLAUDE.md :** Le compacteur lit votre CLAUDE.md comme tout autre contexte, donc vous pouvez inclure une section lui indiquant ce qu'il faut préserver lors de la résumé. L'en-tête de section est libre (pas une chaîne magique) ; le compacteur correspond sur l'intention.
225* **Hook `PreCompact` :** Exécutez une logique personnalisée avant la compaction, par exemple pour archiver la transcription complète. Le hook reçoit un champ `trigger` (`manual` ou `auto`). Voir [hooks](/fr/agent-sdk/hooks).
226* **Compaction manuelle :** Envoyez `/compact` comme chaîne de prompt pour déclencher la compaction à la demande. (Les commandes slash envoyées de cette façon sont des entrées SDK, pas des raccourcis CLI uniquement. Voir [commandes slash dans le SDK](/fr/agent-sdk/slash-commands).)
227
228<Accordion title="Exemple : Instructions de résumé dans CLAUDE.md">
229 Ajoutez une section au CLAUDE.md de votre projet indiquant au compacteur ce qu'il faut préserver. Le nom d'en-tête n'est pas spécial ; utilisez n'importe quel label clair.
230
231 ```markdown CLAUDE.md theme={null}
232 # Summary instructions
233
234 When summarizing this conversation, always preserve:
235 - The current task objective and acceptance criteria
236 - File paths that have been read or modified
237 - Test results and error messages
238 - Decisions made and the reasoning behind them
239 ```
240</Accordion>
241
242### Garder le contexte efficace
243
244Quelques stratégies pour les agents de longue durée :
245
246* **Utilisez des sous-agents pour les sous-tâches.** Chaque sous-agent commence avec une conversation fraîche (pas d'historique de messages antérieurs, bien qu'il charge son propre prompt système et le contexte au niveau du projet comme CLAUDE.md). Il ne voit pas les tours du parent, et seule sa réponse finale retourne au parent comme résultat d'outil. Le contexte de l'agent principal croît par ce résumé, pas par la transcription complète de la sous-tâche. Voir [Ce que les sous-agents héritent](/fr/agent-sdk/subagents#what-subagents-inherit) pour les détails.
247* **Soyez sélectif avec les outils.** Chaque définition d'outil prend de l'espace de contexte. Utilisez le champ `tools` sur [`AgentDefinition`](/fr/agent-sdk/subagents#agentdefinition-configuration) pour délimiter les sous-agents à l'ensemble minimum dont ils ont besoin, et utilisez la [recherche d'outils MCP](/fr/agent-sdk/mcp#mcp-tool-search) pour charger les outils à la demande au lieu de les précharger tous.
248* **Surveillez les coûts des serveurs MCP.** Chaque serveur MCP ajoute tous ses schémas d'outils à chaque requête. Quelques serveurs avec de nombreux outils peuvent consommer un contexte significatif avant que l'agent ne fasse aucun travail. L'outil `ToolSearch` peut aider en chargeant les outils à la demande au lieu de les précharger tous. Voir [Recherche d'outils MCP](/fr/agent-sdk/mcp#mcp-tool-search) pour la configuration.
249* **Utilisez un effort inférieur pour les tâches de routine.** Définissez [effort](#effort-level) à `"low"` pour les agents qui n'ont besoin que de lire des fichiers ou de lister des répertoires. Cela réduit l'utilisation des tokens et le coût.
250
251Pour une ventilation détaillée des coûts de contexte par fonctionnalité, voir [Comprendre les coûts de contexte](/fr/features-overview#understand-context-costs).
252
253## Sessions et continuité
254
255Chaque interaction avec le SDK crée ou continue une session. Capturez l'ID de session de `ResultMessage.session_id` (disponible dans les deux SDK) pour reprendre plus tard. Le SDK TypeScript l'expose également comme un champ direct sur le `SystemMessage` init ; en Python, il est imbriqué dans `SystemMessage.data`.
256
257Lorsque vous reprenez, le contexte complet des tours précédents est restauré : les fichiers qui ont été lus, l'analyse qui a été effectuée et les actions qui ont été prises. Vous pouvez également forcer une session pour vous brancher dans une approche différente sans modifier l'original.
258
259Voir [Gestion des sessions](/fr/agent-sdk/sessions) pour le guide complet sur les modèles de reprise, de continuation et de bifurcation.
260
261<Note>
262 En Python, `ClaudeSDKClient` gère automatiquement les ID de session sur plusieurs appels. Voir la [référence du SDK Python](/fr/agent-sdk/python#choosing-between-query-and-claudesdkclient) pour les détails.
263</Note>
264
265## Gérer le résultat
266
267Lorsque la boucle se termine, le `ResultMessage` vous indique ce qui s'est passé et vous donne la sortie. Le champ `subtype` (disponible dans les deux SDK) est le moyen principal de vérifier l'état de terminaison.
268
269| Sous-type de résultat | Ce qui s'est passé | Champ `result` disponible ? |
270| :------------------------------------ | :------------------------------------------------------------------------------------------ | :-------------------------: |
271| `success` | Claude a terminé la tâche normalement | Oui |
272| `error_max_turns` | Limite de `maxTurns` atteinte avant la fin | Non |
273| `error_max_budget_usd` | Limite de `maxBudgetUsd` atteinte avant la fin | Non |
274| `error_during_execution` | Une erreur a interrompu la boucle (par exemple, une défaillance API ou une requête annulée) | Non |
275| `error_max_structured_output_retries` | La validation de la sortie structurée a échoué après la limite de tentatives configurée | Non |
276
277Le champ `result` (la sortie textuelle finale) n'est présent que sur la variante `success`, donc vérifiez toujours le sous-type avant de le lire. Tous les sous-types de résultat portent `total_cost_usd`, `usage`, `num_turns` et `session_id` afin que vous puissiez suivre le coût et reprendre même après des erreurs. En Python, `total_cost_usd` et `usage` sont typés comme optionnels et peuvent être `None` sur certains chemins d'erreur, donc gardez-les avant de les formater. Voir [Suivi des coûts et de l'utilisation](/fr/agent-sdk/cost-tracking) pour les détails sur l'interprétation des champs `usage`.
278
279Le résultat inclut également un champ `stop_reason` (`string | null` en TypeScript, `str | None` en Python) indiquant pourquoi le modèle a arrêté de générer sur son tour final. Les valeurs courantes sont `end_turn` (le modèle a terminé normalement), `max_tokens` (limite de token de sortie atteinte) et `refusal` (le modèle a refusé la requête). Sur les sous-types de résultat d'erreur, `stop_reason` porte la valeur de la dernière réponse d'assistant avant la fin de la boucle. Pour détecter les refus, vérifiez `stop_reason === "refusal"` (TypeScript) ou `stop_reason == "refusal"` (Python). Voir [`SDKResultMessage`](/fr/agent-sdk/typescript#sdkresultmessage) (TypeScript) ou [`ResultMessage`](/fr/agent-sdk/python#resultmessage) (Python) pour le type complet.
280
281## Hooks
282
283Les [Hooks](/fr/agent-sdk/hooks) sont des rappels qui se déclenchent à des points spécifiques de la boucle : avant qu'un outil s'exécute, après son retour, lorsque l'agent termine, et ainsi de suite. Certains hooks couramment utilisés sont :
284
285| Hook | Quand il se déclenche | Utilisations courantes |
286| :------------------------------- | :------------------------------------------- | :----------------------------------------------------- |
287| `PreToolUse` | Avant l'exécution d'un outil | Valider les entrées, bloquer les commandes dangereuses |
288| `PostToolUse` | Après le retour d'un outil | Auditer les sorties, déclencher des effets secondaires |
289| `UserPromptSubmit` | Quand un prompt est envoyé | Injecter du contexte supplémentaire dans les prompts |
290| `Stop` | Quand l'agent termine | Valider le résultat, sauvegarder l'état de la session |
291| `SubagentStart` / `SubagentStop` | Quand un sous-agent est généré ou se termine | Suivre et agréger les résultats des tâches parallèles |
292| `PreCompact` | Avant la compaction du contexte | Archiver la transcription complète avant la résumé |
293
294Les hooks s'exécutent dans le processus de votre application, pas à l'intérieur de la fenêtre de contexte de l'agent, donc ils ne consomment pas de contexte. Les hooks peuvent également court-circuiter la boucle : un hook `PreToolUse` qui rejette un appel d'outil l'empêche de s'exécuter, et Claude reçoit le message de rejet à la place.
295
296Les deux SDK supportent tous les événements ci-dessus. Le SDK TypeScript inclut des événements supplémentaires que Python ne supporte pas encore. Voir [Contrôler l'exécution avec des hooks](/fr/agent-sdk/hooks) pour la liste complète des événements, la disponibilité par SDK et l'API de rappel complète.
297
298## Tout mettre ensemble
299
300Cet exemple combine les concepts clés de cette page dans un seul agent qui corrige les tests défaillants. Il configure l'agent avec les outils autorisés (approuvés automatiquement afin que l'agent s'exécute de manière autonome), les paramètres du projet et les limites de sécurité sur les tours et l'effort de raisonnement. Lorsque la boucle s'exécute, elle capture l'ID de session pour une reprise potentielle, gère le résultat final et imprime le coût total.
301
302<CodeGroup>
303 ```python Python theme={null}
304 import asyncio
305 from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
306
307
308 async def run_agent():
309 session_id = None
310
311 async for message in query(
312 prompt="Find and fix the bug causing test failures in the auth module",
313 options=ClaudeAgentOptions(
314 allowed_tools=[
315 "Read",
316 "Edit",
317 "Bash",
318 "Glob",
319 "Grep",
320 ], # Listing tools here auto-approves them (no prompting)
321 setting_sources=[
322 "project"
323 ], # Load CLAUDE.md, skills, hooks from current directory
324 max_turns=30, # Prevent runaway sessions
325 effort="high", # Thorough reasoning for complex debugging
326 ),
327 ):
328 # Handle the final result
329 if isinstance(message, ResultMessage):
330 session_id = message.session_id # Save for potential resumption
331
332 if message.subtype == "success":
333 print(f"Done: {message.result}")
334 elif message.subtype == "error_max_turns":
335 # Agent ran out of turns. Resume with a higher limit.
336 print(f"Hit turn limit. Resume session {session_id} to continue.")
337 elif message.subtype == "error_max_budget_usd":
338 print("Hit budget limit.")
339 else:
340 print(f"Stopped: {message.subtype}")
341 if message.total_cost_usd is not None:
342 print(f"Cost: ${message.total_cost_usd:.4f}")
343
344
345 asyncio.run(run_agent())
346 ```
347
348 ```typescript TypeScript theme={null}
349 import { query } from "@anthropic-ai/claude-agent-sdk";
350
351 let sessionId: string | undefined;
352
353 for await (const message of query({
354 prompt: "Find and fix the bug causing test failures in the auth module",
355 options: {
356 allowedTools: ["Read", "Edit", "Bash", "Glob", "Grep"], // Listing tools here auto-approves them (no prompting)
357 settingSources: ["project"], // Load CLAUDE.md, skills, hooks from current directory
358 maxTurns: 30, // Prevent runaway sessions
359 effort: "high" // Thorough reasoning for complex debugging
360 }
361 })) {
362 // Save the session ID to resume later if needed
363 if (message.type === "system" && message.subtype === "init") {
364 sessionId = message.session_id;
365 }
366
367 // Handle the final result
368 if (message.type === "result") {
369 if (message.subtype === "success") {
370 console.log(`Done: ${message.result}`);
371 } else if (message.subtype === "error_max_turns") {
372 // Agent ran out of turns. Resume with a higher limit.
373 console.log(`Hit turn limit. Resume session ${sessionId} to continue.`);
374 } else if (message.subtype === "error_max_budget_usd") {
375 console.log("Hit budget limit.");
376 } else {
377 console.log(`Stopped: ${message.subtype}`);
378 }
379 console.log(`Cost: $${message.total_cost_usd.toFixed(4)}`);
380 }
381 }
382 ```
383</CodeGroup>
384
385## Étapes suivantes
386
387Maintenant que vous comprenez la boucle, voici où aller en fonction de ce que vous construisez :
388
389* **Vous n'avez pas encore exécuté un agent ?** Commencez par le [démarrage rapide](/fr/agent-sdk/quickstart) pour obtenir le SDK installé et voir un exemple complet s'exécutant de bout en bout.
390* **Prêt à vous connecter à votre projet ?** [Chargez CLAUDE.md, les compétences et les hooks du système de fichiers](/fr/agent-sdk/claude-code-features) afin que l'agent suive automatiquement les conventions de votre projet.
391* **Construisez une interface utilisateur interactive ?** Activez la [diffusion](/fr/agent-sdk/streaming-output) pour afficher le texte en direct et les appels d'outils lorsque la boucle s'exécute.
392* **Avez-vous besoin d'un contrôle plus strict sur ce que l'agent peut faire ?** Verrouillez l'accès aux outils avec les [permissions](/fr/agent-sdk/permissions) et utilisez les [hooks](/fr/agent-sdk/hooks) pour auditer, bloquer ou transformer les appels d'outils avant qu'ils ne s'exécutent.
393* **Exécutez des tâches longues ou coûteuses ?** Déléguez le travail isolé aux [sous-agents](/fr/agent-sdk/subagents) pour garder votre contexte principal maigre.
394
395Pour la vue d'ensemble conceptuelle plus large de la boucle d'agent (non spécifique au SDK), voir [Fonctionnement de Claude Code](/fr/how-claude-code-works).