Aller au contenu principal

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 :

ProprieteDescription
tool_use_idDoit correspondre a l’id du bloc ToolUse auquel ce resultat repond
contentLa sortie de votre fonction, serialisee en chaine de caracteres
is_errorTrue 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 :

  1. Le message utilisateur original
  2. Le message assistant avec le bloc tool_use
  3. 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 ?” :

  1. Message user : "Quelle heure est-il exactement ?"
  2. Message assistant : Bloc texte (“Je vais verifier…”) + Bloc tool_use (get_current_datetime, input: {"date_format": "%H:%M:%S"})
  3. Message user : Bloc tool_result (tool_use_id correspondant, content: "14:32:07", is_error: False)
  4. Message assistant : "Il est exactement 14h32 et 7 secondes."

Verifiez que vous comprenez pourquoi :

  • Le tool_use_id doit 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()