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 :
| Option | Comportement |
|---|---|
auto | Claude decide s’il utilise un outil (defaut) |
any | Claude doit utiliser un outil, mais peut choisir lequel |
tool specifique | Forcer 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 :
- Partie texte : explication en langage naturel, par exemple “Je peux vous aider a trouver l’heure actuelle.”
- Partie ToolUse : donnees structurees indiquant quel outil executer et avec quels arguments
Contenu de la partie ToolUse
toolUseId: identifiant unique necessaire pour renvoyer le resultatname: 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.