Wird geladen

Tool-Funktionen ausführen

Lektion 2510 Min.

Wenn Claude mit einer Tool-Nutzungsanfrage antwortet, muss dein Server das angeforderte Tool tatsächlich ausführen und die Ergebnisse zurücksenden. Dieser Schritt umfasst das Extrahieren der Tool-Nutzungsteile aus Claudes Antwort, das Ausführen der entsprechenden Funktionen und das korrekte Formatieren der Ergebnisse.

Umgang mit mehreren Tool-Anfragen

Claude kann mehrere Tool-Nutzungsteile in einer einzigen Antwort senden. Dein Code muss diese Möglichkeit defensiv behandeln. Eine Assistant-Nachricht könnte einen Textteil enthalten, gefolgt von einem, zwei oder sogar mehr Tool-Nutzungsteilen.

Der Ablauf funktioniert so: Claude sendet eine Anfrage mit JSON-Schema, erhält einen Tool-Nutzungsteil, dann führt dein Server das Tool aus und sendet einen Tool-Ergebnisteil zurück, damit Claude eine endgültige Antwort geben kann.

Extrahieren von Tool-Nutzungsteilen

Erstelle zunächst eine Funktion, um alle Teile zu verarbeiten, die von einer Chat-Anfrage zurückgegeben werden:

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"]

Diese Comprehension filtert die Teileliste so, dass nur Dictionaries enthalten sind, die einen „toolUse"-Schlüssel enthalten, und ignoriert Textteile.

Ausführen der eigentlichen Tools

Erstelle eine Hilfsfunktion, um das angeforderte Tool auszuführen:

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}")

Das entscheidende Detail hier ist die Verwendung von **tool_input, um das Dictionary der Argumente in deine Tool-Funktion zu entpacken. Claude gibt Argumente immer als Dictionary-Objekt zurück, daher musst du es ordnungsgemäß entpacken.

Erstellen von Tool-Ergebnisteilen

Nachdem du ein Tool ausgeführt hast, musst du die Antwort als Tool-Ergebnisteil formatieren:

Tool-Ergebnisteile erfordern drei wichtige Eigenschaften:

  • toolUseId - Muss mit der ID des ursprünglichen Tool-Nutzungsteils übereinstimmen
  • content - Die Ausgabe deines Tools, als String serialisiert
  • status - Entweder „success" oder „error"

Verständnis der Tool-Nutzungs-IDs

Das Tool-Nutzungs-ID-System wird wichtig, wenn Claude mehrere Tools parallel anfordert. Wenn Claude beispielsweise ein Rechner-Tool zweimal ausführen möchte:

Jede Tool-Nutzung erhält eine eindeutige ID (wie „ab3" und „po9"), und deine Tool-Ergebnisse müssen die passenden IDs enthalten, damit Claude weiß, welches Ergebnis zu welcher Anfrage gehört.

Fehlerbehandlung

Umschließe deine Tool-Ausführung mit try-catch-Blöcken. Claude geht intelligent mit Tool-Fehlern um und kann seinen Ansatz anpassen, wenn du korrekte Fehlerinformationen zurückgibst:

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"
        }
    }

Vollständige Implementierung

Hier ist die vollständige Funktion, die Tool-Anfragen verarbeitet und formatierte Ergebnisse zurückgibt:

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

Sobald du die Tool-Ergebnisteile hast, kannst du sie in deiner nächsten Chat-Anfrage an Claude zurücksenden und damit den Tool-Nutzungszyklus abschließen.