Renvoyer les résultats d'outils
Sur cette page
Dernière étape du cycle : renvoyer les résultats à Claude pour qu’il réponde enfin à l’utilisateur. Le principe : ranger les blocs toolResult dans un message user, puis renvoyer tout l’historique avec la même liste d’outils.
Le cycle complet
messages = []
add_user_message(messages, "Quelle heure est-il ?")
text, parts = chat(messages, tools=[get_current_datetime_schema])
add_assistant_message(messages, parts)
add_user_message(messages, run_tools(parts))
text, parts = chat(messages, tools=[get_current_datetime_schema])
print(text)
Quatre gestes, dans cet ordre :
- ajouter à l’historique la réponse de Claude, avec sa demande d’outil, telle quelle ;
- exécuter les outils avec
run_tools; - ajouter les blocs
toolResultdans un nouveau messageuser; - rappeler Claude avec tout l’historique et la même liste d’outils.
L’historique contient alors quatre messages : la question, la demande d’outil, les résultats, puis la réponse finale, du type « Il est 14 h 30. »
Les règles de mise en forme
- Tout de suite après. Le message qui porte les résultats suit immédiatement la réponse de Claude qui les a demandés.
- Un résultat par demande. Chaque bloc
toolUsereçoit sontoolResult, avec le même identifiant. - Tous ensemble. Quand Claude demande plusieurs outils dans une même réponse, tous les résultats partent dans un seul message
user: c’est ce que faitrun_tools, qui renvoie une liste.
Une liste d’historique qui viole ces règles, ou deux messages user d’affilée, est refusée par l’API.
Pourquoi renvoyer les outils
Pourquoi redonner tools alors qu’on n’attend plus d’appel ? Parce que l’historique mentionne un outil : sans sa définition, Claude lirait l’appel d’un outil qu’on ne lui décrit plus. Gardez la même liste d’outils d’une requête à l’autre de la conversation. Elle pourra d’ailleurs servir : Claude peut demander un nouvel outil après avoir lu un résultat.
Un résultat d’outil est une donnée
Un résultat d’outil transporte souvent un contenu que vous ne maîtrisez pas : une page web, un courriel, un fichier envoyé par un utilisateur. Quelqu’un peut y glisser des instructions destinées à détourner Claude, une injection de prompt indirecte. La documentation d’Anthropic recommande de laisser ce contenu dans les résultats d’outils plutôt que de le recopier dans le prompt système ou dans un message de l’utilisateur : Claude est entraîné à le traiter comme une source tierce. Pour la même raison, vos propres consignes n’ont rien à faire dans un résultat d’outil.
À vous de jouer
Un aller-retour complet. Assemblez le code des leçons 23 à 27 dans un script et posez trois questions : l’heure, la date du jour au format « jeudi 5 novembre », et une question sans rapport avec l’heure. Pour chacune, affichez si un bloc toolUse est apparu, puis le texte final. Que se passe-t-il pour la troisième question avec le code de cette leçon, qui appelle run_tools à tous les coups ?
Sources officielles : Sending tool results (Claude Academy) · Use a tool to complete an Amazon Bedrock model response (documentation AWS) · Handle tool calls (documentation Claude)
Points clés à retenir
- Les résultats repartent dans un message
user, juste après la demande, untoolResultpartoolUse. - Gardez la réponse de Claude intacte dans l’historique avant d’ajouter les résultats.
- Renvoyez la même liste d’outils à chaque requête de la conversation.
- Le contenu d’un résultat d’outil est une donnée tierce, jamais une consigne.