Domaines
D1 · Agentic Architecture and Orchestration
Choisir entre flux de travail et agents, les six patrons d’orchestration, la boucle agentique et la terminaison pilotée par stop_reason, les hiérarchies coordinateur/sous-agents, la conception de l’escalade, la propagation d’erreurs, l’état et la mémoire, ainsi que le coût et la latence des systèmes multi-agents.
C’est le domaine le plus lourd de l’examen Architect — environ 16 des 60 items — et c’est là que les dix anti-patterns mordent le plus fort. Il évalue votre capacité à examiner un système décrit et à choisir l’architecture correcte la plus simple : un prompt unique, un flux de travail fixe ou un véritable agent ; et, s’il s’agit d’un agent, quel patron d’orchestration, comment il se termine, comment il escalade et comment il échoue sans danger. Presque chaque item est un piège entre une réponse sur-conçue et une réponse aveugle aux contraintes.
Objectifs d’apprentissage
À la fin de cette page, vous devriez savoir :
- Appliquer le cadre de décision workflow vs agent (flux de travail vs agent) et le justifier au regard des contraintes.
- Choisir parmi les six patrons d’orchestration (prompt chaining, routing, parallelization, orchestrator-workers, evaluator-optimizer, autonomous agent) et décrire les modes de défaillance de chacun.
- Mettre en œuvre la boucle agentique et piloter la terminaison depuis
stop_reason— non par l’analyse du langage naturel (anti-pattern 1) ni par des plafonds d’itérations arbitraires (anti-pattern 2). - Concevoir des hiérarchies coordinateur/sous-agents avec passage de contexte explicite, agrégation des résultats et gestion des défaillances partielles.
- Concevoir l’escalade sur demande explicite (immédiate) ou par capacité (résoudre d’abord) — jamais sur le sentiment ni la confiance auto-déclarée (anti-patterns 4-5).
- Choisir entre hooks et prompts pour l’application des règles (anti-pattern 3) et entre Managed Agents et Agent SDK/Tool Runner pour l’hébergement.
- Propager des erreurs structurées (catégorie, réessayable, résultats partiels) avec idempotence et réessais (anti-patterns 6-7).
- Trancher entre conversation, fichiers, base de données et memory tool pour l’état, et modéliser le coût et la latence des systèmes multi-agents avec une observabilité par agent.
1.1 Workflow vs agent : la première décision
Un agent est un système où le modèle dirige dynamiquement son propre processus et son usage des outils, décidant de la prochaine action dans une boucle jusqu’à ce qu’il estime la tâche terminée. Un workflow (flux de travail) est un système où le code orchestre le modèle par des chemins prédéfinis — le flux de contrôle est écrit par vous, non décidé par le modèle.
La posture par défaut de l’examen, directement issue des recommandations d’Anthropic, est la suivante : trouver la solution la plus simple et n’augmenter la complexité que lorsqu’elle améliore les résultats de façon démontrable. Un prompt unique bien conçu bat un flux de travail ; un flux de travail bat un agent ; un agent bat un système multi-agents. N’ajoutez de l’autonomie que lorsque la tâche exige réellement une prise de décision ouverte à l’exécution.
| Signal dans l’énoncé | Pointe vers | Pourquoi |
|---|---|---|
| Étapes connues à l’avance, ordre fixe | Workflow | Le flux de contrôle déterministe est moins cher, plus rapide, testable |
| Branchement prévisible sur une entrée classifiable | Workflow (routing) | Vous pouvez énumérer les branches |
| La tâche exige des décisions à l’exécution que vous ne pouvez pas énumérer | Agent | Seul le modèle peut décider le chemin depuis le contexte |
| Recherche, débogage, exploration ouverts | Agent | Nombre et ordre des étapes inconnus au départ |
| Latence, coût ou auditabilité primordiaux | Workflow | Moins d’appels au modèle, déterministe, facile à tracer |
| Un seul appel au modèle avec un bon prompt suffit | Prompt unique | Ne construisez pas de système du tout |
Signal d’examen
Des mots comme « séquence fixe », « étapes connues », « chaque requête suit le même chemin » pointent vers un workflow. Des mots comme « ouvert », « le nombre d’étapes varie », « doit décider à l’exécution », « explorer jusqu’à » pointent vers un agent. Lorsque l’énoncé vous donne une tâche simple et une architecture élaborée comme réponse « recommandée », cette réponse est presque toujours le distracteur sur-conçu.
1.2 Les six patrons d’orchestration
L’examen attend une aisance complète sur les six. Pour chacun : ce dont il s’agit, un diagramme ASCII, quand l’utiliser et ses modes de défaillance.
Pattern 1 – Prompt chaining
Décomposer une tâche en une séquence fixe d’étapes, chaque appel au modèle consommant la sortie précédente. Ajouter des barrières programmatiques (« checks ») entre les étapes.
Input ──► [Call 1] ──► gate ──► [Call 2] ──► gate ──► [Call 3] ──► Output │ │ fail→fix fail→stopÀ utiliser quand : la tâche se découpe proprement en sous-tâches fixes et vous échangez un peu de latence contre une bien meilleure précision par étape (par ex. plan → ébauche → finition).
Modes de défaillance : cumul d’erreurs le long de la chaîne ; une première étape erronée empoisonne tout ce qui suit ; la latence est la somme de tous les appels.
Pattern 2 – Routing
Classifier l’entrée, puis l’aiguiller vers un prompt/modèle/flux spécialisé.
┌─► [Billing prompt · Haiku]Input ─► [Router]─┼─► [Technical prompt · Sonnet] └─► [Escalation flow]À utiliser quand : les entrées se répartissent en classes distinctes mieux traitées séparément, et où une erreur de classification coûte moins cher qu’une approche uniforme. Permet d’envoyer les classes faciles vers des modèles moins chers.
Modes de défaillance : une erreur de classification du routeur se propage en cascade ; trop de classes fragilisent le routeur ; une classe non gérée est traitée à tort en silence.
Pattern 3 – Parallelization (sectioning et voting)
Exécuter des sous-tâches indépendantes en parallèle (sectioning) ou exécuter la même tâche plusieurs fois et agréger (voting).
Sectioning Voting ┌─►[Worker A]─┐ ┌─►[Run 1]─┐Input ──┼─►[Worker B]─┼─►[Merge] Input ──┼─►[Run 2]─┼─►[Vote]─► Output └─►[Worker C]─┘ └─►[Run 3]─┘À utiliser quand : les sous-tâches sont indépendantes (sectioning) et la latence compte, ou lorsque plusieurs tentatives augmentent la confiance (voting) — par ex. un garde-fou (guardrail) en plus de la réponse principale, ou une revue de code au vote majoritaire.
Modes de défaillance : un sectioning qui suppose l’indépendance alors que les tâches interagissent en réalité ; un voting qui masque un biais systématique partagé par toutes les exécutions ; un coût multiplié par le fan-out.
Pattern 4 – Orchestrator-workers
Un modèle central (orchestrateur) décompose dynamiquement une tâche, lance des appels de workers et synthétise. Contrairement à la parallelization, les sous-tâches ne sont pas prédéfinies — l’orchestrateur les décide à l’exécution.
Input ─► [Orchestrator] ─┬─► [Worker: search docs] ▲ ├─► [Worker: read files] │ └─► [Worker: summarise] └────────────── synthesise ◄────────┘À utiliser quand : vous ne pouvez pas prédire les sous-tâches à l’avance (par ex. modifications de code multi-fichiers, recherche où les sous-questions dépendent des découvertes).
Modes de défaillance : les anti-patterns coordinateur/sous-agents — compter sur l’auto-héritage du contexte, absence de gestion des défaillances partielles, coût de fan-out non borné. Voir §1.5.
Pattern 5 – Evaluator-optimizer
Un appel génère, un second évalue au regard de critères explicites et renvoie un retour, puis la boucle se répète jusqu’à ce que les critères passent.
┌───────────────────────────┐Input ─►[Generator]─► draft ─►[Evaluator]─► pass? ─► Output ▲ │ fail └────────── feedback ◄─────────┘À utiliser quand : vous disposez de critères de réussite clairs et vérifiables et l’itération améliore mesurablement le résultat (qualité de traduction, code devant passer des tests, rédaction contre un barème).
Modes de défaillance : l’évaluateur et le générateur partagent une session et donc un biais (anti-pattern 9 — auto-revue dans la même session) ; aucun critère d’arrêt objectif, donc la boucle tourne indéfiniment ou s’arrête arbitrairement ; des critères vagues produisent un retour inutile.
Indépendance de l’évaluateur
L’évaluateur devrait être un contexte indépendant — une session vierge, idéalement un modèle différent — pour ne pas hériter du raisonnement du générateur. Réutiliser la même conversation pour « vérifier son propre travail » conserve le biais de contexte de raisonnement qui a produit le défaut.
Pattern 6 – Autonomous agent
Un modèle unique exécute une boucle ouverte : il décide d’une action, appelle un outil, observe le résultat et répète jusqu’à ce qu’il estime la tâche terminée ou qu’une condition d’arrêt se déclenche.
┌─────────────────────────────┐User goal ─► [Claude] ─► tool_use ─► [Env] ──┘ ▲ result └── loop while stop_reason == "tool_use" stop when end_turn / gate / humanÀ utiliser quand : la tâche est réellement ouverte, l’environnement fournit un retour fiable, et les erreurs sont récupérables ou barrées par une approbation humaine pour les actions irréversibles.
Modes de défaillance : boucler indéfiniment (mauvaise terminaison) ; agir sur un état périmé ou halluciné ; prendre des actions irréversibles sans barrière ; les deux anti-patterns de boucle ci-dessous.
| Pattern | Flux de contrôle décidé par | Idéal pour | Risque caractéristique |
|---|---|---|---|
| Prompt chaining | Vous (fixe) | Tâches fixes décomposables | Cumul d’erreurs |
| Routing | Vous (branche sur la classe) | Classes d’entrée distinctes | Erreur de classification |
| Parallelization | Vous (fan-out) | Sous-tâches indépendantes / voting | Fausse indépendance, coût |
| Orchestrator-workers | Modèle (sous-tâches à l’exécution) | Décomposition imprévisible | Contexte/défaillance partielle |
| Evaluator-optimizer | Vous (boucle sur critères) | Barre de qualité vérifiable | Auto-revue à biais partagé |
| Autonomous agent | Modèle (boucle ouverte) | Tâches ouvertes | Terminaison, irréversibilité |
1.3 La boucle agentique et la terminaison pilotée par stop_reason
Tout agent est une boucle. La seule manière correcte de la piloter est le champ stop_reason de l’API. Les deux anti-patterns les plus testés se trouvent ici.
Valeurs de stop_reason : end_turn, tool_use, max_tokens, stop_sequence, pause_turn, refusal.
from anthropic import Anthropic
client = Anthropic()messages = [{"role": "user", "content": "Investigate the failing test and fix it."}]
while True: 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 = run_tools(resp.content) # exécute les outils demandés messages.append({"role": "user", "content": results}) continue # boucle : le modèle a vu les résultats elif resp.stop_reason == "end_turn": break # le modèle a terminé elif resp.stop_reason == "max_tokens": raise OutputTruncated() # ne PAS traiter comme un achèvement elif resp.stop_reason == "pause_turn": continue # server tool long ; reprendre elif resp.stop_reason == "refusal": escalate_to_human(resp) # le modèle a décliné ; stopper la boucle breakimport Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();const messages: Anthropic.MessageParam[] = [ { role: 'user', content: 'Investigate the failing test and fix it.' },];
while (true) { const resp = await client.messages.create({ model: 'claude-opus-5', max_tokens: 4096, tools: TOOLS, messages, }); messages.push({ role: 'assistant', content: resp.content });
if (resp.stop_reason === 'tool_use') { const results = await runTools(resp.content); messages.push({ role: 'user', content: results }); continue; } else if (resp.stop_reason === 'end_turn') { break; } else if (resp.stop_reason === 'max_tokens') { throw new Error('Output truncated – not a completion signal'); } else if (resp.stop_reason === 'refusal') { await escalateToHuman(resp); break; }}Anti-pattern 1 · Analyser la prose pour la terminaison
Ne terminez pas en vérifiant si le texte du modèle dit « done », « task complete » ou « I have finished ». La prose du modèle n’est pas un signal de contrôle — elle varie, elle ment, elle peut faire l’objet d’une injection de prompt. La boucle doit se caler sur stop_reason == "end_turn".
Anti-pattern 2 · Le plafond d’itérations comme arrêt principal
Un plafond dur comme for i in range(10) est un filet de sécurité, jamais le mécanisme d’arrêt principal. Si votre boucle ne s’arrête que parce qu’elle a atteint le plafond, vous n’avez aucune idée de si la tâche est terminée. L’arrêt principal est stop_reason ; le plafond existe pour qu’une boucle emballée ne consomme pas un coût non borné. Les deux ensemble : while stop_reason == "tool_use" and iterations < CAP.
Une conception de terminaison correcte combine : stop_reason comme signal principal, un plafond d’itérations/tokens/coût comme filet de sécurité, et des barrières explicites (approbation humaine pour les actions irréversibles).
1.4 Managed Agents vs Agent SDK / Tool Runner : la décision d’hébergement
| Option | Qui héberge la boucle et le sandbox | À choisir quand | Compromis |
|---|---|---|---|
| Managed Agents | Anthropic héberge la boucle et le sandbox d’exécution | Vous voulez de la rapidité vers la production, des outils standard, moins d’infra à opérer | Moins de contrôle sur la boucle, l’environnement et l’outillage personnalisé |
| Claude Agent SDK | Vous hébergez la boucle (pip install claude-agent-sdk / npm i @anthropic-ai/claude-agent-sdk) | Vous avez besoin d’outils personnalisés, de votre propre environnement, d’un contrôle profond, d’un auto-hébergement | Vous êtes responsable des réessais, de l’observabilité, du sandboxing, du passage à l’échelle |
| Tool Runner | Vous hébergez l’exécution des outils, Anthropic pilote l’orchestration | Vous voulez une orchestration managée mais votre propre exécution des outils | Responsabilité partagée |
Signal d’examen
« Nous devons livrer vite avec des outils standard et une infrastructure minimale » → Managed Agents. « Nous avons des outils propriétaires / un sandbox sur mesure / devons contrôler la boucle » → Agent SDK. Le SDK a été renommé depuis le Claude Code SDK ; les deux noms de paquet apparaissent à l’examen.
1.5 Hiérarchies coordinateur/sous-agents
Lorsqu’un seul agent ne peut pas porter toute la tâche, un coordinateur la décompose et délègue à des sous-agents, chacun avec sa propre fenêtre de contexte isolée. C’est le patron orchestrator-workers à l’échelle du système (le scénario Multi-Agent Research System).
┌──────────────┐ User goal ───►│ Coordinator │ holds plan, aggregates, decides done └──────┬───────┘ explicit context│ (never rely on inheritance) ┌───────────────┼────────────────┐ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐ │Subagent1│ │Subagent2│ │Subagent3│ isolated context each └────┬────┘ └────┬────┘ └────┬────┘ └── structured result ──────────┘ aggregate + handle partial failurePassage de contexte explicite
Les sous-agents ont des fenêtres de contexte isolées. Ils n’héritent pas automatiquement de la conversation, des fichiers ou des découvertes du coordinateur. Le coordinateur doit passer explicitement tout ce dont le sous-agent a besoin dans son prompt de tâche.
# CORRECT : le sous-agent reçoit exactement ce dont il a besoin, explicitement.subagent_task = { "role": "user", "content": ( f"Objective: {objective}\n" f"Context you must use:\n{relevant_findings}\n" f"Constraints: {constraints}\n" f"Return: a JSON object {{'finding': str, 'sources': [str], 'confidence': str}}." ),}Compter sur l’auto-héritage du contexte
Supposer qu’un sous-agent « sait déjà » ce que le coordinateur a découvert est un distracteur de scénario majeur. Les contextes des sous-agents sont isolés par conception (c’est une fonctionnalité — elle protège le contexte principal). Passez toujours le contexte explicitement ; spécifiez la forme exacte du retour pour que les résultats s’agrègent proprement.
Agrégation des résultats et gestion des défaillances partielles
Les sous-agents échouent indépendamment. Le coordinateur doit agréger des résultats structurés et décider quoi faire lorsque certains échouent.
results, failures = [], []for sub in subagents: try: r = run_subagent(sub, timeout=SUB_TIMEOUT) if r.status == "ok": results.append(r) else: failures.append((sub, r.error)) # erreur structurée, non avalée except TimeoutError as e: failures.append((sub, {"category": "timeout", "retryable": True}))
# Décider : continuer avec des résultats partiels, réessayer les réessayables, ou escalader.if len(results) >= MIN_QUORUM: answer = coordinator_synthesise(results, note_missing=failures) # provenance des lacuneselse: escalate("insufficient subagent results", partial=results, failures=failures)La conception correcte fait remonter la défaillance partielle au coordinateur avec un détail structuré, puis prend une décision explicite (continuer avec un quorum en notant la lacune, réessayer les réessayables, ou escalader). Écarter en silence un sous-agent en échec et présenter le reste comme complet est l’anti-pattern 7.
1.6 Conception de l’escalade
L’escalade est l’un des sujets les plus régulièrement testés, car trois des dix anti-patterns sont des pièges d’escalade. Le jeu de règles :
| Déclencheur | Comportement correct | Pourquoi |
|---|---|---|
| Demande explicite (« je veux un humain », « parler à un agent ») | Escalader immédiatement, sans autres tentatives | L’utilisateur a exprimé son intention ; honorez-la |
| Limite de capacité (la tâche exige un outil/une permission/une autorité que l’agent n’a pas) | Tenter d’abord la résolution, escalader seulement quand réellement bloqué | Escalader prématurément gâche un chemin capable |
| Sentiment (l’utilisateur est en colère/frustré) | Pas un déclencheur d’escalade en soi | Sentiment ≠ complexité (anti-pattern 5) |
| Confiance auto-déclarée (« je suis sûr à 60 % ») | Pas un déclencheur | Les modèles sont mal calibrés ; l’auto-déclaration n’est pas fiable (anti-pattern 4) |
def should_escalate(turn) -> bool: if turn.user_explicitly_requested_human: return True # immédiat if turn.requires_capability_agent_lacks and turn.resolution_attempts_exhausted: return True # fondé sur la capacité, après avoir essayé # PAS : turn.sentiment == "angry" # PAS : turn.model_confidence < 0.7 return FalseSignal d’examen
Une option qui escalade parce que le client « paraît frustré » ou parce que le modèle « a signalé une faible confiance » est un distracteur. La réponse correcte escalade sur demande explicite (maintenant) ou sur une lacune de capacité objective (après avoir tenté). La colère se gère par de bonnes réponses, non par l’aiguillage.
1.7 Hooks vs prompts pour l’application des règles
Certaines règles sont critiques — elles doivent toujours tenir (ne jamais supprimer des données de production, ne jamais valider de secrets, toujours exécuter les tests avant un commit). Faites-les respecter par du code déterministe : les hooks de Claude Code ou des gardes programmatiques dans votre boucle. N’appliquez jamais une règle critique par une instruction de prompt.
| Mécanisme d’application | Garanties | À utiliser pour |
|---|---|---|
| Instruction de prompt | Au mieux ; probabiliste ; contournable par injection | Préférences, style, orientation souple |
| Hook / garde programmatique | Déterministe ; le code de sortie 2 bloque l’action | Règles métier critiques, sécurité, barrières d’actions irréversibles |
Anti-pattern 3 · Application par prompt de règles critiques
« Ajoutez une ligne au system prompt disant à Claude de ne jamais exécuter de commandes destructrices » est la mauvaise réponse dès lors que la règle est critique. Les prompts sont probabilistes et vulnérables à l’injection. Le contrôle correct est un PreToolUse hook qui inspecte la commande et renvoie le code de sortie 2 pour la bloquer. (La mécanique des hooks relève du Domaine 2.)
1.8 Propagation d’erreurs avec contexte structuré
Les erreurs doivent porter assez de structure pour qu’un appelant (ou le modèle) puisse décider quoi faire : catégorie, indicateur réessayable, et tout résultat partiel.
class AgentError(Exception): def __init__(self, category, message, retryable, partial=None): self.category = category # e.g. "rate_limit", "validation", "timeout", "auth" self.message = message # specific, diagnostic self.retryable = retryable # drives backoff vs. escalate self.partial = partial # data gathered before failure
# À la frontière, renvoyer un contenu d'erreur structuré sur lequel le modèle peut raisonner :tool_result = { "type": "tool_result", "tool_use_id": tu_id, "is_error": True, "content": json.dumps({ "category": "rate_limit", "retryable": True, "retry_after": 12, "partial": partial_rows, }),}Anti-patterns 6 & 7 · Erreurs génériques et suppression silencieuse
Renvoyer "Something went wrong" (anti-pattern 6) prive le modèle ou l’opérateur du contexte diagnostique nécessaire pour se rétablir. Renvoyer un résultat vide comme s’il s’agissait d’un succès (anti-pattern 7) est pire — cela convertit une défaillance en données erronées silencieuses en aval. Renvoyez toujours la catégorie précise, l’indicateur réessayable et tout résultat partiel.
Idempotence et réessais
Réessayez 429, 5xx et 529 avec un backoff exponentiel + jitter, et respectez retry-after. Mais ne réessayez sans danger que les opérations idempotentes — donnez aux opérations d’écriture une clé d’idempotence pour qu’un « create order » réessayé ne crée pas deux commandes.
def with_retry(fn, *, max_attempts=5): for attempt in range(max_attempts): try: return fn() except RetryableError as e: if attempt == max_attempts - 1: raise sleep(min(2 ** attempt + random.random(), 30)) # backoff + jitter1.9 État et mémoire vs conversation
L’historique de conversation n’est pas un état durable. Il est réduit par l’édition de contexte, résumé par la compaction et perdu d’une session à l’autre. Tout ce qui doit survivre appartient à un état explicite.
| Stockage | Survit | À utiliser pour |
|---|---|---|
| Conversation | Uniquement dans la fenêtre (non réduite) | Contexte de travail immédiat |
| Memory tool | D’une session à l’autre, fichiers gérés par le modèle | Faits/apprentissages que l’agent doit rappeler plus tard |
| Fichiers | Durable, vous les gérez | Artefacts, sorties intermédiaires, points de contrôle |
| Base de données / stockage externe | Durable, interrogeable, transactionnel | Commandes, tickets, état métier canonique |
Signal d’examen
« Doit persister d’une session à l’autre » ou « doit survivre à la compaction » → memory tool ou état externe, jamais l’historique de conversation. Les données métier canoniques (une commande, le statut d’un ticket) vivent toujours dans une base de données, la conversation la référençant sans la posséder.
1.10 Modélisation du coût et de la latence des systèmes multi-agents
Chaque agent et sous-agent, ce sont des appels au modèle, et le fan-out multi-agents multiplie à la fois le coût et la consommation de tokens. Modélisez cela avant de construire.
- Coût ≈ Σ sur les appels de (tokens d’entrée × prix-entrée + tokens de sortie × prix-sortie). Chaque sous-agent porte son propre system prompt et ses outils en entrée — un fan-out de 5 signifie ~5× le surcoût fixe. Le prompt caching (0,1× sur les lectures de cache) et des modèles moins chers pour les sous-tâches simples (Haiku pour la classification) réduisent cela fortement.
- Latence : le chaining ajoute les latences en série ; la parallelization borne la latence par la branche la plus lente ; les arbres coordinateur/sous-agents profonds ajoutent des allers-retours.
- Le compromis : un système de recherche multi-agents peut coûter 10 à 15× le coût en tokens d’un appel unique. Ne le justifiez que lorsque le gain de qualité ou d’ampleur est réel. Si un flux de travail atteint la barre, utilisez le flux de travail.
Single agent: 1 system + N tool round-trips (cheapest, serial)Parallel workers: 1 orchestrator + K×(system+tools) (fast, K× fixed cost)Deep hierarchy: coordinator + Σ subagents + aggregation (most capable, most $$)1.11 Observabilité
On ne peut pas opérer ce qu’on ne voit pas. Un système multi-agents a besoin de :
- Traces par agent — chaque agent/sous-agent émet un span avec ses entrées, appels d’outils,
stop_reason, tokens et coût. - Identifiants de corrélation — un ID de requête unique tissé à travers le coordinateur et chaque sous-agent pour reconstruire une tâche unique de bout en bout.
- Métriques — latence par agent (p50/p95), taux d’erreur par catégorie, nombre de réessais, tokens et coût par tâche, taux de succès du cache.
- Journaux structurés sans secrets.
Signal d’examen
« Nous ne savons pas quel sous-agent a causé la défaillance » → le contrôle manquant est des traces par agent plus un identifiant de corrélation, non plus de réessais ni un modèle plus gros.
1.12 Variantes d’orchestration et leurs modes de défaillance
Au-delà des six patrons de base, les rédacteurs d’items les combinent en variantes nommées. Reconnaître la variante vous indique le mode de défaillance à surveiller.
Hierarchical (hiérarchique : coordinateur → sous-coordinateurs → workers)
[Root coordinator] / \ [Sub-coord A] [Sub-coord B] / \ / \ [W1] [W2] [W3] [W4] isolated contexts throughoutÀ utiliser quand une tâche se décompose en grands sous-domaines qui ont eux-mêmes besoin d’être décomposés. Modes de défaillance : la perte de contexte s’aggrave à chaque palier (chaque niveau doit passer le contexte explicitement) ; le coût et la latence se cumulent (chaque palier ajoute des allers-retours) ; une défaillance en milieu de palier peut orphelin un sous-arbre entier.
Pipeline with feedback (pipeline avec retour : chaining + evaluator-optimizer)
[Extract] ─► [Transform] ─► [Load] ─► [Evaluate] ▲ │ fail └──────────── targeted retry ◄───────┘À utiliser quand un pipeline fixe a besoin d’une barrière de qualité en fin de course capable de renvoyer le travail à une étape spécifique. Modes de défaillance : un retour vers la mauvaise étape ; des boucles de retour non bornées sans arrêt objectif ; l’évaluateur partageant la session du générateur (#9).
Blackboard / shared-state coordination (tableau noir : coordination par état partagé)
[Agent A] ─┐ ┌─► reads/writes [Agent B] ─┼─► [Shared state store] ◄─┼─ [Agent C] [Agent D] ─┘ └─► reads/writesÀ utiliser quand plusieurs agents contribuent à un artefact commun en évolution (un document de recherche, un plan). Modes de défaillance : conditions de course et pertes de mises à jour sur le stockage partagé ; aucun propriétaire unique du « done » ; lectures périmées. Corrigez par des écritures transactionnelles, du versionnage et un seul coordinateur qui décide de l’achèvement.
| Variante | Idéal pour | Défaillance caractéristique | Garde |
|---|---|---|---|
| Hierarchical | Domaines profonds, décomposables | Perte de contexte & coût cumulatifs | Contexte explicite à chaque palier ; justifier la profondeur |
| Pipeline + feedback | Flux fixe avec barrière de qualité | Retour vers la mauvaise étape / non borné | Arrêt objectif ; router vers la bonne étape |
| Blackboard | Artefact partagé en évolution | Courses, aucun propriétaire du « done » | Transactions, versionnage, un seul coordinateur |
Signal d’examen
Un énoncé qui ajoute des paliers ou des agents sans bénéfice énoncé teste si vous allez sur-concevoir. La réponse correcte conserve la topologie la moins profonde qui atteint la barre et nomme le mode de défaillance que la structure supplémentaire introduirait.
1.13 Le calcul de coût et de latence que l’on peut vous demander
L’examen peut vous donner des comptes de tokens et des prix, et vous demander le coût relatif de deux topologies. Utilisez les prix de septembre 2026 (entrée/sortie par million de tokens) : Opus 5 $5/$25, Sonnet 5 $2/$10, Haiku 4.5 $1/$5, Fable 5.1 $10/$50. Lectures de cache ≈ 0,1× entrée ; Batch ≈ 0,5×.
Exemple travaillé — agent unique vs fan-out à 5 workers. Chaque appel porte un préfixe stable de 10k tokens (system + outils) et produit 1k de sortie. Sur Opus 5 :
Per call input = 10,000 tokens × $5 / 1,000,000 = $0.050Per call output = 1,000 tokens × $25 / 1,000,000 = $0.025Per call total = $0.075
Single agent, 4 tool round-trips ≈ 4 × $0.075 = $0.3005-worker fan-out (each 1 call) + 1 synthesis = 6 × $0.075 = $0.450 ...but each worker re-sends the 10k prefix, so the fixed overhead is paid 6× instead of being amortised — fan-out is ~1.5× here, and grows with prefix size and worker count.Deux leviers qui changent la réponse :
- Prompt caching. Si le préfixe de 10k est mis en cache, chaque lecture coûte
10,000 × $0.50/1,000,000 = $0.005au lieu de $0.050 — le surcoût fixe du fan-out s’effondre et la pénalité multi-agents diminue drastiquement. - Mix de modèles. Aiguillez les workers simples vers Haiku ($1/$5) et réservez Opus à la synthèse ; une conception à 5 workers Haiku + synthèse Opus peut passer sous le coût d’un agent unique tout-Opus tout en ajoutant de l’ampleur.
| Topologie | Surcoût fixe payé | Latence | Quand elle gagne |
|---|---|---|---|
| Agent unique | Une fois (amorti) | Allers-retours en série | Le moins cher ; la tâche tient dans un contexte |
| Workers parallèles | K× (par worker) | ≈ branche la plus lente | Latence critique, travail indépendant |
| Hiérarchie profonde | Σ sur les paliers | Somme des allers-retours de palier | Uniquement quand le gain d’ampleur/qualité est réel |
Signal d’examen
« MOST cost-effective » avec un fan-out dans l’énoncé récompense généralement le fait de mettre en cache le préfixe stable et d’aiguiller les sous-tâches simples vers des modèles moins chers — non « utiliser un modèle plus gros » ni « ajouter plus d’agents ». Si un flux de travail atteint la barre, le flux de travail est la réponse la plus économique.
1.14 Les barrières human-in-the-loop comme architecture de premier plan
L’autonomie est un spectre. L’architecte choisit où un humain se place dans la boucle et rend cette barrière déterministe, non une requête de prompt.
| Niveau d’autonomie | Rôle de l’humain | Mécanisme correct |
|---|---|---|
| Suggestion seule | L’humain approuve chaque action | Plan mode / permission ask sur tous les effets |
| Écriture barrée | L’humain approuve les seules actions irréversibles | PreToolUse hook (exit 2) sur les paiements, suppressions, envois |
| Autonome-avec-audit | L’humain revoit a posteriori | Journaux structurés, traces, provenance |
| Totalement autonome | Aucun | Uniquement pour des actions réversibles à faible enjeu |
La barrière se place sur l’irréversibilité et le rayon d’impact, non sur la confiance du modèle ni le ton de l’utilisateur. Un remboursement au-dessus d’un seuil, un déploiement en production, un e-mail sortant vers une liste de clients — ceux-ci reçoivent une barrière dure, quel que soit le degré de certitude que le modèle prétend avoir.
Signal d’examen
« Doit toujours exiger une approbation humaine avant X » → une barrière déterministe (hook / permission), et la barrière est choisie selon l’irréversibilité de X. Toute option qui barre sur la confiance (#4) ou le sentiment (#5) est fausse, même quand l’action est réellement risquée.
Idées reçues fréquentes
| Idée reçue | Réalité | Pourquoi cela compte à l’examen |
|---|---|---|
| « Plus d’agents = meilleures réponses. » | Plus d’agents multiplient coût/latence et ajoutent des modes de défaillance ; ils n’aident que lorsque l’ampleur ou la qualité s’améliore de façon démontrable. | Le distracteur de sur-conception est la mauvaise réponse la plus fréquente en D1. |
| « Le modèle qui dit “done” signifie qu’il a fini. » | Seul stop_reason == end_turn signifie fini ; la prose n’est pas un signal de contrôle. | L’anti-pattern 1 apparaît dans beaucoup d’énoncés déguisé en « flexible ». |
| « Un plafond d’itérations garde ma boucle correcte. » | Un plafond ne borne que le coût ; la justesse vient de stop_reason. | Anti-pattern 2 ; le piège du plafond-comme-achèvement. |
| « Les sous-agents peuvent voir ce que sait le coordinateur. » | Les contextes sont isolés ; rien n’est hérité — vous devez passer le contexte explicitement. | Le distracteur caractéristique de Multi-Agent Research. |
| « Escalader les cas frustrés ou à faible confiance. » | Escaladez sur demande explicite ou lacune de capacité ; le sentiment et l’auto-déclaration ne sont pas fiables. | Anti-patterns 4 et 5, testés ensemble. |
| « Une règle forte de system prompt suffit pour une politique critique. » | Les prompts sont probabilistes et injectables ; les règles critiques exigent des hooks déterministes. | Anti-pattern 3 ; hooks-vs-prompts est une décision récurrente. |
| « Réessayer tout appel échoué est sans danger. » | Seules les opérations idempotentes sont sûres à réessayer ; les écritures ont besoin d’une clé d’idempotence. | Énoncés de double débit/double remboursement. |
| « Managed Agents et l’Agent SDK sont interchangeables. » | Managed Agents hébergent la boucle/le sandbox (rapide, moins de contrôle) ; le SDK est auto-hébergé (contrôle, outils personnalisés, votre VPC). | Les items de choix d’hébergement dépendent de la contrainte énoncée. |
Étude de scénario — un système de recherche qui « perd le fil »
Situation. Une équipe livre un assistant d’étude de marché. Un coordinateur découpe une question en sous-questions et dispatche des sous-agents qui recherchent et résument chacun. En production, deux problèmes apparaissent : (1) les sous-agents contredisent parfois des découvertes que le coordinateur avait déjà établies, et (2) lorsque l’API de recherche d’un sous-agent expire, le rapport final est livré comme s’il était complet, omettant parfois un concurrent entier. La direction se plaint aussi que le système coûte 12× un appel Opus unique et demande s’il faudrait le simplifier. La barre de précision a été atteinte en test par une conception en deux étapes « plan → résumé-parallèle → synthèse ».
Trace de raisonnement d’expert.
-
Nommer le patron. Les sous-questions sont décidées à l’exécution à partir des découvertes → c’est orchestrator-workers, donc attendez-vous aux modes de défaillance coordinateur/sous-agents, non à un correctif de routing ou de chaining.
-
Diagnostiquer le problème (1). Des sous-agents « contredisant des découvertes connues » est le symptôme classique du contexte isolé : les sous-agents n’ont jamais reçu les faits établis par le coordinateur. Le correctif est le passage de contexte explicite dans le prompt de tâche de chaque sous-agent avec une forme de retour fixe — non une fenêtre plus grande (option tentante mais aveugle aux contraintes) et non un meilleur modèle.
-
Diagnostiquer le problème (2). Présenter un rapport partiel comme complet après un timeout est une suppression silencieuse (#7). Le correctif est une erreur structurée (
category:"timeout", retryable:true) remontée au coordinateur, qui réessaie alors le réessayable, continue avec un quorum en notant la lacune, ou escalade — jamais un rejet silencieux et jamais un générique « research failed » (#6). -
Traiter la question du coût/de la simplification. La conception en deux étapes atteignait déjà la barre de précision. La topologie profonde et coûteuse est de la sur-conception. La décision correcte est d’utiliser la conception plus simple et de n’ajouter de la complexité que là où elle améliore les résultats de façon démontrable — tout en mettant en cache le préfixe stable et en aiguillant les résumés simples vers Haiku pour réduire le coût restant. Rejeter « utiliser un modèle plus gros » et « ajouter plus de sous-agents » est essentiel.
-
Rendre les défaillances observables. Ajoutez des spans de trace par agent + un identifiant de corrélation pour que le prochain timeout soit attribuable, en rejetant « ajouter plus de réessais » comme correctif d’observabilité.
Décision correcte à l’examen : passage de contexte explicite + gestion structurée des défaillances partielles avec un quorum + repli sur la conception en deux étapes + caching/mix de modèles pour le coût + traces par agent. Chaque option rejetée correspond à un anti-pattern nommé (ignorance de l’isolation, #7, #6, sur-conception, escalade sur confiance/sentiment) — ce qui est exactement la façon dont les distracteurs sont construits.
Pièges d’examen dans ce domaine
| Piège | Pourquoi c’est faux |
|---|---|
| Construire un système multi-agents pour une séquence fixe et connue | Sur-conçu ; un workflow (ou un prompt unique) est correct |
| Terminer la boucle quand le texte du modèle dit « done » | La prose n’est pas un signal de contrôle (anti-pattern 1) |
| Arrêter l’agent uniquement par un plafond d’itérations | Le plafond est un filet de sécurité, non l’arrêt principal ; utilisez stop_reason (anti-pattern 2) |
Traiter max_tokens comme un achèvement de tâche | Cela signifie une sortie tronquée, non terminée |
| Escalader parce que le client paraît en colère | Sentiment ≠ complexité (anti-pattern 5) |
| Escalader sur la confiance auto-déclarée du modèle | Les modèles sont mal calibrés (anti-pattern 4) |
| Appliquer une règle critique via une ligne de system prompt | Les prompts sont probabilistes ; utilisez un hook (anti-pattern 3) |
| Supposer que les sous-agents héritent du contexte du coordinateur | Les contextes sont isolés ; passez le contexte explicitement |
| Renvoyer un message d’erreur générique | Masque les diagnostics nécessaires à la reprise (anti-pattern 6) |
| Écarter un sous-agent en échec et présenter le reste comme complet | La défaillance silencieuse devient une donnée erronée (anti-pattern 7) |
| Garder l’état devant persister uniquement dans l’historique de conversation | Réduit/compacté/perdu ; utilisez le memory tool ou une base de données |
| Réessayer une écriture non idempotente sur 429 | Duplique l’effet de bord ; utilisez une clé d’idempotence |
| Ajouter des paliers/agents sans bénéfice énoncé | Cumule coût, latence et perte de contexte ; gardez la topologie la moins profonde qui atteint la barre |
| « Utiliser un modèle plus gros » pour réduire le coût du fan-out | Mettez plutôt en cache le préfixe stable et aiguillez les workers simples vers des modèles moins chers |
| Barrer une action irréversible sur la confiance du modèle | Barrez sur l’irréversibilité avec un hook déterministe, jamais sur l’auto-déclaration (#4) |
Traiter pause_turn comme un achèvement | Cela signifie reprendre un server tool long ; continuez la boucle |
| Compter sur un blackboard partagé sans propriétaire du « done » | Utilisez des écritures transactionnelles, du versionnage et un seul coordinateur qui décide de l’achèvement |
Questions d’entraînement
Chaque item indique combien de réponses sélectionner. Tentez-le avant de révéler.
Q1 · Une équipe traite des tickets de support qui suivent toujours les mêmes trois étapes : classifier, rédiger une réponse et vérifier la réponse contre la politique. Elle demande s’il faut construire un agent autonome. Quelle est la MEILLEURE architecture ? (Sélectionnez une réponse)
A. Un agent autonome qui décide chaque étape à l’exécution pour la flexibilité. B. Un workflow de prompt chaining avec une barrière de politique programmatique entre les étapes de rédaction et d’envoi. C. Un système multi-agents avec un coordinateur et trois sous-agents. D. Un unique méga-prompt qui fait les trois d’un coup.
Réponse : B. Les étapes sont fixes et connues, donc le flux de contrôle doit être du code, non le modèle — prompt chaining avec une barrière. Un agent autonome (A) et un système multi-agents (C) sont sur-conçus pour une séquence fixe. Un méga-prompt unique (D) perd la précision par étape et la barrière de politique.
Q2 · La boucle d’agent d’un ingénieur se termine quand le texte de la réponse de Claude contient la phrase « task complete ». Parfois elle s’arrête trop tôt ou ne s’arrête jamais. Quel est le correctif correct ? (Sélectionnez une réponse)
A. Ajouter d’autres phrases à faire correspondre, comme « finished » et « done ».
B. Plafonner la boucle à 10 itérations et s’arrêter là.
C. Piloter la terminaison depuis stop_reason : continuer tant qu’il vaut tool_use, s’arrêter sur end_turn, et traiter max_tokens et refusal explicitement.
D. Baisser la température pour que la formulation soit cohérente.
Réponse : C. C’est l’anti-pattern 1 — analyser la prose pour la terminaison. Le signal de contrôle est stop_reason. Plus de phrases (A) analyse encore la prose. Un plafond d’itérations (B) n’est qu’un filet de sécurité (anti-pattern 2). La température (D) ne fait pas de la prose un signal de contrôle fiable.
Q3 · Un agent coordinateur délègue une sous-question à un sous-agent, mais la réponse du sous-agent ignore des découvertes que le coordinateur avait déjà rassemblées. Quelle est la cause racine et le correctif ? (Sélectionnez une réponse)
A. Le sous-agent a besoin d’une fenêtre de contexte plus grande. B. Le contexte du sous-agent est isolé et n’a pas hérité des découvertes ; le coordinateur doit passer explicitement le contexte pertinent dans le prompt de tâche du sous-agent. C. Le coordinateur devrait utiliser un modèle plus performant. D. Augmenter max_tokens sur le sous-agent.
Réponse : B. Les contextes des sous-agents sont isolés par conception. Compter sur l’auto-héritage est un distracteur central. La taille du contexte (A, D) et le choix du modèle (C) ne traitent pas un contexte manquant qui n’a jamais été passé.
Q4 · Un agent de support client doit escalader vers un humain. Quels DEUX déclencheurs sont corrects ? (Sélectionnez deux réponses)
A. Le client demande explicitement à parler à un humain. B. Le message du client a un sentiment négatif. C. La tâche exige une autorité de remboursement que l’agent n’a pas, après que l’agent a tenté les parties résolubles. D. Le modèle auto-déclare une confiance de 55 %. E. La réponse fait plus de 200 mots.
Réponse : A et C. La demande explicite escalade immédiatement ; une véritable lacune de capacité escalade après avoir tenté la résolution. Le sentiment (B) est l’anti-pattern 5, la confiance auto-déclarée (D) est l’anti-pattern 4, et la longueur (E) est sans rapport.
Q5 · Un système ne doit jamais valider de code qui échoue à la suite de tests. Une proposition ajoute « Toujours exécuter les tests avant de valider » au system prompt du projet. Pourquoi est-ce insuffisant et qu’est-ce qui est correct ? (Sélectionnez une réponse)
A. C’est suffisant si l’instruction est assez appuyée. B. Les instructions de prompt sont probabilistes et vulnérables à l’injection ; appliquez la règle avec un hook déterministe (PreToolUse sur le commit) qui bloque avec le code de sortie 2 quand les tests échouent. C. Utiliser un modèle plus gros pour qu’il suive les instructions de façon fiable. D. Mettre l’instruction dans CLAUDE.md plutôt que dans le system prompt.
Réponse : B. C’est l’anti-pattern 3 — application par prompt d’une règle critique. Les règles critiques exigent des hooks déterministes. L’emphase (A), la taille du modèle (C) et l’emplacement du fichier (D) ne rendent pas déterministe un contrôle probabiliste.
Q6 · Un sous-agent parmi cinq d’une tâche de recherche expire. Quel est le MEILLEUR comportement du coordinateur ? (Sélectionnez une réponse)
A. Écarter en silence le sous-agent en échec et présenter les quatre résultats comme la réponse complète. B. Enregistrer une erreur structurée (catégorie timeout, réessayable true), réessayer la tâche réessayable, et si l’échec persiste continuer avec un quorum en notant la lacune ou escalader. C. Jeter tous les résultats et relancer toute la tâche. D. Renvoyer un message générique « research failed ».
Réponse : B. Erreur structurée plus décision explicite. L’écarter en silence (A) est l’anti-pattern 7. Tout relancer (C) gâche les bons résultats. Un message générique (D) est l’anti-pattern 6.
Q7 · Une équipe doit livrer rapidement un agent, avec des outils standard et une infrastructure minimale à opérer. Quel choix d’hébergement convient le MIEUX ? (Sélectionnez une réponse)
A. Claude Agent SDK, en auto-hébergeant la boucle et le sandbox. B. Managed Agents, où Anthropic héberge la boucle et le sandbox. C. Construire un moteur d’orchestration personnalisé de zéro. D. Tool Runner avec un sandbox entièrement personnalisé.
Réponse : B. Managed Agents minimisent l’infrastructure et sont les plus rapides vers la production pour des outils standard. L’Agent SDK (A) et un moteur personnalisé (C) sont pour les équipes ayant besoin d’outils sur mesure et de contrôle. Tool Runner (D) implique que vous hébergez l’exécution des outils.
Q8 · Un agent orchestrateur doit décider les sous-tâches à l’exécution car elles dépendent de ce qu’il trouve. Quel est ce patron et quel est son risque caractéristique ? (Sélectionnez une réponse)
A. Prompt chaining ; le risque est l’erreur de classification. B. Orchestrator-workers ; le risque inclut de compter sur l’héritage du contexte et des défaillances partielles non gérées. C. Routing ; le risque est le cumul d’erreurs. D. Voting ; le risque est le biais partagé.
Réponse : B. Des sous-tâches décidées à l’exécution définissent orchestrator-workers. Ses risques caractéristiques sont les modes de défaillance coordinateur/sous-agents. Les autres options nomment mal le patron ou son risque.
Q9 · Un agent de facturation réessaie un appel d’API « create refund » après un 429 et le client reçoit deux remboursements. Qu’est-ce qui a mal tourné et comment concevoir les réessais ? (Sélectionnez une réponse)
A. Le backoff était trop court ; augmentez-le. B. Une écriture non idempotente a été réessayée ; utilisez une clé d’idempotence pour que les réessais ne dupliquent pas l’effet de bord, et ne réessayez qu’avec backoff et jitter en respectant retry-after. C. L’agent ne devrait jamais réessayer aucune requête. D. Utiliser un modèle plus gros pour éviter l’erreur.
Réponse : B. Réessayer une écriture non idempotente duplique l’effet. Les clés d’idempotence rendent les réessais sûrs. Un backoff plus long (A) n’empêche pas la duplication ; ne jamais réessayer (C) est inutile pour les appels idempotents ; la taille du modèle (D) est sans rapport.
Q10 · Un agent doit se rappeler la préférence énoncée d’un client à travers des sessions distinctes séparées de plusieurs jours. Où cela devrait-il vivre ? (Sélectionnez une réponse)
A. Dans l’historique de conversation, qui persiste automatiquement. B. Dans le memory tool ou un stockage externe, car l’historique de conversation est réduit, compacté et non conservé d’une session à l’autre. C. Dans le system prompt, codé en dur par client. D. Dans un réglage de max_tokens plus élevé.
Réponse : B. La persistance inter-sessions exige le memory tool ou un état externe. L’historique de conversation (A) ne survit pas d’une session à l’autre ni à la compaction. Le codage en dur (C) ne passe pas à l’échelle ; max_tokens (D) est sans rapport.
Q11 · Une boucle evaluator-optimizer réutilise la même conversation pour générer et évaluer une traduction, et la qualité plafonne. Quel est le défaut et le correctif ? (Sélectionnez une réponse)
A. Le modèle générateur est trop petit ; améliorez-le. B. L’auto-revue dans la même session conserve le biais de raisonnement du générateur ; exécutez l’évaluateur comme un contexte indépendant (session vierge, idéalement un modèle différent) contre des critères explicites. C. La boucle a besoin de plus d’itérations. D. Baisser la température pour réduire la variance.
Réponse : B. C’est l’anti-pattern 9 — auto-revue dans la même session. Un évaluateur indépendant supprime le biais partagé. La taille du modèle (A), plus d’itérations (C) et la température (D) ne corrigent pas la source du biais.
Q12 · Les opérateurs d’un système multi-agents ne peuvent pas dire quel sous-agent a causé une tâche en échec. Quel changement traite cela le PLUS directement ? (Sélectionnez une réponse)
A. Ajouter plus de réessais à chaque sous-agent. B. Émettre un span de trace par agent et tisser un identifiant de corrélation à travers le coordinateur et tous les sous-agents. C. Basculer chaque sous-agent sur Opus 5. D. Augmenter le plafond d’itérations.
Réponse : B. Des traces par agent plus un identifiant de corrélation permettent de reconstruire une tâche unique et de localiser l’agent défaillant. Les réessais (A), le choix du modèle (C) et les plafonds (D) n’améliorent pas l’observabilité.
Q13 · Trois sous-tâches indépendantes de résumé de documents doivent se terminer le plus vite possible. Quel patron et pourquoi ? (Sélectionnez une réponse)
A. Prompt chaining, parce que c’est le plus simple. B. Parallelization par sectioning, parce que les sous-tâches sont indépendantes et la latence est bornée par la branche la plus lente plutôt que par la somme. C. Evaluator-optimizer, parce qu’il améliore la qualité. D. Agent autonome, pour la flexibilité.
Réponse : B. Des sous-tâches indépendantes plus un objectif de latence, c’est du sectioning de manuel. Le chaining (A) les exécute en série. Evaluator-optimizer (C) et agent autonome (D) ne correspondent pas à un travail parallèle indépendant.
Q14 · Quelles affirmations sur la terminaison de boucle sont correctes ? (Sélectionnez deux réponses)
A. stop_reason == "end_turn" est le signal principal que le modèle a terminé.
B. stop_reason == "max_tokens" signifie que la tâche s’est terminée avec succès.
C. Un plafond d’itérations devrait être le seul mécanisme d’arrêt.
D. Un plafond d’itérations ou de coût est un filet de sécurité valide en complément de stop_reason.
E. Analyser le texte de la réponse pour « complete » est l’approche recommandée.
Réponse : A et D. end_turn signale l’achèvement ; un plafond est un filet de sécurité légitime. max_tokens (B) signifie une troncature, un plafond unique (C) est l’anti-pattern 2, et l’analyse de la prose (E) est l’anti-pattern 1.
Q15 · Un système de recherche proposé utilise un coordinateur avec huit sous-agents alors qu’un workflow en deux étapes atteindrait la barre de précision. La latence et le coût sont des contraintes. Quelle est la MEILLEURE décision ? (Sélectionnez une réponse)
A. Construire le système à huit sous-agents pour une capacité maximale. B. Utiliser le workflow en deux étapes, puisqu’il atteint la barre à un coût et une latence bien moindres ; n’ajouter de la complexité que si elle améliore les résultats de façon démontrable. C. Utiliser un unique agent autonome avec dix-huit outils. D. Utiliser le voting sur huit exécutions du même prompt.
Réponse : B. La solution la plus simple qui atteint l’exigence. Le système à huit sous-agents (A) multiplie coût/latence sans bénéfice prouvé. Un agent à 18 outils (C) est l’anti-pattern 8. Le voting à huit (D) est coûteux et injustifié.
Q16 · Un appel d’outil échoue et l’outil renvoie une liste vide, que l’agent traite comme « aucun résultat trouvé » et rapporte comme un succès. Quel anti-pattern est-ce et qu’est-ce qui est correct ? (Sélectionnez une réponse)
A. Anti-pattern 2 ; ajouter un plafond d’itérations. B. Anti-pattern 7 (suppression silencieuse d’erreur) ; renvoyer une erreur structurée avec catégorie et indicateur réessayable pour que l’agent distingue un vrai résultat vide d’une défaillance. C. Anti-pattern 5 ; arrêter d’escalader sur le sentiment. D. Il n’y a pas de problème ; les résultats vides sont normaux.
Réponse : B. Convertir une défaillance en succès vide est une suppression silencieuse (anti-pattern 7). Le correctif est un contenu d’erreur structuré pour que « échoué » ne soit jamais confondu avec « aucun résultat ». Les autres options identifient mal le problème.
Q17 · Un système hiérarchique utilise un coordinateur racine, deux sous-coordinateurs et quatre workers. Des découvertes établies à la racine manquent trois paliers plus bas. Quelle est la cause racine et le correctif ? (Sélectionnez une réponse)
A. Les workers ont besoin de fenêtres de contexte plus grandes. B. Le contexte est isolé à chaque palier ; chaque niveau doit passer explicitement le contexte pertinent au suivant — l’héritage ne se produit jamais automatiquement à aucune profondeur. C. Le coordinateur racine devrait utiliser Opus 5. D. Le thinking devrait être désactivé au palier des workers.
Réponse : B. L’isolation s’applique à chaque palier, donc le contexte doit être tissé explicitement jusqu’en bas. La taille de fenêtre (A) et le modèle (C) ne fournissent pas un contexte jamais passé ; le thinking (D) est sans rapport.
Q18 · Chaque appel porte un préfixe stable de 10k tokens à $5/M en entrée. Le fan-out vers cinq workers plus une synthèse paie le préfixe six fois. Quel changement réduit le PLUS la pénalité de coût du fan-out ? (Sélectionnez une réponse)
A. Augmenter max_tokens sur chaque worker. B. Mettre en cache le préfixe stable pour que chaque lecture coûte ~0,1×, effondrant le surcoût fixe répété, et aiguiller les workers simples vers Haiku 4.5. C. Ajouter plus de workers pour paralléliser davantage. D. Basculer chaque worker sur Fable 5.1 à $10/$50.
Réponse : B. Le caching réduit le préfixe répété de 10k de ~$0.05 à ~$0.005 par lecture et des modèles moins chers le réduisent encore. max_tokens (A) augmente le coût de sortie, plus de workers (C) paient le surcoût plus de fois, et Fable 5.1 (D) est le modèle le plus cher.
Q19 · Un agent de paiement doit toujours exiger une approbation humaine avant tout transfert supérieur à $10,000, même si un résultat d’outil prétend une pré-approbation. Quelle barrière est correcte ? (Sélectionnez une réponse)
A. Escalader seulement si la confiance du modèle est inférieure à 80 %. B. Un PreToolUse hook déterministe sur l’outil de transfert qui inspecte le montant et sort en 2 au-dessus du seuil, aiguillant vers un humain — indépendamment de toute pré-approbation prétendue. C. Escalader si le client paraît anxieux. D. Une règle de system prompt pour toujours demander avant les gros transferts.
Réponse : B. Les actions irréversibles à forte valeur reçoivent une barrière déterministe calée sur le montant, immunisée contre une « pré-approbation » injectée. La confiance (A) est le #4, le sentiment (C) est le #5, et une règle de prompt (D) est le #3.
Q20 · Un pipeline ETL fixe a besoin d’une barrière de qualité en fin de course capable de renvoyer les échecs à l’étape spécifique qui les a produits. Quelle variante convient, et qu’est-ce qui doit être borné ? (Sélectionnez une réponse)
A. Blackboard coordination ; borner le nombre d’agents. B. Pipeline avec retour (chaining + evaluator-optimizer) ; borner le retour avec un critère d’arrêt objectif et router les échecs vers la bonne étape (en utilisant un évaluateur indépendant). C. Agent autonome ; borner les outils. D. Routing ; borner les classes.
Réponse : B. Un flux fixe avec une barrière de qualité qui renvoie est un pipeline-avec-retour ; il a besoin d’un arrêt objectif et d’un routage vers la bonne étape, avec un évaluateur indépendant pour éviter le #9. Les autres nomment mal la variante.
Q21 · Trois agents écrivent simultanément dans un document de recherche partagé et des mises à jour se perdent ; aucun composant ne décide quand le document est « done ». Quel est le MEILLEUR correctif ? (Sélectionnez deux réponses)
A. Sérialiser toutes les écritures via des mises à jour transactionnelles et versionnées du stockage partagé. B. Laisser chaque agent décider indépendamment quand le document est complet. C. Désigner un seul coordinateur qui possède la décision de « done » et agrège. D. Supprimer le stockage partagé et donner à chaque agent sa propre copie sans fusion. E. Augmenter la fenêtre de contexte de chaque agent.
Réponse : A et C. Des écritures transactionnelles/versionnées empêchent les pertes de mises à jour et un propriétaire unique du « done » résout la lacune de coordination. L’achèvement indépendant (B) n’a pas de propriétaire, des copies non fusionnées (D) perdent l’artefact partagé, et la taille de fenêtre (E) est sans rapport.
Q22 · Une équipe débat Managed Agents vs l’Agent SDK. La seule contrainte dure est que l’exécution des outils doit tourner dans leur propre VPC sur leur matériel ; sinon ils veulent de la rapidité. Qu’est-ce qui est correct ? (Sélectionnez une réponse)
A. Managed Agents, parce que la rapidité compte le plus. B. L’Agent SDK, en auto-hébergeant la boucle et le sandbox pour que l’exécution reste dans leur VPC — la contrainte dure prime sur la préférence de rapidité. C. L’un ou l’autre convient ; la contrainte est une préférence. D. Un moteur sur mesure construit de zéro.
Réponse : B. Une contrainte de conformité dure (VPC/matériel propres) force l’auto-hébergement via l’Agent SDK. Managed Agents (A) hébergent le sandbox chez Anthropic ; la contrainte n’est pas une préférence (C) ; un moteur construit de zéro (D) est une réinvention inutile.
Points clés à retenir
- Préférez l’architecture la plus simple qui atteint l’exigence : prompt unique < workflow < agent < multi-agents.
- Connaissez les six patrons et leurs modes de défaillance ; associez le patron à qui — vous ou le modèle — décide du flux de contrôle.
- Pilotez la terminaison de boucle depuis
stop_reason; n’utilisez les plafonds que comme filet de sécurité ; traitezmax_tokenscomme une troncature,pause_turncomme une reprise etrefusalcomme un arrêt-et-escalade. - Passez le contexte aux sous-agents explicitement à chaque palier — les contextes isolés n’auto-héritent jamais ; spécifiez la forme du retour pour une agrégation propre.
- Gérez la défaillance partielle avec des erreurs structurées et une décision explicite (quorum, réessai, escalade) — jamais des rejets silencieux.
- Escaladez sur demande explicite (maintenant) ou lacune de capacité (après avoir tenté) ; jamais sur le sentiment ni la confiance auto-déclarée.
- Appliquez les règles critiques et les barrières d’actions irréversibles avec des hooks/permissions déterministes, calés sur le rayon d’impact, non des instructions de prompt.
- Persistez tout ce qui est durable dans le memory tool ou un état externe ; ne réessayez que les écritures idempotentes avec backoff et jitter ; et instrumentez chaque agent avec des traces et des identifiants de corrélation.
- Reconnaissez les variantes d’orchestration (hierarchical, pipeline-with-feedback, blackboard) et le mode de défaillance que chacune introduit ; n’ajoutez des paliers que lorsque l’ampleur ou la qualité s’améliore de façon démontrable.
- Modélisez coût/latence avant de construire : mettre en cache le préfixe stable et aiguiller les sous-tâches simples vers des modèles moins chers bat généralement « modèle plus gros » ou « plus d’agents ».
- Le fan-out paie le surcoût fixe du préfixe par worker ; le caching l’effondre, ce qui en fait le levier de coût correct à l’examen.
Dernière mise à jour le 18 sept. 2026