Conversations multi-tours avec outils
Construire des conversations multi-tours avec le Tool Use necessite de gerer differents types de reponses de Claude. Parfois Claude a besoin d’un outil, parfois il repond directement. Votre code doit gerer les deux scenarios.
Le probleme de l’integration simple
Si vous ajoutez systematiquement des resultats d’outils a chaque conversation, vous aurez des problemes. Quand Claude repond a une question simple comme “Combien font 1+1 ?”, il n’a besoin d’aucun outil. Si votre code tente toujours de traiter des resultats d’outils, vous ajouterez des messages vides a l’historique.
La solution : verifier le stop_reason de chaque reponse de Claude.
Raisons d’arret
Claude peut s’arreter pour plusieurs raisons :
| stop_reason | Signification |
|---|---|
"tool_use" | Le modele veut appeler un outil |
"end_turn" | Le modele a fini de generer sa reponse |
"max_tokens" | Limite de sortie atteinte |
"stop_sequence" | Sequence d’arret rencontree |
Ameliorer la fonction chat
Renvoyez un dictionnaire avec toutes les informations necessaires :
def chat(messages, tools=None, system=None, **kwargs):
# ... code existant ...
return {
"parts": parts,
"stop_reason": response["stopReason"],
"text": "\n".join([p["text"] for p in parts if "text" in p])
}
Construire une boucle conversationnelle
def run_conversation(messages):
while True:
result = chat(messages, tools=[get_current_datetime_schema])
add_assistant_message(messages, result["parts"])
print(result["text"])
if result["stop_reason"] != "tool_use":
break
tool_result_parts = run_tools(result["parts"])
add_user_message(messages, tool_result_parts)
return messages
Cette boucle continue tant que Claude demande des outils. A chaque iteration :
- Envoyer les messages actuels a Claude
- Ajouter la reponse de Claude a l’historique
- Verifier si Claude veut utiliser un outil
- Si oui : executer les outils et ajouter les resultats a la conversation
- Si non : sortir de la boucle
Tester l’implementation
# Question necessitant un outil
messages = []
add_user_message(messages, "Quelle heure est-il ?")
run_conversation(messages)
# Question simple
messages = []
add_user_message(messages, "Combien font 1+1 ?")
run_conversation(messages)
Pour la question sur l’heure, Claude utilisera l’outil datetime. Pour le calcul, il repond directement. La boucle s’adapte automatiquement selon la raison d’arret de Claude.
Ce pattern se generalise bien quand vous ajoutez plus d’outils — la meme boucle gere n’importe quelle combinaison d’utilisation d’outils et de reponses directes.