Envoi des resultats d'outils
Apres que Claude a demande un appel d’outil, vous devez executer la fonction et renvoyer les resultats. Cette etape complete le workflow d’utilisation d’outils en fournissant a Claude les informations qu’il a demandees.
Executer la fonction d’outil
Quand Claude repond avec un bloc tool_use, vous extrayez les parametres d’entree et appelez votre fonction. Voici comment acceder aux parametres :
# Acceder aux parametres que Claude veut passer a la fonction
response.content[1].input
Cela vous donne un dictionnaire des arguments. Comme votre fonction attend des arguments nommes (et non un dictionnaire), on utilise la syntaxe de deballage (unpacking) de Python :
# Deballer le dictionnaire en arguments nommes
result = get_current_datetime(**response.content[1].input)
Le bloc tool_result
Apres avoir execute la fonction, vous devez renvoyer les resultats a Claude via un bloc tool_result. Ce bloc se place dans un message utilisateur et indique a Claude ce qui s’est passe quand vous avez execute l’outil.
Le bloc tool_result a trois proprietes importantes :
| Propriete | Description |
|---|---|
tool_use_id | Doit correspondre a l’id du bloc ToolUse auquel ce resultat repond |
content | La sortie de votre fonction, serialisee en chaine de caracteres |
is_error | True si une erreur s’est produite |
Gerer les appels d’outils multiples
Claude peut demander plusieurs appels d’outils dans une seule reponse. Par exemple, si un utilisateur demande “Combien font 10 + 10 et 30 + 30 ?”, Claude pourrait repondre avec deux blocs ToolUse distincts.
Chaque appel d’outil recoit un identifiant unique, et vous devez faire correspondre ces identifiants quand vous renvoyez les resultats. C’est ainsi que Claude sait quel resultat correspond a quelle demande, meme si les resultats arrivent dans un ordre different.
Construire la requete de suivi
Votre requete de suivi a Claude doit inclure l’historique complet de la conversation plus le nouveau resultat d’outil :
# Ajouter le resultat de l'outil a l'historique
messages.append({
"role": "user",
"content": [{
"type": "tool_result",
"tool_use_id": response.content[1].id, # Correspondance avec l'ID de la demande
"content": "15:04:22", # Resultat de la fonction (en string)
"is_error": False
}]
})
L’historique complet des messages contient maintenant :
- Le message utilisateur original
- Le message assistant avec le bloc tool_use
- Le message utilisateur avec le bloc tool_result
Envoyer la requete finale
Quand vous envoyez la requete de suivi, vous devez toujours inclure le schema d’outil, meme si vous ne vous attendez pas a ce que Claude fasse un autre appel d’outil. Claude a besoin du schema pour comprendre les references aux outils dans l’historique de conversation.
# Le schema d'outil est toujours requis
response = client.messages.create(
model=model,
max_tokens=1000,
messages=messages,
tools=[get_current_datetime_schema] # Toujours present !
)
Claude repond alors avec un message final qui integre les resultats d’outil dans une reponse naturelle pour l’utilisateur. Le workflow d’utilisation d’outil est maintenant complet : vous avez reussi a permettre a Claude d’acceder a des informations en temps reel via votre fonction personnalisee.
Exercice : Simulez un echange complet
Reconstituez mentalement l’echange complet pour la question “Quelle heure est-il ?” :
- Message user :
"Quelle heure est-il exactement ?" - Message assistant : Bloc texte (“Je vais verifier…”) + Bloc tool_use (
get_current_datetime, input:{"date_format": "%H:%M:%S"}) - Message user : Bloc tool_result (
tool_use_idcorrespondant, content:"14:32:07", is_error: False) - Message assistant :
"Il est exactement 14h32 et 7 secondes."
Verifiez que vous comprenez pourquoi :
- Le
tool_use_iddoit correspondre entre les etapes 2 et 3 - Le content du tool_result est une chaine de caracteres, pas un objet
- Le schema d’outil est passe a chaque appel
client.messages.create()