THE FUTURE MARKETACADEMY
Your classroomRoom 01 · AI Lab
School of AI

Agents à étapes multiples : outils, mémoire et fiabilité

Step 6 of 7 in AI Lab

Next in your path: 1.5.3 Claude Code Projects: larger codebases, tests and git

What you'll be able to do
  • Écrire vous-même la boucle de l'agent et expliquer chaque message qu'elle contient (tool_use, tool_result, stop_reason).
  • Donner plusieurs outils à un agent et les concevoir pour que Claude choisisse le bon.
  • Renvoyer les erreurs à Claude de façon à ce qu'il puisse se rétablir, et savoir quand arrêter de réessayer.
  • Conserver le contexte sur de nombreuses étapes et d'une session à l'autre, grâce à la conversation, à l'outil de mémoire et à un fichier de progression.
  • Ajouter des limites et des journaux pour qu'une exécution ne puisse pas durer indéfiniment et que vous puissiez toujours voir ce qu'elle a fait.
  • Placer une étape d'approbation humaine devant tout outil risqué, et tester l'agent au complet sans payer d'appels à l'API.

Avant ce cours : Premiers pas avec les agents (cours 1.4.1) et Créer des agents IA avec Claude : du sans-code au code (cours 1.4). Vous devriez déjà connaître les mots flux de travail, agent, outil et tool runner (exécuteur d'outils), et avoir fait un premier appel à l'API en Python. Ce cours va plus loin : vous ouvrez la boucle que l'exécuteur d'outils cache, puis vous la rendez sûre et fiable. Vous avez besoin de Python 3.9 ou d'une version plus récente et d'un terminal. Les exemples utilisent claude-opus-5-5.

Words in this course 45Open the Vocabulary Hall
01

Ouvrir la boucle (la boucle manuelle de l'agent)

In simple words

Dans le cours 1.4, un robot faisait les courses et vous ne voyiez que le résultat. Maintenant, c'est vous qui tenez le porte-bloc. Claude dit "Va voir dans la réserve, s'il te plaît", vous y allez, vous écrivez la réponse sur le porte-bloc et vous la lui remettez. Puis Claude décide de ce qu'il demandera ensuite. Ce va-et-vient, c'est tout l'agent.

Key facts
  • Quand Claude veut utiliser un outil client, la réponse a un stop_reason de tool_use et un ou plusieurs blocs tool_use. Chaque bloc a un id, un name et un input (les arguments).
  • Votre code exécute l'outil, puis envoie un nouveau message user qui contient des blocs tool_result. Chaque résultat porte le tool_use_id de la demande à laquelle il répond, ainsi qu'un content et un is_error facultatif.
  • Règles de formatage tirées de la documentation : les résultats d'outils doivent venir juste après le message de l'assistant qui les a demandés, et dans le message de l'utilisateur, les blocs tool_result doivent venir en premier. Tout texte vient après.
  • Claude peut demander plusieurs outils dans un même tour. Répondez à chaque id tool_use par un tool_result correspondant.
  • La boucle se termine quand stop_reason est autre chose que tool_use (par exemple end_turn).
  • Les résultats d'outils contiennent souvent du contenu hors de votre contrôle, comme des pages Web ou des courriels. Considérez-le comme non fiable : il peut contenir des instructions destinées à tromper Claude (injection de consignes, ou prompt injection).
  • Pourquoi le faire à la main? L'exécuteur d'outils est plus simple, mais la documentation d'Anthropic dit d'utiliser la boucle manuelle quand vous avez besoin de l'approbation d'un humain, d'une journalisation personnalisée ou d'une exécution conditionnelle. C'est exactement ce que ce cours ajoute.
MessageQui l'envoieCe qu'il contient
1Vous (user)La question
2Claude (assistant)Du texte plus des blocs tool_use, stop_reason: tool_use
3Vous (user)Des blocs tool_result, un par id tool_use
4Claude (assistant)La réponse finale, stop_reason: end_turn (ou d'autres appels d'outils)
Exemple (Python, une boucle manuelle; testée avec un substitut de l'API)
import anthropic

client = anthropic.Anthropic() # reads ANTHROPIC_API_KEY

TOOLS = [{
  "name": "check_stock",
  "description": "Check how many units of a product are in stock. Use the exact product name, for example 'blue mug'.",
  "input_schema": {
    "type": "object",
    "properties": {"item": {"type": "string", "description": "Product name"}},
    "required": ["item"],
  },
}]
STOCK = {"blue mug": 12, "red mug": 0}

def check_stock(item):
  return str(STOCK[item.lower()])

messages = [{"role": "user", "content": "Do we have blue mugs and red mugs?"}]
while True:
  response = client.messages.create(
    model="claude-opus-5-5", max_tokens=1024, tools=TOOLS, messages=messages
  )
  if response.stop_reason != "tool_use":
    break
  messages.append({"role": "assistant", "content": response.content})
  results = []
  for block in response.content:
    if block.type == "tool_use":
      results.append({
        "type": "tool_result",
        "tool_use_id": block.id,
        "content": check_stock(**block.input),
      })
  messages.append({"role": "user", "content": results})

print("".join(b.text for b in response.content if b.type == "text"))

Cette boucle n'a encore ni limite ni gestion des erreurs. Les leçons 3 et 5 corrigent les deux.

Step by step
  1. Créez un dossier et un environnement virtuel Python, puis lancez pip install anthropic (le nom des commandes peut varier sous Windows).
  2. Définissez votre clé dans la variable d'environnement ANTHROPIC_API_KEY. Ne la tapez jamais dans le fichier.
  3. Créez loop.py et collez-y l'exemple ci-dessus.
  4. Lancez-le avec python loop.py.
  5. Avant l'affichage final, ajoutez print(messages) et relancez. Repérez le bloc tool_use et le bloc tool_result correspondant.
  6. Vérification : vous pouvez montrer le tool_use_id dans votre résultat et retrouver le même id dans la demande de Claude.
Watch on YouTube
Tips for building AI agentsAnthropic · YouTube · youtube.com
Getting Started with Tool Use in the Anthropic APIRam Vegiraju · YouTube · youtube.com

Videos by other creators on YouTube, for reference. They are not made by or affiliated with The Future Market.

LESSON 01Ouvrir la boucle (la boucle manuelle de l'agent)
LESSON 01 / ANIMATED LESSON / ENGLISH VOICE00:00 / 01:15
Read the video script
[Host] "Un agent, c'est une boucle. Aujourd'hui, on l'ouvre."
[Screen: le tableau des messages] "Vous posez une question. Claude répond par une demande d'outil. Vous exécutez l'outil et renvoyez un résultat avec le même id."
[Text on screen: stop_reason: tool_use] "Tant que la raison d'arrêt indique l'utilisation d'un outil, la boucle continue."
[Screen: la boucle while dans l'éditeur] "Exécutez les outils, ajoutez les résultats, rappelez Claude."
[Host] "Une fois que vous voyez la boucle, tous les cadres de développement d'agents prennent tout leur sens."
Try it now

Lancez la boucle avec une question qui nécessite les deux tasses. Affichez len(response.content) au premier tour pour voir si Claude a demandé les deux outils en même temps. Puis écrivez deux phrases qui expliquent pourquoi chaque id tool_use a besoin d'un tool_result.

ClaudeStuck? Copy a ready-made prompt for Claude

Copy this, open Claude, paste it, and Claude will walk you through the lesson step by step.

For a grown-up: Claude is for adults (18+). Copy this, paste it into Claude, and use the answer to explain the lesson to your child.

I'm learning "Agents à étapes multiples : outils, mémoire et fiabilité" on The Future Market. Lesson 1: "Ouvrir la boucle (la boucle manuelle de l'agent)".

What the lesson teaches:
- Quand Claude veut utiliser un outil client, la réponse a un stop_reason de tool_use et un ou plusieurs blocs tool_use. Chaque bloc a un id, un name et un input (les arguments).
- Votre code exécute l'outil, puis envoie un nouveau message user qui contient des blocs tool_result. Chaque résultat porte le tool_use_id de la demande à laquelle il répond, ainsi qu'un content et un is_error facultatif.
- Règles de formatage tirées de la documentation : les résultats d'outils doivent venir juste après le message de l'assistant qui les a demandés, et dans le message de l'utilisateur, les blocs tool_result doivent venir en premier. Tout texte vient après.
- Claude peut demander plusieurs outils dans un même tour. Répondez à chaque id tool_use par un tool_result correspondant.
- La boucle se termine quand stop_reason est autre chose que tool_use (par exemple end_turn).
- Les résultats d'outils contiennent souvent du contenu hors de votre contrôle, comme des pages Web ou des courriels. Considérez-le comme non fiable : il peut contenir des instructions destinées à tromper Claude (injection de consignes, ou prompt injection).
- Pourquoi le faire à la main? L'exécuteur d'outils est plus simple, mais la documentation d'Anthropic dit d'utiliser la boucle manuelle quand vous avez besoin de l'approbation d'un humain, d'une journalisation personnalisée ou d'une exécution conditionnelle. C'est exactement ce que ce cours ajoute.

The exercise I'm working on:
Lancez la boucle avec une question qui nécessite les deux tasses. Affichez len(response.content) au premier tour pour voir si Claude a demandé les deux outils en même temps. Puis écrivez deux phrases qui expliquent pourquoi chaque id tool_use a besoin d'un tool_result.

I'm stuck. Please:
1. Explain the main idea in plain, simple words with one everyday example.
2. Walk me through the exercise one small step at a time. Ask me what I've done so far before giving the next step.
3. Don't just give me the final answer. Help me do it myself, and check my work when I share it.
I'm a parent helping my child (about 8 years old) with a lesson called "Ouvrir la boucle (la boucle manuelle de l'agent)" from the course "Agents à étapes multiples : outils, mémoire et fiabilité".

Here's what the lesson says:
Dans le cours 1.4, un robot faisait les courses et vous ne voyiez que le résultat. Maintenant, c'est vous qui tenez le porte-bloc. Claude dit "Va voir dans la réserve, s'il te plaît", vous y allez, vous écrivez la réponse sur le porte-bloc et vous la lui remettez. Puis Claude décide de ce qu'il demandera ensuite. Ce va-et-vient, c'est tout l'agent.

The activity:
Lancez la boucle avec une question qui nécessite les deux tasses. Affichez len(response.content) au premier tour pour voir si Claude a demandé les deux outils en même temps. Puis écrivez deux phrases qui expliquent pourquoi chaque id tool_use a besoin d'un tool_result.

Please explain this so an 8-year-old understands: short sentences, a fun everyday example, and no hard words.
Then give me 3 simple questions I can ask my child to check they understood, and a way to do the activity together, one tiny step at a time.
Open Claude
Sources
My notes
02

Plusieurs outils, bien conçus

This lesson is part of full access: every course and every level for one payment.

03

Quand un outil échoue (reprise après erreur)

This lesson is part of full access: every course and every level for one payment.

04

La mémoire et le contexte sur de nombreuses étapes

This lesson is part of full access: every course and every level for one payment.

05

Des limites et des journaux

This lesson is part of full access: every course and every level for one payment.

06

L'approbation humaine pour les étapes risquées

This lesson is part of full access: every course and every level for one payment.

07

Tester l'agent sans payer à chaque exécution

This lesson is part of full access: every course and every level for one payment.

++

Final project

This lesson is part of full access: every course and every level for one payment.

??

Quiz

  1. Que signifie le stop_reason "tool_use"?

  2. Que doit contenir chaque tool_result pour que Claude sache à quelle demande il répond?

  3. Où doivent se placer les blocs tool_result dans le message de l'utilisateur?

  4. Comment dire à Claude qu'un outil a échoué?

  5. Qu'est-ce qui fait un bon message d'erreur pour un outil?

  6. Que fait l'outil de mémoire, et qui l'exécute?

  7. Pourquoi faut-il valider les chemins dans un gestionnaire de mémoire?

  8. Comment empêcher une longue exécution de durer indéfiniment?

  9. Quand la documentation d'Anthropic suggère-t-elle la boucle manuelle plutôt que le tool runner?

  10. Quelles sortes d'actions devraient demander l'approbation d'un humain?

  11. Comment tester votre boucle sans payer d'appels à l'API?

EX

Final exam

This lesson is part of full access: every course and every level for one payment.

CE

Certificate

This lesson is part of full access: every course and every level for one payment.