Lors de la création d'applications avec plusieurs outils, vous devez gérer des scénarios où Claude peut avoir besoin d'appeler plusieurs outils en séquence pour répondre à une seule question de l'utilisateur. Par exemple, si un utilisateur demande « Quel jour sera-t-il dans 103 jours à partir d'aujourd'hui ? », Claude doit d'abord obtenir la date actuelle, puis y ajouter 103 jours.

Cela crée un modèle de conversation multi-tours où Claude effectue plusieurs demandes d'outils avant de fournir une réponse finale. Votre application doit gérer cela automatiquement.
Le modèle d'outils multi-tours
Voici ce qui se passe en arrière-plan lorsque Claude a besoin de plusieurs outils :
- L'utilisateur demande : « Quel jour sera-t-il dans 103 jours à partir d'aujourd'hui ? »
- Claude répond avec un bloc d'utilisation d'outils demandant
get_current_datetime - Votre serveur appelle la fonction et renvoie le résultat
- Claude se rend compte qu'il a besoin de plus d'informations et demande
add_duration_to_datetime - Votre serveur appelle cette fonction et renvoie le résultat
- Claude dispose maintenant de suffisamment d'informations pour fournir la réponse finale

Construction d'une boucle de conversation
Pour gérer ce modèle, vous avez besoin d'une boucle de conversation qui continue jusqu'à ce que Claude arrête de demander des outils :
def run_conversation(messages):
while True:
response = chat(messages)
add_assistant_message(messages, response)
# Pseudo-code
if response isn't asking for a tool:
break
tool_result_blocks = run_tools(response)
add_user_message(messages, tool_result_blocks)
return messages
Refactorisation des fonctions d'assistance
Avant d'implémenter la boucle de conversation, vous devez mettre à jour vos fonctions d'assistance pour gérer correctement plusieurs blocs de messages.
Mise à jour des gestionnaires de messages
Vos fonctions add_user_message et add_assistant_message supposent actuellement que vous travaillez toujours avec du texte brut. Mettez-les à jour pour gérer des objets de message complets :
from anthropic.types import Message
def add_user_message(messages, message):
user_message = {
"role": "user",
"content": message.content if isinstance(message, Message) else message
}
messages.append(user_message)Cela vous permet de passer soit une chaîne de caractères, soit une liste de blocs, soit un objet de message complet.
Mise à jour de la fonction de chat
Modifiez votre fonction de chat pour accepter une liste d'outils et renvoyer le message complet au lieu de simplement le texte :
def chat(messages, system=None, temperature=1.0, stop_sequences=[], tools=None):
params = {
"model": model,
"max_tokens": 1000,
"messages": messages,
"temperature": temperature,
"stop_sequences": stop_sequences,
}
if tools:
params["tools"] = tools
if system:
params["system"] = system
message = client.messages.create(**params)
return messageExtraction du texte des messages
Puisque vous renvoyez maintenant des objets de message complets, créez une fonction d'assistance pour extraire le texte lorsque nécessaire :
def text_from_message(message):
return "\n".join(
[block.text for block in message.content if block.type == "text"]
)Cette fonction trouve tous les blocs de texte dans un message et les assemble, ce qui est utile lorsque vous devez afficher la réponse finale aux utilisateurs.
Améliorations clés
Ces étapes de refactorisation préparent votre code pour une gestion robuste des outils :
- Gestion flexible des messages - Vos fonctions d'assistance peuvent désormais fonctionner avec différents formats de messages
- Support des outils dans le chat - La fonction de chat peut recevoir et transmettre des schémas d'outils
- Retours de messages complets - Vous obtenez des objets de message complets au lieu de simplement du texte, préservant tous les blocs
- Utilitaire d'extraction de texte - Moyen simple d'obtenir du texte lisible à partir de messages complexes
Avec ces fondations en place, vous êtes prêt à implémenter la boucle de conversation qui gère automatiquement plusieurs appels d'outils, créant une expérience fluide où Claude peut utiliser autant d'outils que nécessaire pour répondre aux questions des utilisateurs.