AI Cert Prep
Saisissez un mot-clé pour rechercher dans la documentation.

Domaines

D3 · Agents and Workflows

Critères de décision workflow vs agent, la boucle agentique, subagents et hiérarchies, le Claude Agent SDK, agents managés vs auto-hébergés, hooks, memory, gestion du contexte, frameworks et terminaison sûre.

Ce domaine représente environ 8 items sur 53. Il vérifie que vous savez choisir entre un workflow fixe et un agent autonome, construire correctement la boucle agentique (pilotée par stop_reason, terminée en toute sécurité), structurer des subagents à contexte isolé, et utiliser le Claude Agent SDK et les hooks. Le thème récurrent : structure et déterminisme là où ça compte ; autonomie uniquement là où elle paie.

Objectifs d’apprentissage

À la fin de cette page, vous devriez être capable de :

  1. Décider entre un workflow et un agent, et choisir le bon pattern Anthropic.
  2. Implémenter la boucle agentique terminée par stop_reason, pas par des plafonds d’itérations.
  3. Concevoir des hiérarchies manager/superviseur et des subagents à contexte isolé.
  4. Utiliser le Claude Agent SDK (Python + TS) et ses options clés.
  5. Distinguer les Managed Agents (hébergés) des boucles/harnais auto-hébergés.
  6. Utiliser les hooks pour des actions déterministes, le memory tool, et gérer la fenêtre de contexte dans les agents longs.
  7. Positionner les frameworks (LangGraph, PydanticAI, CrewAI) et appliquer la terminaison sûre.

3.1 Workflow vs agent

  • Un workflow orchestre Claude et les outils via des chemins de code prédéfinis – prévisible, testable, bon marché.
  • Un agent laisse Claude diriger dynamiquement son propre processus et son usage des outils – flexible, mais moins prévisible et plus difficile à tester.

Préférez la chose la plus simple qui fonctionne : utilisez des workflows pour les tâches bien définies et répétables ; n’utilisez des agents que lorsque le chemin ne peut pas être prédit à l’avance.

SignalChoose
Étapes fixes, entrées/sorties connuesWorkflow
Branchement prévisibleWorkflow (routing)
Tâche ouverte, nombre d’étapes inconnuAgent
Besoin d’auditabilité et de faible coûtWorkflow
La tâche exige que le modèle décide du planAgent

3.2 The Anthropic ‘Building effective agents’ patterns

PatternWhat it isUse when
Prompt chainingLa sortie de l’étape N alimente l’étape N+1La tâche se décompose en sous-tâches séquentielles fixes
RoutingClasser l’entrée, aiguiller vers un chemin spécialiséDes catégories distinctes nécessitent des traitements différents
ParallelizationExécuter des sous-tâches en concurrence, agrégerSous-tâches indépendantes ou vote
Orchestrator-workersUn lead découpe le travail et délègue aux workersSous-tâches inconnues jusqu’à l’exécution
Evaluator-optimizerL’un génère, l’autre critique et raffineLa qualité s’améliore avec l’itération et des critères clairs
Autonomous agentLe modèle planifie et agit en boucle avec des outilsOuvert, chemin non prévisible

Signal d’examen

« Les étapes sont fixes » → chaining. « Différentes catégories » → routing. « Sous-tâches indépendantes / vote » → parallelization. « Un lead délègue dynamiquement » → orchestrator-workers. « Générer puis critiquer » → evaluator-optimizer. « Ouvert, décide de ses propres étapes » → autonomous agent.


3.3 The agentic loop

La boucle est : appeler le modèle → si stop_reason == 'tool_use', exécuter les outils, ajouter tool_result, rappeler → répéter jusqu’à end_turn.

python
def run_agent(client, messages, tools):
while True:
resp = client.messages.create(
model="claude-opus-5", max_tokens=2048, tools=tools, messages=messages)
messages.append({"role": "assistant", "content": resp.content})
if resp.stop_reason == "tool_use":
tool_results = []
for block in resp.content:
if block.type == "tool_use":
out = dispatch(block.name, block.input) # exécuter l'outil
tool_results.append({"type": "tool_result",
"tool_use_id": block.id, "content": out})
messages.append({"role": "user", "content": tool_results})
continue
return resp # end_turn / refusal / max_tokens gérés par l'appelant
text
┌─ model call ─┐
│ │ stop_reason == tool_use
│ Claude ────┼──────────────► run tool(s) ──► append tool_result ──┐
│ │ │
└──────────────┘◄────────────────────────────────────────────────── ┘
│ stop_reason == end_turn
▼
return

Terminaison sûre

Terminez sur stop_reason, pas sur un compte d’itérations arbitraire. Un plafond d’itérations est un filet de sécurité contre les boucles emballées, jamais le mécanisme d’arrêt principal (anti-patterns nº 1 et nº 2). Gérez aussi max_tokens, pause_turn et refusal.


3.4 Subagents and manager/supervisor hierarchies

Un agent manager (orchestrateur) décompose une tâche et délègue à des subagents, chacun avec sa propre fenêtre de contexte isolée, ses outils et son prompt système. Avantages :

  • Isolation du contexte – le travail intermédiaire bruité d’un subagent ne pollue pas le contexte du manager.
  • Spécialisation – chaque subagent a une liste blanche d’outils et un prompt focalisés.
  • Parallélisme – les subagents indépendants s’exécutent en concurrence.
text
┌──────────── Manager / Coordinator ────────────┐
│ plans, delegates, aggregates results │
└───┬───────────────┬───────────────┬───────────┘
▼ ▼ ▼
Subagent A Subagent B Subagent C
(own context) (own context) (own context)

Signal d’examen

« La recherche intermédiaire gonfle le contexte », « sous-tâches spécialisées », « exécuter des parties en parallèle » → subagents à contexte isolé sous un coordinateur.


3.5 The Claude Agent SDK

pip install claude-agent-sdk / npm install @anthropic-ai/claude-agent-sdk (renommé depuis le Claude Code SDK). Il fournit la boucle d’agent, la gestion des outils et le harnais de Claude Code.

python
import anyio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
options = ClaudeAgentOptions(
system_prompt="You are a careful coding assistant.",
allowed_tools=["Read", "Grep", "Edit"],
permission_mode="acceptEdits",
mcp_servers={"docs": {"command": "python", "args": ["docs_server.py"]}},
max_turns=8,
)
async for message in query(prompt="Fix the failing test in test_utils.py", options=options):
print(message)
anyio.run(main)

Options clés : allowed_tools (liste blanche – moindre privilège), permission_mode (default/acceptEdits/plan/bypassPermissions), system_prompt, mcp_servers, hooks (handlers déterministes), max_turns (filet de sécurité, pas la terminaison principale).


3.6 Managed vs self-hosted agents

Managed AgentsAgent SDK / Tool Runner (self-hosted)
Qui exécute la boucleAnthropic héberge boucle + sandboxVous hébergez
Contrôle sur l’environnementPlus faibleTotal
Charge opérationnelleMinimaleVous gérez infra, sandboxing, scaling
Idéal pourDémarrage rapide, tâches agentiques standardOutils personnalisés, environnements personnalisés, contrôle des données

Signal d’examen

« Nous voulons qu’Anthropic exécute le sandbox et la boucle » → Managed Agents. « Nous avons besoin de nos propres outils/environnement/contrôles de données » → auto-hébergé via l’Agent SDK.


3.7 Hooks, memory and context management

  • Les hooks sont des handlers déterministes shell/HTTP déclenchés à des points du cycle de vie (PreToolUse, PostToolUse, UserPromptSubmit, Stop, SessionStart, Notification, SubagentStop, PreCompact). Le code de sortie 2 bloque l’action. Utilisez-les pour imposer des règles qui ne doivent pas dépendre de la coopération du modèle.
  • Le memory tool persiste des informations entre sessions (notes durables, faits appris) plutôt que de les redériver à chaque exécution.
  • Gestion de la fenêtre de contexte dans les agents longs : purger les anciens résultats d’outils (édition de contexte), résumer en préservant le fil narratif (compaction), et déporter l’état durable vers la memory. Sans cela, les agents longs font exploser la fenêtre et le coût.
python
# Un hook PreToolUse qui bloque les commandes shell destructrices (exit 2 = bloquer)
# script du hook : lit du JSON sur stdin, sort avec 2 pour refuser
import json, sys
event = json.load(sys.stdin)
cmd = event.get("tool_input", {}).get("command", "")
if "rm -rf" in cmd:
print("Blocked: destructive command", file=sys.stderr)
sys.exit(2)
sys.exit(0)

Application déterministe

Les règles critiques (ne jamais supprimer, ne jamais dépenser, toujours approuver) relèvent des hooks, pas du prompt (anti-pattern nº 3). On ne peut pas dissuader un hook de bloquer ; une instruction de prompt, si.


3.8 Frameworks (positioning)

FrameworkPosition
Claude Agent SDKHarnais first-party d’Anthropic ; intégration Claude Code / outils la plus étroite
LangGraphOrchestration à base de graphe de nœuds/arêtes ; machines à états explicites
PydanticAISorties d’agent type-safe, validées par Pydantic en Python
CrewAI« Crews » multi-agents avec rôles et tâches

Les frameworks ajoutent orchestration et ergonomie ; ils ne changent pas les fondamentaux – vous pilotez toujours la boucle depuis stop_reason, imposez les règles critiques de manière déterministe, et gérez le contexte.


3.9 A complete agentic loop dispatching on every stop_reason

L’esquisse en 3.3 ne gère que tool_use et end_turn. Une boucle de production doit aiguiller sur chaque stop_reason : tool_use, end_turn, max_tokens, pause_turn, refusal (et stop_sequence). Le plafond d’itérations est un filet de sécurité, jamais l’arrêt principal.

python
from anthropic import Anthropic
client = Anthropic()
def run_agent(messages, tools, max_iters=25):
for _ in range(max_iters): # filet de sécurité seulement, pas l'arrêt principal
resp = client.messages.create(
model="claude-opus-5", max_tokens=4096, tools=tools, messages=messages)
messages.append({"role": "assistant", "content": resp.content})
if resp.stop_reason == "tool_use":
results = []
for block in resp.content:
if block.type == "tool_use":
out = dispatch(block.name, block.input) # exécuter l'outil
results.append({"type": "tool_result",
"tool_use_id": block.id, "content": out})
messages.append({"role": "user", "content": results})
continue
if resp.stop_reason == "pause_turn":
# outil serveur de longue durée en pause ; renvoyer pour reprendre
continue
if resp.stop_reason == "max_tokens":
# sortie tronquée — demander de continuer ou augmenter max_tokens ; ne pas traiter comme terminé
messages.append({"role": "user", "content": "Continue the previous response."})
continue
if resp.stop_reason == "refusal":
# modèle a décliné pour la sécurité ; remonter à un humain, ne pas réessayer aveuglément
return {"status": "refused", "response": resp}
if resp.stop_reason in ("end_turn", "stop_sequence"):
return {"status": "done", "response": resp}
raise RuntimeError("iteration backstop hit — investigate; loop did not reach end_turn")

Aiguillez sur le signal, pas sur la prose

Traiter max_tokens comme un achèvement tronque silencieusement le travail ; traiter refusal comme une erreur à réessayer aveuglément ignore un signal de sécurité ; ignorer pause_turn abandonne un outil serveur de longue durée. Analyser le texte de l’assistant à la recherche de « I am done » est l’anti-pattern nº 1. Branchez toujours sur stop_reason.


3.10 Orchestrator-workers with subagent context passing

Dans un pattern orchestrator-workers, l’agent lead décompose la tâche, engendre des workers ayant chacun une fenêtre de contexte isolée, ne transmet à chaque worker que la tranche dont il a besoin, et réagrège les résultats distillés — le travail intermédiaire verbeux des workers n’entre jamais dans le contexte de l’orchestrateur.

python
from anthropic import Anthropic
client = Anthropic()
def worker(task_brief: str, documents: str) -> str:
"""Un subagent avec son PROPRE contexte neuf — seulement le brief + sa tranche, rien d'autre."""
resp = client.messages.create(
model="claude-sonnet-5", max_tokens=1024,
system="You are a focused research worker. Return only a distilled 5-line summary.",
messages=[{"role": "user", "content": f"<task>{task_brief}</task>\n<docs>{documents}</docs>"}])
return "".join(b.text for b in resp.content if b.type == "text")
def orchestrator(question: str, corpus: dict[str, str]) -> str:
# 1. Le lead décompose et délègue ; chaque worker ne reçoit que sa tranche (context passing).
summaries = []
for topic, docs in corpus.items():
brief = f"Summarise what the docs say about: {question} (focus: {topic})"
summaries.append(f"[{topic}] {worker(brief, docs)}") # seul le résultat distillé revient
# 2. Le lead agrège les résumés distillés — le bruit des workers n'est jamais entré dans ce contexte.
synthesis = client.messages.create(
model="claude-opus-5", max_tokens=2048,
system="You are the coordinator. Synthesise the worker summaries into one answer.",
messages=[{"role": "user", "content": f"Question: {question}\n\n" + "\n".join(summaries)}])
return "".join(b.text for b in synthesis.content if b.type == "text")
text
┌──────── Orchestrator (Opus 5) ────────┐
│ decompose → delegate slices → synthesise│
└───┬───────────┬───────────┬────────────┘
brief+slice brief+slice brief+slice (context passing: only the needed slice)
▼ ▼ ▼
Worker A Worker B Worker C (each fresh, isolated context)
│ │ │
5-line 5-line 5-line (only distilled results return)
summary summary summary

Signal d’examen

« Un lead découpe un travail qu’il ne peut pas énumérer d’avance et délègue » → orchestrator-workers. « Transmettre à chaque subagent seulement la tranche dont il a besoin et renvoyer des résumés distillés » → context passing + isolation, ce qui garde la fenêtre du coordinateur propre et bon marché.


3.11 Hooks in the Agent SDK: a PreToolUse example

Les hooks sont des handlers déterministes déclenchés à des points du cycle de vie ; le code de sortie 2 bloque l’action. Les règles critiques relèvent d’ici, pas du prompt (anti-pattern nº 3). Ci-dessous, un hook PreToolUse refuse toute commande Bash contenant un pattern destructeur avant même qu’elle ne s’exécute.

python
import anyio
from claude_agent_sdk import query, ClaudeAgentOptions
async def block_destructive(input_data, tool_use_id, context):
"""Hook PreToolUse : renvoyer une décision de refus pour bloquer l'appel d'outil."""
cmd = input_data.get("tool_input", {}).get("command", "")
if any(p in cmd for p in ("rm -rf", "DROP TABLE", "git push --force")):
return {
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Blocked destructive command by policy.",
}
}
return {}
async def main():
options = ClaudeAgentOptions(
allowed_tools=["Read", "Grep", "Bash"],
permission_mode="default",
hooks={"PreToolUse": [block_destructive]},
max_turns=8,
)
async for message in query(prompt="Clean up the build artifacts", options=options):
print(message)
anyio.run(main)

Application déterministe, pas supplication de prompt

On ne peut pas convaincre un hook de ne pas bloquer ; une règle de prompt système peut être outrepassée par un résultat d’outil astucieux ou une instruction injectée. Toute règle irréversible ou à fort enjeu (supprimer, dépenser, publier, push) doit être un hook ou un contrôle programmatique (anti-pattern nº 3).


3.12 Managed Agents vs Agent SDK vs custom loop

DimensionManaged AgentsClaude Agent SDK (self-hosted)Custom Messages API loop
Qui exécute la boucle + sandboxAnthropic héberge les deuxVous hébergez ; le SDK fournit le harnaisVous construisez et hébergez tout
Effort de mise en placeLe plus faibleModéréLe plus élevé
Contrôle sur l’environnement / les outilsLe plus faibleÉlevé (propres outils, MCP, hooks, modes de permission)Total
Hooks, permissions, subagents intégrésOui (managés)Oui (primitives du SDK)Vous implémentez tout
Contrôle des données / de l’infraManagé par AnthropicVotre infra, vos contrôles de donnéesVotre infra, vos contrôles de données
Idéal pourDémarrage rapide sur tâches agentiques standardOutils/environnements personnalisés nécessitant l’ergonomie du harnais Claude CodeContrôle total, intégrations inhabituelles, ou dépendances minimales
Charge de terminaison / sécuritéManagéeVous câblez hooks + stop_reason + max_turnsVous implémentez vous-même l’aiguillage sur stop_reason et les filets de sécurité

Signal d’examen

« Anthropic doit héberger la boucle et le sandbox, démarrer vite » → Managed Agents. « Nous avons besoin de nos propres outils/environnement/contrôles de données avec un harnais first-party, des hooks et des modes de permission » → Agent SDK. « Dépendances minimales / intégration inhabituelle / contrôle total » → boucle Messages API personnalisée (et vous devez implémenter vous-même l’aiguillage sur stop_reason et un filet de sécurité).


3.13 The evaluator-optimizer pattern in code

Evaluator-optimizer améliore la qualité par itération : un générateur produit un brouillon, un évaluateur séparé le critique par rapport à des critères explicites, et le générateur révise — en répétant jusqu’à ce que les critères soient satisfaits ou qu’un filet de sécurité se déclenche. L’évaluateur ne doit pas partager la session du générateur (anti-pattern nº 9).

python
from anthropic import Anthropic
client = Anthropic()
def generate(brief, feedback=None):
prompt = brief if not feedback else f"{brief}\n\nRevise to fix: {feedback}"
r = client.messages.create(model="claude-sonnet-5", max_tokens=1024,
messages=[{"role": "user", "content": prompt}])
return "".join(b.text for b in r.content if b.type == "text")
def evaluate(brief, draft):
# Session séparée ET idéalement un modèle différent — pas de biais de raisonnement partagé.
r = client.messages.create(
model="claude-opus-5", max_tokens=512,
system="Score the draft against the brief. Return JSON {'pass': bool, 'feedback': str}.",
messages=[{"role": "user", "content": f"BRIEF:\n{brief}\n\nDRAFT:\n{draft}"}])
import json
return json.loads("".join(b.text for b in r.content if b.type == "text"))
def optimize(brief, max_rounds=3): # filet de sécurité, pas l'arrêt principal
draft = generate(brief)
for _ in range(max_rounds):
verdict = evaluate(brief, draft)
if verdict["pass"]:
return draft # arrêt principal : critères satisfaits
draft = generate(brief, verdict["feedback"])
return draft # filet de sécurité atteint — signaler pour revue
ElementRequirement
Générateur et évaluateurSessions différentes ; idéalement modèles différents
ArrêtPrincipal : critères satisfaits ; filet de sécurité : nombre max de rounds
FeedbackConcret et actionnable, réinjecté dans le brouillon suivant
Utiliser quandLa qualité s’améliore avec l’itération et les critères sont explicites

Signal d’examen

« Générer, puis critiquer et raffiner par rapport à des critères clairs » → evaluator-optimizer. Si la même session note son propre brouillon, c’est l’anti-pattern nº 9 — le juge hérite du biais du générateur.


3.14 Positioning frameworks against the fundamentals

Les frameworks ajoutent une ergonomie d’orchestration ; ils ne suppriment jamais le besoin d’une terminaison pilotée par stop_reason, d’une application déterministe, et d’une gestion du contexte.

FrameworkSweet spotWhat it does not change
Claude Agent SDKHarnais first-party ; intégration Claude Code / outils / hooks la plus étroiteVous câblez toujours listes blanches, hooks, aiguillage stop_reason, filet de sécurité
LangGraphOrchestration explicite graphe/machine à états de nœuds et arêtesPilotez toujours l’appel du modèle depuis stop_reason dans chaque nœud
PydanticAISorties d’agent type-safe, validées par Pydantic en PythonLa validation-retry et la conception de schéma s’appliquent toujours
CrewAI« Crews » multi-agents avec rôles et tâchesLe moindre privilège, l’isolation du contexte et la terminaison sûre s’appliquent toujours

Un framework n’est pas un contrôle de sécurité

Choisir LangGraph/CrewAI/PydanticAI n’impose pas les règles critiques ni ne termine les boucles à votre place. L’application reste les hooks/permissions ; la terminaison reste stop_reason avec un filet de sécurité. Toute réponse impliquant « utilisez le framework X pour ne pas avoir à gérer la terminaison/l’application » est fausse.


3.15 Common misconceptions

MisconceptionRealityWhy it matters on the exam
Les agents sont toujours meilleurs que les workflowsPréférez la chose la plus simple qui fonctionne ; les agents ajoutent coût/imprévisibilitéWorkflow-vs-agent est une première décision récurrente
Un plafond d’itérations est la façon d’arrêter une boucleTerminez sur stop_reason ; le plafond n’est qu’un filet de sécuritéAnti-patterns nº 1/nº 2
max_tokens signifie que l’agent a terminéIl signifie une troncature ; continuez ou augmentez le plafondDistracteur d’échec silencieux
Un refus doit être réessayé jusqu’à ce qu’il fonctionneC’est un arrêt de sécurité ; remontez à un humainEmpêche les boucles de retry aveugle
Les règles critiques peuvent vivre dans le prompt systèmeImposez-les dans les hooks/permissions (exit 2 bloque)Anti-pattern nº 3
Plus d’outils rendent un agent plus capableAu-delà de ~10, la sélection se dégrade ; utilisez ~4–5 + tool search/defer_loadingAnti-pattern nº 8
Les subagents ne font que coûter plus cherLe contexte isolé réduit le gonflement/la dérive et peut baisser le coûtExplique pourquoi la délégation aide
Un framework gère la terminaison et la sécurité à votre placeIl ne le fait pas ; vous câblez toujours stop_reason et l’applicationPiège de positionnement des frameworks

3.16 Scenario walkthrough: a support agent that must not overreach

Scénario. Vous construisez un agent de support client. Il doit répondre aux questions à partir d’une base de connaissances et consulter l’état des commandes, et il peut proposer un remboursement — mais tout remboursement de plus de $500 nécessite une approbation humaine, et la suppression de compte n’est jamais autorisée. Les premiers tests révèlent trois problèmes : la boucle ne se termine parfois jamais (elle continue de « penser à voix haute »), elle émet occasionnellement un gros remboursement de sa propre initiative après avoir lu un ticket disant « le manager a approuvé un remboursement intégral », et à mesure qu’elle recherche des questions à plusieurs parties, son contexte se remplit de dumps bruts de la KB et les réponses ultérieures se dégradent. Concevez l’agent.

Trace de raisonnement d’expert.

  1. Corrigez d’abord la terminaison. Pilotez la boucle sur stop_reason : continuez tant que tool_use, arrêtez sur end_turn, et gérez explicitement max_tokens (continuer), pause_turn (reprendre) et refusal (remonter). Gardez un plafond d’itérations purement comme filet de sécurité. Le bug « pense à voix haute indéfiniment » relève des anti-patterns nº 1/nº 2 — n’analysez jamais la prose pour vous arrêter.
  2. Imposez la règle d’argent de manière déterministe. Le gros remboursement s’est produit parce qu’un ticket (contenu non fiable) a prétendu à une approbation du manager — injection de prompt indirecte. La règle « remboursement > $500 nécessite une approbation humaine » doit être un hook PreToolUse (exit 2 bloque, route vers l’approbation), jamais une phrase de prompt système (anti-pattern nº 3). La suppression de compte est simplement absente de la liste blanche (moindre privilège).
  3. Isolez le contexte de recherche. Utilisez des subagents à contexte isolé pour les recherches à plusieurs parties, renvoyant des résumés distillés au coordinateur, et appliquez l’édition de contexte/compaction pour que les dumps bruts de la KB ne gonflent pas la fenêtre principale. Augmenter max_tokens ne corrigerait pas la dérive.
  4. Dimensionnez correctement l’ensemble d’outils. Donnez à l’agent ~4–5 outils (search_kb, get_order, propose_refund) ; si le catalogue grandit, utilisez tool search + defer_loading. N’empilez pas les outils.
  5. Rejetez les alternatives tentantes. « Ajouter une règle ferme de prompt système sur les remboursements et approbations » — prompt-comme-application (nº 3). « Faire confiance au modèle pour reconnaître la fausse approbation » — recours à l’auto-déclaration/sans frontière. « Plafonner la boucle à 5 itérations comme correctif » — filet de sécurité, pas terminaison (nº 2). « Augmenter max_tokens pour empêcher la dégradation du contexte » — mauvais levier pour la dérive.

Décision correcte. Boucle pilotée par stop_reason avec un filet de sécurité ; hook PreToolUse imposant le seuil de remboursement et routant vers l’approbation ; outil de suppression de compte exclu par moindre privilège ; subagents à contexte isolé plus édition de contexte/compaction pour la recherche ; ~4–5 outils avec tool search si le catalogue grandit.


Pièges de l’examen dans ce domaine

PiègePourquoi c’est faux
Utiliser un agent quand un workflow fixe suffitAjoute coût et imprévisibilité sans bénéfice
Plafond d’itérations comme arrêt principalFilet de sécurité seulement ; terminez sur stop_reason (anti-patterns nº 1, nº 2)
Imposer les règles critiques dans le promptUtilisez hooks / contrôles programmatiques (anti-pattern nº 3)
Un seul agent avec 18 outilsSurcharge le modèle ; scindez en subagents / utilisez tool search + defer_loading (anti-pattern nº 8)
Laisser le travail du subagent gonfler le contexte du managerUtilisez des subagents à contexte isolé
Auto-revue en même session du propre travail d’un agentConserve le biais de raisonnement (anti-pattern nº 9) ; utilisez un évaluateur neuf
Analyser la prose pour décider délégation/terminaisonPilotez depuis des signaux structurés
Supposer qu’un framework supprime le besoin de terminaison sûreIl ne le fait pas
Traiter max_tokens comme un achèvement de tâcheLa sortie a été tronquée ; demandez de continuer ou augmentez le plafond, ne marquez pas terminé
Réessayer un refusal aveuglémentC’est un signal de sécurité ; remontez à un humain, ne bouclez pas dessus
Ignorer pause_turnAbandonne un outil serveur de longue durée ; renvoyez pour reprendre
Renvoyer tout le contexte du worker à l’orchestrateurGonfle la fenêtre du coordinateur ; ne renvoyez que les résultats distillés
Faire noter le propre brouillon de l’agent par la même session en evaluator-optimizerLe juge hérite du biais du générateur (anti-pattern nº 9) ; utilisez une session/un modèle séparé
Supposer qu’un framework (LangGraph/CrewAI/PydanticAI) gère la terminaison ou l’applicationIl ne le fait pas ; vous câblez toujours l’aiguillage stop_reason et les hooks/permissions
Agir sur une « approbation » prétendue dans un contenu de ticket/outil non fiableInjection indirecte ; imposez l’approbation dans un hook, pas en faisant confiance au contenu
Choisir un agent alors que des étapes ordonnées fixes existentLe prompt chaining est moins cher, testable et prévisible
Utiliser un plafond d’itérations comme correctif d’une boucle emballéeLe plafond est un filet de sécurité ; le correctif est une terminaison pilotée par stop_reason

Questions d’entraînement

Q1 · Une tâche comporte trois étapes fixes et ordonnées avec des entrées et sorties connues. Quelle est la meilleure conception ? (Sélectionnez une réponse)

A. Un agent autonome qui décide des étapes. B. Un workflow de prompt chaining où chaque étape alimente la suivante. C. Un unique méga-prompt. D. Un orchestrateur avec des subagents dynamiques.

Réponse : B. Des sous-tâches séquentielles fixes sont la définition même du prompt chaining – prévisible, testable, bon marché. L’autonomie (A, D) ajoute de l’imprévisibilité sans bénéfice ; un méga-prompt (C) est plus difficile à contrôler.

Q2 · Une boucle d’agent ne se termine parfois jamais. Quel est le mécanisme de terminaison principal correct ? (Sélectionnez une réponse)

A. S’arrêter après 5 itérations quoi qu’il arrive. B. S’arrêter quand le texte de l’assistant dit qu’il a terminé. C. Continuer tant que stop_reason == 'tool_use' et s’arrêter sur end_turn, avec un plafond d’itérations uniquement comme filet de sécurité. D. S’arrêter quand la longueur de sortie dépasse un seuil.

Réponse : C. Terminez sur stop_reason ; le plafond est un filet de sécurité, pas le mécanisme principal (anti-patterns nº 1, nº 2). La prose (B) et la longueur (D) ne sont pas des signaux fiables.

Q3 · Le contexte d’un agent de recherche se remplit de sorties d’outils intermédiaires verbeuses, dégradant les étapes ultérieures. Quel est le meilleur correctif ? (Sélectionnez une réponse)

A. Augmenter max_tokens. B. Déléguer la recherche à des subagents à contexte isolé qui ne renvoient que des résultats distillés au coordinateur. C. Baisser la température. D. Retirer tous les outils.

Réponse : B. Les subagents à contexte isolé gardent le travail intermédiaire bruité hors de la fenêtre du coordinateur et renvoient des résumés. max_tokens (A) plafonne la sortie ; la température (C) et retirer les outils (D) ne traitent pas le gonflement du contexte.

Q4 · Une règle métier stipule que l’agent ne doit jamais exécuter un remboursement de plus de $500 sans approbation humaine. Où cela devrait-il être imposé ? (Sélectionnez une réponse)

A. Dans le prompt système comme instruction. B. Dans un hook PreToolUse qui bloque (code de sortie 2) les remboursements au-dessus du seuil et route vers l’approbation humaine. C. En demandant au modèle de revérifier. D. En baissant la température du modèle.

Réponse : B. Les règles critiques et irréversibles doivent être imposées de manière déterministe via des hooks, pas des instructions de prompt (anti-pattern nº 3). L’application par prompt et les auto-vérifications peuvent être contournées.

Q5 · Une équipe veut qu’Anthropic héberge la boucle d’agent et le sandbox pour démarrer vite avec des outils standard. Quelle option convient ? (Sélectionnez une réponse)

A. Agent SDK auto-hébergé sur leur propre infrastructure. B. Managed Agents. C. Une boucle Messages API brute sans outils. D. Une tâche cron.

Réponse : B. Les Managed Agents font héberger la boucle et le sandbox par Anthropic. L’auto-hébergement (A) est l’inverse ; une boucle nue (C) ou un cron (D) ne fournit pas de sandbox managé.

Q6 · Quelles DEUX options de l’Agent SDK soutiennent directement le moindre privilège et la sécurité ? (Sélectionnez deux réponses)

A. allowed_tools restreignant la liste blanche d’outils. B. max_turns réglé à 1000. C. Des hooks qui bloquent les actions dangereuses. D. La longueur de system_prompt. E. permission_mode: 'bypassPermissions'.

Réponse : A et C. Une liste blanche d’outils explicite et des hooks bloquants imposent le moindre privilège et la sécurité. Un max_turns énorme (B) affaiblit le filet de sécurité ; la longueur du prompt (D) est sans rapport ; bypassPermissions (E) supprime les garde-fous.

Q7 · Un agent est configuré avec 18 outils et choisit fréquemment le mauvais. Quel est le remède recommandé ? (Sélectionnez une réponse)

A. Ajouter plus d’outils pour couvrir les cas limites. B. Réduire à un ensemble focalisé (≈4–5), scinder les responsabilités en subagents, et utiliser tool search avec defer_loading pour les grands catalogues. C. Augmenter la temperature. D. Augmenter max_turns.

Réponse : B. Trop d’outils par agent est l’anti-pattern nº 8 ; le correctif est moins d’outils, la spécialisation en subagents, et tool search + defer_loading au-delà de ~10 outils. Plus d’outils (A) aggrave le problème.

Q8 · Un agent doit se souvenir des préférences utilisateur entre des sessions séparées. Quel mécanisme est conçu pour cela ? (Sélectionnez une réponse)

A. Augmenter la fenêtre de contexte. B. Le memory tool pour la persistance entre sessions. C. Un thinking à effort plus élevé. D. Renvoyer la transcription complète à chaque fois pour toujours.

Réponse : B. Le memory tool persiste des informations durables entre sessions. Une fenêtre plus grande (A) ne persiste pas entre sessions ; l’effort (C) est sans rapport ; tout renvoyer (D) est coûteux et non borné.

Q9 · Une boucle d’agent renvoie `stop_reason == 'max_tokens'` au milieu d’une longue réponse, et le harnais traite cela comme un achèvement. Quel est le traitement correct ? (Sélectionnez une réponse)

A. Traiter max_tokens comme terminé ; la réponse est complète. B. Reconnaître que la sortie a été tronquée : demander au modèle de continuer (ou augmenter max_tokens) plutôt que de marquer le tour comme complet. C. Réessayer toute la requête à temperature: 0. D. Passer à Haiku 4.5.

Réponse : B. max_tokens signifie que la sortie a atteint le plafond de sortie et a été coupée — ce n’est pas end_turn. La boucle devrait continuer la réponse ou augmenter le plafond. Le traiter comme terminé (A) tronque silencieusement le travail ; régénérer (C) ou changer de modèle (D) ne récupère pas le contenu tronqué.

Q10 · En cours d’exécution, un agent reçoit `stop_reason == 'pause_turn'`. Qu’est-ce que cela indique et que devrait faire la boucle ? (Sélectionnez une réponse)

A. Le modèle a refusé ; arrêter et alerter un humain. B. Un outil serveur de longue durée a été mis en pause ; renvoyer la conversation pour le reprendre. C. Le plafond d’itérations a été atteint ; abandonner. D. La sortie a été tronquée ; augmenter max_tokens.

Réponse : B. pause_turn signale qu’un tour de longue durée (serveur) a été mis en pause ; la boucle renvoie pour reprendre. Le refus (A) est un stop_reason différent ; le plafond (C) est un filet de sécurité du harnais, pas un stop_reason ; la troncature (D) est max_tokens.

Q11 · Un coordinateur de recherche délègue des sujets à des subagents workers. Quels DEUX choix de conception gardent le contexte du coordinateur propre et les coûts bas ? (Sélectionnez deux réponses)

A. Donner à chaque worker sa propre fenêtre de contexte isolée avec seulement sa tranche de tâche. B. Renvoyer la transcription complète de chaque worker, y compris la sortie d’outils intermédiaire, au coordinateur. C. Faire renvoyer par les workers seulement un court résumé distillé au coordinateur. D. Exécuter tout le travail dans le contexte unique du coordinateur. E. Donner à chaque worker les 18 outils.

Réponse : A et C. Des contextes de worker isolés plus des retours de résumés distillés gardent la fenêtre du coordinateur libre de travail intermédiaire bruité et réduisent le coût en tokens. Renvoyer des transcriptions complètes (B) ou utiliser un contexte partagé unique (D) provoque du gonflement ; donner 18 outils à chaque worker (E) est l’anti-pattern nº 8.

Q12 · Une équipe doit garantir que l’agent n’exécute jamais `git push --force`, quelle que soit la décision du modèle. Où et comment cela devrait-il être imposé dans l’Agent SDK ? (Sélectionnez une réponse)

A. Une instruction fortement formulée dans le prompt système. B. Un hook PreToolUse qui renvoie une décision de refus (ou un hook shell sortant avec le code 2) quand la commande correspond au pattern. C. Demander au modèle de confirmer avant de forcer le push. D. Baisser la température pour qu’il se comporte bien.

Réponse : B. Les règles critiques et irréversibles doivent être imposées de manière déterministe avec un hook PreToolUse (refus / code de sortie 2), que le modèle ne peut pas contourner par l’argumentation (anti-pattern nº 3). Les instructions de prompt (A), l’auto-confirmation du modèle (C) et la température (D) peuvent toutes être contournées.

Q13 · Une organisation veut le contrôle le plus étroit sur ses propres outils, son sandboxing et ses données, en utilisant un harnais first-party avec hooks et modes de permission. Quelle option convient, et qu’est-ce qui reste sous leur responsabilité ? (Sélectionnez une réponse)

A. Managed Agents ; Anthropic gère entièrement la terminaison et la sécurité. B. Le Claude Agent SDK auto-hébergé ; ils câblent toujours eux-mêmes allowed_tools, les hooks, l’aiguillage stop_reason et un filet de sécurité max_turns. C. Une tâche cron invoquant un unique prompt. D. Un appel Messages API nu sans outils.

Réponse : B. L’Agent SDK est le harnais first-party auto-hébergé donnant un contrôle total sur les outils, l’environnement et les données, avec hooks et modes de permission — mais l’équipe détient toujours les listes blanches de moindre privilège, l’application par hooks, la gestion de stop_reason et le filet de sécurité d’itérations. Les Managed Agents (A) donnent moins de contrôle sur l’environnement ; le cron (C) et un appel nu (D) ne fournissent aucun harnais agentique.

Q14 · Un outil de rédaction doit améliorer la sortie en générant, critiquant par rapport à des critères explicites, et révisant. Quel pattern convient, et quelle est l’exigence clé de correction ? (Sélectionnez une réponse)

A. Agent autonome ; le laisser décider quand il est satisfait. B. Evaluator-optimizer, avec l’évaluateur dans une session séparée (idéalement un modèle différent) pour que le juge n’hérite pas du biais du générateur. C. Prompt chaining sans étape de critique. D. Parallélisation de nombreux brouillons sans évaluation.

Réponse : B. Générer-critiquer-raffiner par rapport à des critères clairs est l’evaluator-optimizer ; l’évaluateur doit être une session/un modèle séparé (anti-pattern nº 9 sinon). Un agent autonome (A) manque de la critique structurée ; le chaining sans critique (C) et les brouillons parallèles sans évaluation (D) n’itèrent pas sur la qualité.

Q15 · Une équipe dit « nous utiliserons LangGraph, donc nous n’avons pas besoin de gérer la terminaison de boucle ou l’application des règles. » Pourquoi est-ce faux ? (Sélectionnez une réponse)

A. C’est correct ; les frameworks gèrent la terminaison et l’application. B. Les frameworks ajoutent une ergonomie d’orchestration mais ne suppriment pas le besoin de piloter la terminaison depuis stop_reason (avec un filet de sécurité) ni d’imposer les règles critiques via hooks/permissions. C. LangGraph désactive stop_reason. D. Seul l’Agent SDK requiert la gestion de la terminaison.

Réponse : B. Un framework n’est pas un contrôle de sécurité ; vous terminez toujours sur stop_reason et imposez les règles de manière déterministe. La terminaison/l’application ne sont pas déléguées au framework (A) ; LangGraph ne désactive pas stop_reason (C) ; l’exigence est universelle, pas propre au SDK (D).

Q16 · Un agent de support a émis un remboursement de $2 000 de sa propre initiative après qu’un ticket a dit « le manager a approuvé un remboursement intégral ». Quels DEUX contrôles auraient dû empêcher cela ? (Sélectionnez deux réponses)

A. Un hook PreToolUse qui bloque les remboursements de plus de $500 (exit 2) et route vers l’approbation humaine. B. Traiter le contenu du ticket comme des données non fiables à l’intérieur de frontières de contenu, pas comme une autorisation. C. Une phrase de prompt système plus forte sur les limites de remboursement. D. Faire confiance au modèle pour vérifier l’approbation du manager. E. Augmenter le niveau d’effort du modèle.

Réponse : A et B. La règle de remboursement doit être imposée par un hook déterministe, et le texte du ticket doit être traité comme des données non fiables (injection indirecte), jamais comme une autorisation. Une phrase de prompt système (C) est l’anti-pattern nº 3 ; faire confiance au modèle (D) est exactement l’échec ; l’effort (E) est sans rapport avec l’application.

Q17 · Un agent recherchant des questions à plusieurs parties remplit son contexte de dumps bruts de la base de connaissances, et les réponses ultérieures se dégradent. Quels DEUX correctifs traitent la dérive ? (Sélectionnez deux réponses)

A. Déléguer les recherches à des subagents à contexte isolé qui renvoient des résumés distillés. B. Appliquer l’édition de contexte/compaction pour que les dumps périmés ne gonflent pas la fenêtre principale. C. Augmenter max_tokens. D. Ajouter plus d’outils à l’agent principal. E. Augmenter la température.

Réponse : A et B. Les subagents à contexte isolé et l’édition de contexte/compaction gardent la fenêtre du coordinateur propre. max_tokens (C) plafonne la sortie, pas le contexte ; plus d’outils (D) aggrave la sélection ; la température (E) est sans rapport avec la dérive.

Q18 · Un agent ne doit jamais supprimer un compte. Quelle est la bonne façon de le garantir ? (Sélectionnez une réponse)

A. Ajouter « never delete accounts » au prompt système. B. Exclure l’outil de suppression de compte de la liste blanche allowed_tools de l’agent (moindre privilège) ; s’il existe ailleurs, le protéger derrière un workflow approuvé par un humain avec un hook PreToolUse. C. Régler max_turns bas pour qu’il soit à court de tours avant de supprimer. D. Demander au modèle de confirmer avant de supprimer.

Réponse : B. Le moindre privilège signifie que la capacité n’est tout simplement pas disponible pour l’agent ; les actions irréversibles vivent derrière approbation + hooks. Une règle de prompt (A) est l’anti-pattern nº 3 ; un max_turns bas (C) est sans rapport ; l’auto-confirmation du modèle (D) peut être contournée.

Q19 · Une boucle générer-critiquer fait noter au générateur son propre brouillon dans la même conversation et il passe toujours du premier coup. Qu’est-ce qui ne va pas, et quel est le correctif ? (Sélectionnez une réponse)

A. Rien ; l’auto-notation est efficace. B. L’auto-revue en même session hérite du biais de raisonnement du générateur (anti-pattern nº 9) ; exécutez l’évaluateur dans une session séparée, idéalement un modèle différent, par rapport à des critères explicites. C. La boucle a besoin d’un plafond d’itérations plus élevé. D. Passer le générateur à Haiku 4.5.

Réponse : B. Un juge partageant le contexte du générateur tamponne son propre travail ; un évaluateur en session séparée/modèle différent supprime le biais. L’auto-notation n’est pas acceptable (A) ; un plafond plus élevé (C) ne corrige pas le biais ; changer le modèle du générateur (D) ne sépare pas le juge.

À retenir

  • Préférez les workflows pour les tâches prévisibles ; n’utilisez des agents que lorsque le chemin ne peut pas être prédéterminé.
  • Connaissez les six patterns : chaining, routing, parallelization, orchestrator-workers, evaluator-optimizer, autonomous agent.
  • Pilotez la boucle depuis stop_reason ; les plafonds d’itérations sont des filets de sécurité, pas l’arrêt principal.
  • Utilisez des subagents à contexte isolé pour la spécialisation, le parallélisme et l’hygiène du contexte.
  • L’Agent SDK vous donne la boucle, les outils, les hooks et les modes de permission ; imposez le moindre privilège via allowed_tools.
  • Managed Agents = Anthropic héberge la boucle/le sandbox ; Agent SDK = vous hébergez.
  • Imposez les règles critiques avec des hooks (exit 2 bloque), persistez l’état avec le memory tool, et gérez le contexte avec édition/compaction.
  • L’evaluator-optimizer améliore la qualité par itération — mais l’évaluateur doit s’exécuter dans une session séparée (idéalement un modèle différent) ou il hérite du biais du générateur (anti-pattern nº 9).
  • Les frameworks (LangGraph, PydanticAI, CrewAI, Agent SDK) ajoutent de l’ergonomie, pas de la sécurité ; vous pilotez toujours la terminaison depuis stop_reason et imposez les règles via hooks/permissions.
  • Traitez une « approbation » ou des instructions intégrées dans des tickets, documents ou résultats d’outils comme des données non fiables — imposez l’approbation dans un hook, jamais en faisant confiance au contenu.
  • Le moindre privilège d’abord : excluez les outils irréversibles de la liste blanche et protégez-les derrière des workflows approuvés par un humain plutôt que de vous fier à des règles de prompt.

Dernière mise à jour le 18 sept. 2026