Was this page helpful?
Programmatisches Tool-Aufrufen ermöglicht es Claude, Code zu schreiben, der Ihre Tools programmatisch innerhalb eines Code-Ausführungs-Containers aufruft, anstatt mehrere Durchläufe durch das Modell für jeden Tool-Aufruf zu erfordern. Dies reduziert die Latenz für Multi-Tool-Workflows und verringert den Token-Verbrauch, indem Claude Daten filtern oder verarbeiten kann, bevor sie das Kontextfenster des Modells erreichen. Bei agentengestützten Suchbenchmarks wie BrowseComp und DeepSearchQA, die mehrstufige Webrecherche und komplexe Informationsbeschaffung testen, war das Hinzufügen von programmatischem Tool-Aufrufen auf Basis von grundlegenden Suchtools der Schlüsselfaktor, der die Agent-Performance vollständig freisetzte.
Der Unterschied verstärkt sich schnell in echten Workflows. Stellen Sie sich vor, Sie überprüfen die Budgeteinhaltung bei 20 Mitarbeitern: Der traditionelle Ansatz erfordert 20 separate Modell-Durchläufe und zieht dabei Tausende von Ausgabenpositionen in den Kontext. Mit programmatischem Tool-Aufrufen führt ein einzelnes Skript alle 20 Abfragen aus, filtert die Ergebnisse und gibt nur die Mitarbeiter zurück, die ihre Limits überschritten haben, wodurch sich das reduziert, das Claude durchdenken muss, von Hunderten von Kilobytes auf nur wenige Zeilen.
Für einen tieferen Blick auf die Inferenz- und Kontextkosten, die programmatisches Tool-Aufrufen adressiert, siehe Advanced tool use.
Diese Funktion erfordert, dass das Code-Ausführungs-Tool aktiviert ist.
This feature is not eligible for Zero Data Retention (ZDR). Data is retained according to the feature's standard retention policy.
Für Modellkompatibilität und Tool-Versionsdetails siehe die Tool-Referenz. Programmatisches Tool-Aufrufen ist über die Claude API und Microsoft Foundry verfügbar.
Hier ist ein einfaches Beispiel, bei dem Claude programmatisch mehrmals eine Datenbank abfragt und Ergebnisse aggregiert:
Wenn Sie ein Tool so konfigurieren, dass es von der Code-Ausführung aufgerufen werden kann, und Claude entscheidet, dieses Tool zu verwenden:
tool_use-Block zurückDieser Ansatz ist besonders nützlich für:
Benutzerdefinierte Tools werden in asynchrone Python-Funktionen konvertiert, um paralleles Tool-Aufrufen zu unterstützen. Wenn Claude Code schreibt, der Ihre Tools aufruft, verwendet es await (z. B. result = await query_database("<sql>")) und fügt automatisch die entsprechende asynchrone Wrapper-Funktion ein.
Die asynchrone Wrapper wird in den Code-Beispielen in dieser Dokumentation aus Gründen der Klarheit weggelassen.
allowed_callersDas Feld allowed_callers gibt an, welche Kontexte ein Tool aufrufen können:
{
"name": "query_database",
"description": "Execute a SQL query against the database",
"input_schema": {
// ...
},
"allowed_callers": ["code_execution_20260120"]
}Mögliche Werte:
["direct"] - Nur Claude kann dieses Tool direkt aufrufen (Standard, wenn weggelassen)["code_execution_20260120"] - Nur von innerhalb der Code-Ausführung aufrufbar["direct", "code_execution_20260120"] - Von direkt und von Code-Ausführung aufrufbarWählen Sie für jedes Tool entweder ["direct"] oder ["code_execution_20260120"], anstatt beide zu aktivieren, da dies Claude klarer anleitet, wie das Tool am besten verwendet wird.
caller in AntwortenJeder Tool-Use-Block enthält ein caller-Feld, das angibt, wie es aufgerufen wurde:
Direkter Aufruf (traditionelles Tool-Aufrufen):
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": { "type": "direct" }
}Programmatischer Aufruf:
{
"type": "tool_use",
"id": "toolu_xyz789",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_abc123"
}
}Die tool_id verweist auf das Code-Ausführungs-Tool, das den programmatischen Aufruf gemacht hat.
Programmatisches Tool-Aufrufen verwendet die gleichen Container wie Code-Ausführung:
container zurückgegebenWenn ein Tool programmatisch aufgerufen wird und der Container auf Ihr Tool-Ergebnis wartet, müssen Sie antworten, bevor der Container abläuft. Überwachen Sie das Feld expires_at. Wenn der Container abläuft, kann Claude den Tool-Aufruf als Timeout behandeln und ihn erneut versuchen.
Hier ist, wie ein vollständiger programmatischer Tool-Aufrufen-Workflow funktioniert:
Senden Sie eine Anfrage mit Code-Ausführung und einem Tool, das programmatisches Aufrufen ermöglicht. Um programmatisches Aufrufen zu aktivieren, fügen Sie das Feld allowed_callers zu Ihrer Tool-Definition hinzu.
Geben Sie detaillierte Beschreibungen des Ausgabeformats Ihres Tools in der Tool-Beschreibung an. Wenn Sie angeben, dass das Tool JSON zurückgibt, versucht Claude, das Ergebnis im Code zu deserialisieren und zu verarbeiten. Je mehr Details Sie über das Ausgabeschema bereitstellen, desto besser kann Claude die Antwort programmatisch verarbeiten.
Die Anfrage-Form ist identisch mit dem Schnellstart-Beispiel: Fügen Sie code_execution in Ihre Tools-Liste ein, fügen Sie allowed_callers: ["code_execution_20260120"] zu jedem Tool hinzu, das Claude von Code aus aufrufen soll, und senden Sie Ihre Benutzernachricht.
Claude schreibt Code, der Ihr Tool aufruft. Die API pausiert und gibt zurück:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll query the purchase history and analyze the results."
},
{
"type": "server_tool_use",
"id": "srvtoolu_abc123",
"name": "code_execution",
"input": {
"code": "results = await query_database('<sql>')\ntop_customers = sorted(results, key=lambda x: x['revenue'], reverse=True)[:5]\nprint(f'Top 5 customers: {top_customers}')"
}
},
{
"type": "tool_use",
"id": "toolu_def456",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_abc123"
}
}
],
"container": {
"id": "container_xyz789",
"expires_at": "2025-01-15T14:30:00Z"
},
"stop_reason": "tool_use"
}Fügen Sie den vollständigen Gesprächsverlauf plus Ihr Werkzeugergebnis ein:
Die Codeausführung wird fortgesetzt und verarbeitet die Ergebnisse. Wenn zusätzliche Werkzeugaufrufe erforderlich sind, wiederholen Sie Schritt 3, bis alle Werkzeugaufrufe erfüllt sind.
Sobald die Codeausführung abgeschlossen ist, liefert Claude die endgültige Antwort:
{
"content": [
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_abc123",
"content": {
"type": "code_execution_result",
"stdout": "Top 5 customers by revenue:\n1. Customer C1: $45,000\n2. Customer C2: $38,000\n3. Customer C5: $32,000\n4. Customer C8: $28,500\n5. Customer C3: $24,000",
"stderr": "",
"return_code": 0,
"content": []
}
},
{
"type": "text",
"text": "I've analyzed the purchase history from last quarter. Your top 5 customers generated $167,500 in total revenue, with Customer C1 leading at $45,000."
}
],
"stop_reason": "end_turn"
}Claude kann Code schreiben, der mehrere Elemente effizient verarbeitet:
async def _claude_code():
regions = ["West", "East", "Central", "North", "South"]
results = {}
for region in regions:
data = await query_database(f"<sql for {region}>")
results[region] = sum(row["revenue"] for row in data)
# Process results programmatically
top_region = max(results.items(), key=lambda x: x[1])
print(f"Top region: {top_region[0]} with ${top_region[1]:,} in revenue")
Dieses Muster:
Claude kann die Verarbeitung beenden, sobald die Erfolgskriterien erfüllt sind:
async def _claude_code():
endpoints = ["us-east", "eu-west", "apac"]
for endpoint in endpoints:
status = await check_health(endpoint)
if status == "healthy":
print(f"Found healthy endpoint: {endpoint}")
break # Stop early, don't check remaining
async def _claude_code():
file_info = await get_file_info(path)
if file_info["size"] < 10000:
content = await read_full_file(path)
else:
content = await read_file_summary(path)
print(content)
async def _claude_code():
logs = await fetch_logs(server_id)
errors = [log for log in logs if "ERROR" in log]
print(f"Found {len(errors)} errors")
for error in errors[-10:]: # Only return last 10 errors
print(error)
Wenn die Codeausführung ein Werkzeug aufruft:
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_xyz789"
}
}Ihr Werkzeugergebnis wird an den laufenden Code zurückgegeben:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000, \"orders\": 23}, {\"customer_id\": \"C2\", \"revenue\": 38000, \"orders\": 18}, ...]"
}
]
}Wenn alle Werkzeugaufrufe erfüllt sind und der Code abgeschlossen ist:
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_xyz789",
"content": {
"type": "code_execution_result",
"stdout": "Analysis complete. Top 5 customers identified from 847 total records.",
"stderr": "",
"return_code": 0,
"content": []
}
}| Fehler | Beschreibung | Lösung |
|---|---|---|
invalid_tool_input | Werkzeugeingabe stimmt nicht mit dem Schema überein | Validieren Sie das input_schema Ihres Werkzeugs |
tool_not_allowed | Werkzeug erlaubt den angeforderten Aufrufertyp nicht | Überprüfen Sie, dass allowed_callers die richtigen Kontexte enthält |
missing_beta_header | Erforderlicher Beta-Header nicht bereitgestellt (nur Bedrock und Vertex AI; programmgesteuerte Werkzeugaufrufe sind GA auf der Claude-API von Anthropic) | Fügen Sie die erforderlichen Beta-Header zu Ihrer Anfrage hinzu |
Wenn Ihr Werkzeug zu lange braucht, um zu antworten, erhält die Codeausführung einen TimeoutError. Claude sieht dies in stderr und versucht normalerweise erneut:
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_abc123",
"content": {
"type": "code_execution_result",
"stdout": "",
"stderr": "TimeoutError: Calling tool ['query_database'] timed out.",
"return_code": 0,
"content": []
}
}Um Timeouts zu vermeiden:
expires_at in AntwortenWenn Ihr Werkzeug einen Fehler zurückgibt:
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "Error: Query timeout - table lock exceeded 30 seconds"
}Claudes Code erhält diesen Fehler und kann ihn entsprechend behandeln.
strict: true werden nicht mit programmgesteuerten Aufrufen unterstützttool_choice erzwingendisable_parallel_tool_use: true wird nicht mit programmgesteuerten Aufrufen unterstütztDie folgenden Werkzeuge können derzeit nicht programmgesteuert aufgerufen werden, aber die Unterstützung kann in zukünftigen Versionen hinzugefügt werden:
Bei der Antwort auf programmgesteuerte Werkzeugaufrufe gibt es strenge Formatierungsanforderungen:
Nur Werkzeugergebnis-Antworten: Wenn es ausstehende programmgesteuerte Werkzeugaufrufe gibt, die auf Ergebnisse warten, muss Ihre Antwortnachricht nur tool_result-Blöcke enthalten. Sie können keinen Textinhalt einschließen, auch nicht nach den Werkzeugergebnissen.
Ungültig - Kann keinen Text einschließen, wenn auf programmgesteuerte Werkzeugaufrufe geantwortet wird:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"
},
{ "type": "text", "text": "What should I do next?" }
]
}Gültig - Nur Werkzeugergebnisse bei Antwort auf programmgesteuerte Werkzeugaufrufe:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"
}
]
}Diese Einschränkung gilt nur bei der Antwort auf programmgesteuerte (Codeausführungs-)Werkzeugaufrufe. Bei regulären clientseitigen Werkzeugaufrufen können Sie Textinhalt nach Werkzeugergebnissen einschließen.
Programmgesteuerte Werkzeugaufrufe unterliegen denselben Ratenlimits wie reguläre Werkzeugaufrufe. Jeder Werkzeugaufruf aus der Codeausführung zählt als separate Invokation.
Bei der Implementierung benutzerdefinierter Werkzeuge, die programmgesteuert aufgerufen werden:
Programmgesteuerte Werkzeugaufrufe können den Token-Verbrauch erheblich reduzieren:
Beispielsweise verwendet das direkte Aufrufen von 10 Werkzeugen etwa 10x die Token des programmgesteuerten Aufrufs und der Rückgabe einer Zusammenfassung.
Programmgesteuerte Werkzeugaufrufe verwenden die gleiche Preisgestaltung wie die Codeausführung. Weitere Informationen finden Sie unter Codeausführungs-Preisgestaltung.
Token-Zählung für programmgesteuerte Werkzeugaufrufe: Werkzeugergebnisse aus programmgesteuerten Invokationen zählen nicht zu Ihrer Input-/Output-Token-Nutzung. Nur das endgültige Codeausführungsergebnis und Claudes Antwort zählen.
Gute Anwendungsfälle:
Weniger ideale Anwendungsfälle:
Fehler "Tool not allowed"
"allowed_callers": ["code_execution_20260120"] enthältContainer-Ablauf
expires_at in AntwortenWerkzeugergebnis wird nicht korrekt analysiert
caller, um programmgesteuerte Invokation zu bestätigenClaudes Training umfasst umfangreiche Exposition gegenüber Code, was es effektiv bei der Überlegung und Verkettung von Funktionsaufrufen macht. Wenn Werkzeuge als aufrufbare Funktionen in einer Codeausführungsumgebung präsentiert werden, kann Claude diese Stärke nutzen, um:
Dieser Ansatz ermöglicht Workflows, die mit traditioneller Werkzeugnutzung unpraktisch wären (z. B. Verarbeitung von Dateien über 1M Token), indem Claude programmgesteuert mit Daten arbeiten kann, anstatt alles in das Gesprächskontext zu laden.
Programmgesteuerte Werkzeugaufrufe sind ein verallgemeinerbares Muster, das außerhalb von Anthropics verwalteter Codeausführung implementiert werden kann. Hier ist ein Überblick über die Ansätze:
Stellen Sie Claude ein Codeausführungswerkzeug zur Verfügung und beschreiben Sie, welche Funktionen in dieser Umgebung verfügbar sind. Wenn Claude das Werkzeug mit Code aufruft, führt Ihre Anwendung es lokal aus, wo diese Funktionen definiert sind.
Vorteile:
Nachteile:
Verwenden Sie, wenn: Ihre Anwendung sicher beliebigen Code ausführen kann, Sie eine einfache Lösung wünschen und Anthropics verwaltetes Angebot Ihren Anforderungen nicht entspricht.
Derselbe Ansatz aus Claudes Perspektive, aber Code wird in einem Sandbox-Container mit Sicherheitsbeschränkungen ausgeführt (z. B. kein Netzwerk-Egress). Wenn Ihre Werkzeuge externe Ressourcen benötigen, benötigen Sie ein Protokoll für die Ausführung von Werkzeugaufrufen außerhalb der Sandbox.
Vorteile:
Nachteile:
Verwenden Sie, wenn: Sicherheit ist kritisch und Anthropics verwaltete Lösung passt nicht zu Ihren Anforderungen.
Anthropics programmgesteuerte Werkzeugaufrufe sind eine verwaltete Version der Sandbox-Ausführung mit einer für Claude optimierten Python-Umgebung. Anthropic verwaltet Container-Management, Codeausführung und sichere Werkzeugaufrufe-Kommunikation.
Vorteile:
Erwägen Sie die Verwendung von Anthropics verwalteter Lösung, wenn Sie die Claude API verwenden.
Programmgesteuerte Werkzeugaufrufe basieren auf der Codeausführungsinfrastruktur und verwenden dieselben Sandbox-Container. Container-Daten, einschließlich Ausführungsartefakte und Ausgaben, werden bis zu 30 Tage lang aufbewahrt.
Für ZDR-Berechtigung über alle Funktionen hinweg siehe API und Datenspeicherung.
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data '{
"model": "claude-opus-4-6",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Query sales data for the West, East, and Central regions, then tell me which region had the highest revenue"
}
],
"tools": [
{
"type": "code_execution_20260120",
"name": "code_execution"
},
{
"name": "query_database",
"description": "Execute a SQL query against the sales database. Returns a list of rows as JSON objects.",
"input_schema": {
"type": "object",
"properties": {
"sql": {
"type": "string",
"description": "SQL query to execute"
}
},
"required": ["sql"]
},
"allowed_callers": ["code_execution_20260120"]
}
]
}'ant messages create <<'YAML'
model: claude-opus-4-6
max_tokens: 4096
container: container_xyz789
messages:
- role: user
content: >-
Query customer purchase history from the last quarter and identify our
top 5 customers by revenue
- role: assistant
content:
- type: text
text: I'll query the purchase history and analyze the results.
- type: server_tool_use
id: srvtoolu_abc123
name: code_execution
input:
code: "..."
- type: tool_use
id: toolu_def456
name: query_database
input:
sql: "<sql>"
caller:
type: code_execution_20260120
tool_id: srvtoolu_abc123
- role: user
content:
- type: tool_result
tool_use_id: toolu_def456
content: >-
[{"customer_id": "C1", "revenue": 45000}, {"customer_id": "C2",
"revenue": 38000}, ...]
tools: [...]
YAML