Aller au contenu principal
Leçon 37 sur 95 · Construire avec l'API Claude

Conversations multi-tours avec outils

Leçon 37 sur 95 Mis à jour le 5 novembre 2026 Développeur
Sur cette page
  1. Plusieurs tours pour une seule question
  2. Ajouter un message à l’historique
  3. Une fonction chat qui accepte des outils
  4. Extraire le texte quand on en a besoin
  5. Ce que cette version change par rapport au cours officiel
  6. À vous de jouer
  7. Points clés à retenir

Certaines questions demandent plusieurs outils l’un après l’autre. « Quel jour serons-nous dans 103 jours ? » en est l’exemple type : Claude doit d’abord connaître la date du jour, puis lui ajouter 103 jours. Cette leçon prépare les fonctions utilitaires qui rendront cet enchaînement automatique ; la suivante écrit la boucle.

Plusieurs tours pour une seule question

Plusieurs tours pour une question Frise à quatre jalons : la question (dans 103 jours ?), le tour 1 (get_current_datetime), le tour 2 (add_duration_to_datetime avec 103 jours), la réponse finale (end_turn). MULTI-TOURS Plusieurs tours pour une question QUESTION 103 jours ? l'utilisateur demande une date TOUR 1 La date Claude demande get_current_datetime TOUR 2 Le calcul puis add_duration_to_datetime FIN La réponse stop_reason vaut end_turn Le deuxième appel dépend du résultat du premier : le nombre de tours n'est pas connu d'avance.
D'après la leçon « Multi-turn conversations with tools » (Claude Academy, Building with the Claude API).
  1. L’utilisateur demande : « Quel jour serons-nous dans 103 jours ? »
  2. Claude demande get_current_datetime.
  3. Votre code l’exécute et renvoie la date.
  4. Claude demande add_duration_to_datetime, avec cette date et 103 jours.
  5. Votre code l’exécute et renvoie le résultat.
  6. Claude répond.

Le deuxième appel dépend du résultat du premier : Claude ne peut pas le formuler avant de connaître la date. Votre code ne sait donc pas d’avance combien d’allers-retours une question demandera. D’où la boucle : relancer Claude tant qu’il demande des outils.

Ajouter un message à l’historique

Les utilitaires des sections précédentes supposaient des messages de texte simple. Avec les outils, un message contient plusieurs blocs, et ces fonctions doivent les transporter sans rien perdre :

from anthropic.types import Message

def add_user_message(messages, message):
    messages.append({
        "role": "user",
        "content": message.content if isinstance(message, Message) else message,
    })

def add_assistant_message(messages, message):
    messages.append({
        "role": "assistant",
        "content": message.content if isinstance(message, Message) else message,
    })

Les deux fonctions acceptent une chaîne, une liste de blocs ou un objet Message complet. Avec un Message, elles reprennent tous ses blocs tels quels, y compris les blocs de réflexion, que l’API exige de retrouver intacts.

Une fonction chat qui accepte des outils

def chat(messages, system=None, tools=None):
    params = {"model": model, "max_tokens": 4096, "messages": messages}
    if tools:
        params["tools"] = tools
    if system:
        params["system"] = system
    return client.messages.create(**params)

Deux changements par rapport à la version de la leçon 8 : le paramètre tools, et la valeur de retour. chat renvoie désormais l’objet Message entier, et non plus son texte. Un message peut contenir des demandes d’outils ; ne garder que le texte jetterait la moitié de l’information.

Extraire le texte quand on en a besoin

def text_from_message(message):
    return "\n".join(block.text for block in message.content if block.type == "text")

Cette fonction réunit les blocs text d’un message et ignore les blocs de réflexion et d’appel d’outil. C’est elle qui sert à afficher une réponse à l’utilisateur.

Ce que cette version change par rapport au cours officiel

La fonction chat du cours de l’Academy passe encore un paramètre temperature. Sur Claude Opus 4.7 et les modèles suivants, dont Sonnet 5.5, une valeur différente de la valeur par défaut renvoie une erreur 400, et la version d’API 2026-10-21 refuse ce paramètre sur tous les modèles : nous l’avons retiré. Nous avons aussi porté max_tokens de 1000 à 4096, car les jetons de réflexion comptent dans ce plafond, et la réflexion est active par défaut sur les modèles Claude 5.

À vous de jouer

Tracer un enchaînement. Sans écrire de code, déroulez sur papier l’échange complet pour « Programme un rappel pour mon dentiste jeudi en huit à 15 h », avec les trois outils du projet. Pour chaque tour, notez l’outil demandé, ses arguments et la valeur de stop_reason, puis comptez les appels à l’API.

Un déroulé possible

Supposons qu’on soit le lundi 9 novembre 2026 à 10 h 22. « Jeudi en huit » désigne alors le jeudi 19 novembre.

  1. Claude demande get_current_datetime ; le résultat est 2026-11-09 10:22:00. stop_reason : tool_use.
  2. Claude demande add_duration_to_datetime avec 2026-11-09 15:00:00, 10 jours ; le résultat est 2026-11-19 15:00:00 (jeudi). stop_reason : tool_use.
  3. Claude demande set_reminder avec le texte « Rendez-vous chez le dentiste » et 2026-11-19 15:00:00. stop_reason : tool_use.
  4. Claude confirme : « C’est noté, je vous le rappellerai le jeudi 19 novembre à 15 h. » stop_reason : end_turn.

Quatre appels à l’API : un par demande d’outil, plus celui qui produit la réponse finale. Claude peut aussi procéder autrement, par exemple en ajoutant d’abord les jours puis en fixant l’heure : le nombre de tours n’est pas connu d’avance.

Sources officielles : Multi-turn conversations with tools (Claude Academy) · How tool use works (documentation Claude : la boucle)

Points clés à retenir

  • Une question peut demander plusieurs outils en chaîne, quand un appel dépend du résultat du précédent.
  • Le nombre de tours n’est pas connu d’avance : il faut une boucle.
  • add_user_message et add_assistant_message transportent des blocs, pas seulement du texte.
  • chat renvoie l’objet Message entier ; text_from_message en extrait le texte pour l’affichage.
  • Pas de temperature, que les modèles actuels refusent, et un max_tokens assez grand pour la réflexion.