Aller au contenu principal

Gerer les reponses Tool Use

Quand Claude decide d’utiliser un outil, il renvoie une structure de reponse speciale qui necessite un traitement soigneux.

Configuration du choix d’outil (toolChoice)

Le parametre toolChoice offre trois options pour controler quand Claude utilise les outils :

OptionComportement
autoClaude decide s’il utilise un outil (defaut)
anyClaude doit utiliser un outil, mais peut choisir lequel
tool specifiqueForcer Claude a utiliser un outil precis par son nom

La troisieme option est particulierement utile pour les tests.

Structure de message multi-parties

Quand Claude veut utiliser un outil, il renvoie un message assistant avec plusieurs parties de contenu :

  1. Partie texte : explication en langage naturel, par exemple “Je peux vous aider a trouver l’heure actuelle.”
  2. Partie ToolUse : donnees structurees indiquant quel outil executer et avec quels arguments

Contenu de la partie ToolUse

  • toolUseId : identifiant unique necessaire pour renvoyer le resultat
  • name : nom exact de l’outil (tel que defini dans votre schema JSON)
  • input : dictionnaire d’arguments que Claude veut passer a votre fonction

Flux conversationnel avec les outils

Le pattern est : message utilisateur, reponse assistant avec demande d’outil, message utilisateur avec resultat d’outil, reponse finale de l’assistant. L’historique complet des messages doit etre maintenu.

Mise a jour des fonctions utilitaires

Pour gerer les messages multi-parties, rendez vos fonctions flexibles :

def add_user_message(messages, content):
    if isinstance(content, str):
        user_message = {"role": "user", "content": [{"text": content}]}
    else:
        user_message = {"role": "user", "content": content}
    messages.append(user_message)

def add_assistant_message(messages, content):
    if isinstance(content, str):
        assistant_message = {"role": "assistant", "content": [{"text": content}]}
    else:
        assistant_message = {"role": "assistant", "content": content}
    messages.append(assistant_message)

Mettez egalement a jour votre fonction chat pour renvoyer le texte et la liste complete des parties :

def chat(messages, system=None, temperature=1.0, stop_sequences=[], tools=None):
    # ... code existant ...

    response = client.converse(**params)

    text = response["output"]["message"]["content"][0]["text"]
    parts = response["output"]["message"]["content"]

    return text, parts

Verifier la raison d’arret

Verifiez toujours le champ stopReason dans la reponse de Claude. Quand il vaut "tool_use", Claude veut appeler un outil plutot que fournir une reponse textuelle. C’est votre signal pour extraire les informations de l’outil et executer la fonction demandee.