# Quiz — Session 3 (Avancé) : Claude Agent SDK

> **Programme :** Applied AI — Yann Isola
> 10 QCM (Questions à Choix Multiples) — une seule bonne réponse par question, sauf mention contraire.
> Niveau : préparation *Claude Certified Architect*. Corrigé commenté en fin de document.

---

**Q1.** Dans le Claude Agent SDK (Software Development Kit — kit de développement logiciel), quel composant exécute la boucle agentique (envoi des messages, exécution des appels d'outils, itération jusqu'à la réponse finale) ?

- A. La classe `Agent`
- B. Le décorateur `@tool`
- C. Le `Runner`
- D. Le hook `on_agent_start`

**Q2.** Lors de la définition d'un outil avec `@tool`, d'où provient la **description** transmise au modèle ?

- A. Du nom de la fonction uniquement
- B. De la docstring de la fonction
- C. D'un paramètre `description=` obligatoire du décorateur
- D. Elle est générée automatiquement par le modèle à la première utilisation

**Q3.** Comment le SDK construit-il le **schéma des paramètres** d'un outil ?

- A. À partir des annotations de type (type hints) de la signature Python
- B. En analysant le corps de la fonction à l'exécution
- C. Il faut écrire le schéma JSON (JavaScript Object Notation) à la main
- D. Les paramètres sont toujours passés en chaîne unique

**Q4.** Quelle est la différence fondamentale entre un **handoff** et un **appel d'outil** ?

- A. Le handoff est plus rapide car il évite un appel au modèle
- B. L'appel d'outil transfère l'historique complet, le handoff seulement les arguments
- C. Après un handoff, l'agent cible garde le contrôle de la conversation ; après un appel d'outil, l'agent appelant reprend la main
- D. Il n'y a pas de différence : le handoff est un alias d'appel d'outil

**Q5.** Un **input guardrail** déclenche son tripwire. Que se passe-t-il ?

- A. Le message est reformulé automatiquement puis renvoyé au modèle
- B. Le run est interrompu et une exception dédiée (`InputGuardrailTripwireTriggered`) est levée, à intercepter par l'application
- C. L'agent bascule automatiquement sur un modèle plus sûr
- D. Le guardrail est désactivé pour le reste du run

**Q6.** Un coordinateur doit pouvoir déléguer du travail à des sous-agents dans l'environnement d'exécution Claude. Quelle configuration est **indispensable** ?

- A. `max_turns` supérieur à 50
- B. Un output guardrail sur chaque sous-agent
- C. L'outil `"Task"` présent dans les `allowedTools` du coordinateur
- D. Le même modèle pour le coordinateur et les sous-agents

**Q7.** Quel est le rôle des **variables de contexte** (paramètre générique `Agent[MonContexte]`) ?

- A. Injecter du texte supplémentaire dans le system prompt
- B. Partager un état typé entre agents, outils, guardrails et hooks, **sans** l'exposer au modèle
- C. Mettre en cache les réponses du modèle entre deux runs
- D. Stocker l'historique de conversation de façon persistante

**Q8.** Vous lancez cinq analyses indépendantes en parallèle avec `asyncio.gather(...)`. Quelle option évite qu'un échec unique annule les quatre succès ?

- A. `timeout=None`
- B. `return_exceptions=True`
- C. `max_turns=1`
- D. Envelopper chaque tâche dans un output guardrail

**Q9.** Un formateur montre ce code de délégation : `Runner.run(agent_redacteur, "Rédige la section 2.")`. Pourquoi est-ce un anti-pattern ?

- A. `Runner.run` ne peut pas être appelé sur un sous-agent
- B. Le sous-agent ne partage pas la mémoire de travail du coordinateur : sans plan, ton, contexte et livrable attendu dans le prompt, la sortie sera hors-sujet
- C. Il faut toujours utiliser `run_async` pour les sous-agents
- D. La chaîne de prompt est trop courte pour être facturée

**Q10.** Un outil `initier_remboursement` peut être retenté après un timeout. Quelle précaution d'architecture est prioritaire ?

- A. Augmenter le timeout à 10 minutes
- B. Retirer l'outil de la liste et le remplacer par des instructions
- C. Rendre l'outil idempotent (clé d'idempotence) pour qu'un retry ne déclenche pas deux remboursements
- D. Confier l'outil à un modèle plus puissant

---

## Corrigé commenté

| Q | Réponse | Explication |
|---|---------|-------------|
| 1 | **C** | Le `Runner` orchestre la boucle : envoi, détection des tool calls, exécution, itération. `Agent` n'est qu'une configuration déclarative. |
| 2 | **B** | La docstring EST la description envoyée au modèle — c'est un artefact de prompt engineering, elle doit dire quand utiliser l'outil. |
| 3 | **A** | Les type hints (`str`, `int`, valeurs par défaut…) sont convertis en schéma JSON. Types complexes : Pydantic/`TypedDict`. |
| 4 | **C** | Handoff = transfert de contrôle + historique ; l'agent cible poursuit la conversation. Appel d'outil = capacité ponctuelle, l'appelant reprend la main. |
| 5 | **B** | Tripwire → interruption du run + exception dédiée. C'est à l'application de fournir la réponse de repli (jamais de stack trace à l'utilisateur). |
| 6 | **C** | Sans `"Task"` dans `allowedTools`, le coordinateur ne peut pas créer de sous-agents — il tentera de tout faire seul, silencieusement. Piège d'examen classique. |
| 7 | **B** | Les variables de contexte ne sont jamais sérialisées dans le prompt : idéales pour identifiants, secrets, état applicatif. Seul ce que les outils retournent atteint le modèle. |
| 8 | **B** | `return_exceptions=True` fait remonter les exceptions comme valeurs : on collecte les succès et on traite les échecs séparément. |
| 9 | **B** | Anti-pattern « sous-agent amnésique » : tout ce que le sous-agent doit savoir (plan, ton, contexte, format du livrable) doit être dans son prompt. |
| 10 | **C** | Un effet de bord financier retenté sans idempotence = double remboursement. La clé d'idempotence est la précaution structurelle ; le timeout n'est qu'un paramètre. |

**Barème :** 1 point par question. ≥ 8/10 : prêt pour ce domaine de la certification. 6–7 : revoir handoffs et guardrails. < 6 : refaire la session avec les exercices.
