Renvoyer les résultats d'outils
Mis à jour le 30 juillet 2026
Dernière étape du workflow Tool Use : après avoir exécuté les outils et obtenu les résultats, il faut tout renvoyer à Claude pour qu’il puisse fournir une réponse complète à l’utilisateur. C’est le moment où la boucle se referme — et où quelques règles de protocole, faciles à rater, font la différence entre une conversation qui coule et une API qui rejette.
Ajouter le message assistant
Première exigence : un historique de conversation complet. Après la réponse initiale de Claude contenant la demande d’outil, ajoutez cette réponse à l’historique avec add_assistant_message() — intégralement, parties ToolUse comprises. La tentation de ne garder que le texte est le piège classique : le résultat d’outil que nous allons envoyer référence l’identifiant de la demande, et si cette demande a disparu de l’historique, la référence pointe dans le vide.
Le flux complet que l’historique doit raconter : question utilisateur, demande d’outil de l’assistant, résultats d’outils, réponse finale de l’assistant. Chaque maillon présent, dans cet ordre.
Créer les résultats d’outils
La fonction run_tools() traite toutes les demandes d’outils de la réponse et crée des parties ToolResult correctement formatées. Chaque résultat inclut trois informations :
- L’ID d’utilisation de l’outil (correspondant à la demande originale)
- La sortie réelle de l’exécution de l’outil
- Un statut indiquant succès ou erreur
L’ID est la pièce d’appariement : Claude peut demander plusieurs outils dans une même réponse, et c’est cet identifiant qui relie chaque résultat à sa demande — un croisement d’IDs, et le modèle raisonnerait sur des données attribuées au mauvais outil. Le statut, lui, officialise la gestion d’erreurs : une exception dans votre fonction ne tue pas la conversation, elle repart vers Claude en résultat d’erreur, à charge pour lui de se corriger.
Ajouter les résultats à la conversation
Détail de protocole qui surprend toujours : les résultats d’outils sont ajoutés comme message utilisateur :
add_user_message(messages, run_tools(parts))
La logique de l’API : du point de vue de la conversation, c’est vous qui apportez une information à Claude — le rôle « user » couvre tout ce qui vient de votre côté du fil, texte tapé ou résultat calculé. La conversation contient maintenant l’aller-retour complet nécessaire à Claude pour formuler sa réponse finale.
Appel final à Claude
La dernière requête nécessite deux éléments essentiels :
- L’historique complet des messages (utilisateur, assistant, utilisateur)
- Les schémas d’outils originaux
text, parts = chat(messages, tools=[get_current_datetime_schema])
Inclure les schémas d’outils est crucial, même si Claude n’appellera probablement plus rien : sans eux, Claude serait perdu face aux références d’outils dans l’historique de conversation — des parties ToolUse et ToolResult mentionnant un outil dont il n’a plus la définition. La règle simple : tant que l’historique contient des traces d’outils, les schémas accompagnent chaque requête.
Résultat
Quand tout fonctionne correctement, Claude reçoit les résultats d’outils et fournit une réponse complète et informée. Par exemple : « La date et l’heure actuelles sont 2025-04-03, 12:54:00. » — une réponse impossible sans outil, formulée naturellement, comme si le modèle avait toujours su l’heure.
Le cycle complet du Tool Use est opérationnel : Claude demande un outil, vous l’exécutez, renvoyez les résultats, et Claude intègre ces informations dans sa réponse finale à l’utilisateur. Il reste un cran d’automatisation à franchir — enchaîner ces étapes sans intervention manuelle, y compris quand Claude veut plusieurs tours d’outils successifs : c’est l’objet des prochaines leçons.
Points clés à retenir
- L’historique doit être intégral : la réponse assistant avec ses parties ToolUse, puis les résultats
- Chaque ToolResult porte l’ID de sa demande, la sortie, et un statut succès/erreur
- Les résultats s’envoient dans un message de rôle user — c’est vous qui informez Claude
- Les schémas d’outils accompagnent chaque requête tant que l’historique en contient des traces
- Le cycle manuel est complet ; la suite l’automatise en boucle multi-tours