Chargement

Exécution des fonctions d'outils

Leçon 2510 min

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 :

python
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é :

python
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 :

python
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 :

python
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_parts

Une 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.