Lorsque Claude répond avec une demande d'utilisation d'outils, votre serveur doit réellement exécuter l'outil demandé et renvoyer les résultats. Cette étape implique d'extraire les parties d'utilisation d'outils de la réponse de Claude, d'exécuter les fonctions appropriées, et de formater correctement les résultats.
Gestion de plusieurs demandes d'outils
Claude peut envoyer plusieurs parties d'utilisation d'outils dans une seule réponse. Votre code doit gérer cette possibilité de manière défensive. Un message d'assistant peut contenir une partie texte suivie d'une, deux, voire plusieurs parties d'utilisation d'outils.

Le flux fonctionne ainsi : Claude envoie une demande avec un schéma JSON, reçoit une partie d'utilisation d'outils, puis votre serveur exécute l'outil et renvoie une partie de résultat d'outil pour que Claude fournisse une réponse finale.

Extraction des parties d'utilisation d'outils
Tout d'abord, créez une fonction pour traiter toutes les parties renvoyées par une demande de chat :
def run_tools(parts):
tool_requests = [part for part in parts if "toolUse" in part]
tool_result_parts = []
for tool_request in tool_requests:
tool_use_id = tool_request["toolUse"]["toolUseId"]
tool_name = tool_request["toolUse"]["name"]
tool_input = tool_request["toolUse"]["input"]Cette compréhension filtre la liste des parties pour n'inclure que les dictionnaires contenant une clé « toolUse », en ignorant les parties texte.
Exécution des outils réels
Créez une fonction d'aide pour exécuter l'outil demandé :
def run_tool(tool_name, tool_input):
if tool_name == "get_current_datetime":
return get_current_datetime(**tool_input)
else:
raise Exception(f"Unknown tool name: {tool_name}")Le détail clé ici est l'utilisation de **tool_input pour éclater le dictionnaire d'arguments dans votre fonction d'outil. Claude renvoie toujours les arguments sous forme d'objet dictionnaire, vous devez donc le décompresser correctement.
Création des parties de résultat d'outil
Après avoir exécuté un outil, vous devez formater la réponse sous forme de partie de résultat d'outil :

Les parties de résultat d'outil nécessitent trois propriétés clés :
- toolUseId - Doit correspondre à l'ID de la partie d'utilisation d'outils d'origine
- content - La sortie de votre outil, sérialisée sous forme de chaîne
- status - Soit « success » soit « error »
Comprendre les ID d'utilisation d'outils
Le système d'ID d'utilisation d'outils devient important lorsque Claude demande plusieurs outils en parallèle. Par exemple, si Claude souhaite exécuter un outil de calculatrice deux fois :

Chaque utilisation d'outil obtient un ID unique (comme « ab3 » et « po9 »), et vos résultats d'outils doivent inclure les ID correspondants afin que Claude sache quel résultat correspond à quelle demande.
Gestion des erreurs
Enveloppez l'exécution de votre outil dans des blocs try-catch. Claude est intelligent face aux erreurs d'outils et peut ajuster son approche si vous renvoyez des informations d'erreur appropriées :
try:
tool_output = run_tool(tool_name, tool_input)
tool_result_part = {
"toolResult": {
"toolUseId": tool_use_id,
"content": [{"text": json.dumps(tool_output)}],
"status": "success"
}
}
except Exception as e:
tool_result_part = {
"toolResult": {
"toolUseId": tool_use_id,
"content": [{"text": f"Error: {e}"}],
"status": "error"
}
}Implémentation complète
Voici la fonction complète qui traite les demandes d'outils et renvoie les résultats formatés :
def run_tools(parts):
tool_requests = [part for part in parts if "toolUse" in part]
tool_result_parts = []
for tool_request in tool_requests:
tool_use_id = tool_request["toolUse"]["toolUseId"]
tool_name = tool_request["toolUse"]["name"]
tool_input = tool_request["toolUse"]["input"]
try:
tool_output = run_tool(tool_name, tool_input)
tool_result_part = {
"toolResult": {
"toolUseId": tool_use_id,
"content": [{"text": json.dumps(tool_output)}],
"status": "success"
}
}
except Exception as e:
tool_result_part = {
"toolResult": {
"toolUseId": tool_use_id,
"content": [{"text": f"Error: {e}"}],
"status": "error"
}
}
tool_result_parts.append(tool_result_part)
return tool_result_partsUne fois que vous disposez des parties de résultat d'outil, vous pouvez les renvoyer à Claude dans votre prochaine demande de chat, complétant ainsi le cycle d'utilisation d'outils.