La chiamata programmatica degli strumenti consente a Claude di scrivere codice che chiama i tuoi strumenti in modo programmatico all'interno di un container di esecuzione del codice, anziché richiedere round trip attraverso il modello per ogni invocazione dello strumento. Questo riduce la latenza per i flussi di lavoro multi-strumento e diminuisce il consumo di token consentendo a Claude di filtrare o elaborare i dati prima che raggiungano la finestra di contesto del modello. Nei benchmark di ricerca agentiva come BrowseComp e DeepSearchQA, che testano la ricerca web multi-step e il recupero di informazioni complesse, l'aggiunta della chiamata programmatica degli strumenti in cima agli strumenti di ricerca di base è stato il fattore chiave che ha completamente sbloccato le prestazioni degli agenti.
La differenza si amplifica rapidamente nei flussi di lavoro reali. Considera il controllo della conformità al budget per 20 dipendenti: l'approccio tradizionale richiede 20 round-trip separati del modello, estraendo migliaia di voci di spesa nel contesto lungo il percorso. Con la chiamata programmatica degli strumenti, un singolo script esegue tutte le 20 ricerche, filtra i risultati e restituisce solo i dipendenti che hanno superato i loro limiti, riducendo ciò su cui Claude deve ragionare da centinaia di kilobyte a poche righe.
Per un'analisi più approfondita dei costi di inferenza e contesto che la chiamata programmatica degli strumenti affronta, consulta Advanced tool use.
Questa funzionalità richiede che lo strumento di esecuzione del codice sia abilitato.
This feature is not eligible for Zero Data Retention (ZDR). Data is retained according to the feature's standard retention policy.
Per i dettagli sulla compatibilità del modello e sulla versione degli strumenti, consulta il Riferimento agli strumenti. La chiamata programmatica degli strumenti è disponibile tramite l'API Claude e Microsoft Foundry.
Ecco un semplice esempio in cui Claude interroga programmaticamente un database più volte e aggrega i risultati:
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"]
}
]
}'Quando configuri uno strumento per essere chiamabile dall'esecuzione del codice e Claude decide di utilizzare quello strumento:
tool_useQuesto approccio è particolarmente utile per:
Gli strumenti personalizzati vengono convertiti in funzioni Python asincrone per supportare la chiamata parallela degli strumenti. Quando Claude scrive codice che chiama i tuoi strumenti, usa await (es. result = await query_database("<sql>")) e include automaticamente la funzione wrapper asincrona appropriata.
Il wrapper asincrono è omesso dagli esempi di codice in questa documentazione per chiarezza.
allowed_callersIl campo allowed_callers specifica quali contesti possono invocare uno strumento:
{
"name": "query_database",
"description": "Execute a SQL query against the database",
"input_schema": {
// ...
},
"allowed_callers": ["code_execution_20260120"]
}Valori possibili:
["direct"] - Solo Claude può chiamare questo strumento direttamente (predefinito se omesso)["code_execution_20260120"] - Chiamabile solo dall'interno dell'esecuzione del codice["direct", "code_execution_20260120"] - Chiamabile sia direttamente che dall'esecuzione del codiceScegli ["direct"] o ["code_execution_20260120"] per ogni strumento anziché abilitare entrambi, poiché questo fornisce indicazioni più chiare a Claude su come utilizzare al meglio lo strumento.
caller nelle risposteOgni blocco di utilizzo degli strumenti include un campo caller che indica come è stato invocato:
Invocazione diretta (utilizzo tradizionale degli strumenti):
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": { "type": "direct" }
}Invocazione programmatica:
{
"type": "tool_use",
"id": "toolu_xyz789",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_abc123"
}
}Il tool_id fa riferimento allo strumento di esecuzione del codice che ha effettuato la chiamata programmatica.
La chiamata programmatica degli strumenti utilizza gli stessi container dell'esecuzione del codice:
containerQuando uno strumento viene chiamato in modo programmatico e il container è in attesa del risultato dello strumento, devi rispondere prima che il container scada. Monitora il campo expires_at. Se il container scade, Claude potrebbe trattare la chiamata allo strumento come scaduta e riprovare.
Ecco come funziona un flusso completo di chiamata programmatica degli strumenti:
Invia una richiesta con l'esecuzione del codice e uno strumento che consente la chiamata programmatica. Per abilitare la chiamata programmatica, aggiungi il campo allowed_callers alla definizione del tuo strumento.
Fornisci descrizioni dettagliate del formato di output del tuo strumento nella descrizione dello strumento. Se specifichi che lo strumento restituisce JSON, Claude tenta di deserializzare ed elaborare il risultato nel codice. Più dettagli fornisci sullo schema di output, meglio Claude può gestire la risposta in modo programmatico.
La forma della richiesta è identica all'esempio dell'Avvio rapido: includi code_execution nell'elenco degli strumenti, aggiungi allowed_callers: ["code_execution_20260120"] a qualsiasi strumento che vuoi che Claude invochi dal codice, e invia il tuo messaggio utente.
Claude scrive codice che chiama il tuo strumento. L'API si mette in pausa e restituisce:
{
"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"
}Includi la cronologia completa della conversazione più il risultato dello strumento:
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: [...]
YAMLL'esecuzione del codice continua ed elabora i risultati. Se sono necessarie ulteriori chiamate agli strumenti, ripeti il Passaggio 3 finché tutte le chiamate agli strumenti non sono soddisfatte.
Una volta completata l'esecuzione del codice, Claude fornisce la risposta finale:
{
"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 può scrivere codice che elabora più elementi in modo efficiente:
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)
# Elabora i risultati in modo programmatico
top_region = max(results.items(), key=lambda x: x[1])
print(f"Top region: {top_region[0]} with ${top_region[1]:,} in revenue")
Questo pattern:
Claude può interrompere l'elaborazione non appena i criteri di successo sono soddisfatti:
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 # Interrompi presto, non controllare i rimanenti
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:]: # Restituisci solo gli ultimi 10 errori
print(error)
Quando l'esecuzione del codice chiama uno strumento:
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_xyz789"
}
}Il risultato dello strumento viene passato al codice in esecuzione:
{
"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}, ...]"
}
]
}Quando tutte le chiamate agli strumenti sono soddisfatte e il codice è completato:
{
"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": []
}
}| Errore | Descrizione | Soluzione |
|---|---|---|
invalid_tool_input | L'input dello strumento non corrisponde allo schema | Valida l'input_schema del tuo strumento |
tool_not_allowed | Lo strumento non consente il tipo di chiamante richiesto | Verifica che allowed_callers includa i contesti corretti |
missing_beta_header | Intestazione beta richiesta non fornita (solo Bedrock e Vertex AI; la chiamata programmatica agli strumenti è GA sull'API Claude di prima parte) | Aggiungi le intestazioni beta richieste alla tua richiesta |
Se il tuo strumento impiega troppo tempo a rispondere, l'esecuzione del codice riceve un TimeoutError. Claude lo vede in stderr e in genere riprova:
{
"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": []
}
}Per prevenire i timeout:
expires_at nelle risposteSe il tuo strumento restituisce un errore:
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "Error: Query timeout - table lock exceeded 30 seconds"
}Il codice di Claude riceve questo errore e può gestirlo in modo appropriato.
strict: true non sono supportati con la chiamata programmaticatool_choicedisable_parallel_tool_use: true non è supportato con la chiamata programmaticaI seguenti strumenti non possono attualmente essere chiamati in modo programmatico, ma il supporto potrebbe essere aggiunto nelle versioni future:
Quando si risponde a chiamate programmatiche agli strumenti, ci sono requisiti di formattazione rigorosi:
Risposte con solo risultati dello strumento: Se ci sono chiamate programmatiche agli strumenti in attesa di risultati, il tuo messaggio di risposta deve contenere solo blocchi tool_result. Non puoi includere alcun contenuto testuale, nemmeno dopo i risultati dello strumento.
Non valido - Non è possibile includere testo quando si risponde a chiamate programmatiche agli strumenti:
{
"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?" }
]
}Valido - Solo risultati degli strumenti quando si risponde a chiamate programmatiche agli strumenti:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"
}
]
}Questa restrizione si applica solo quando si risponde a chiamate programmatiche (esecuzione del codice) agli strumenti. Per le normali chiamate agli strumenti lato client, puoi includere contenuto testuale dopo i risultati degli strumenti.
Le chiamate programmatiche agli strumenti sono soggette agli stessi limiti di frequenza delle normali chiamate agli strumenti. Ogni chiamata allo strumento dall'esecuzione del codice conta come un'invocazione separata.
Quando si implementano strumenti definiti dall'utente che verranno chiamati in modo programmatico:
La chiamata programmatica agli strumenti può ridurre significativamente il consumo di token:
Ad esempio, chiamare 10 strumenti direttamente utilizza circa 10 volte i token rispetto a chiamarli in modo programmatico e restituire un riepilogo.
La chiamata programmatica agli strumenti utilizza gli stessi prezzi dell'esecuzione del codice. Consulta i prezzi dell'esecuzione del codice per i dettagli.
Conteggio dei token per le chiamate programmatiche agli strumenti: I risultati degli strumenti dalle invocazioni programmatiche non contano per l'utilizzo dei token di input/output. Contano solo il risultato finale dell'esecuzione del codice e la risposta di Claude.
Casi d'uso ideali:
Casi d'uso meno ideali:
Errore "Tool not allowed"
"allowed_callers": ["code_execution_20260120"]Scadenza del container
expires_at nelle risposteRisultato dello strumento non analizzato correttamente
caller per confermare l'invocazione programmaticaL'addestramento di Claude include un'ampia esposizione al codice, rendendolo efficace nel ragionare e concatenare le chiamate alle funzioni. Quando gli strumenti vengono presentati come funzioni chiamabili all'interno di un ambiente di esecuzione del codice, Claude può sfruttare questo punto di forza per:
Questo approccio consente flussi di lavoro che sarebbero impraticabili con l'uso tradizionale degli strumenti (come l'elaborazione di file con oltre 1 milione di token) consentendo a Claude di lavorare con i dati in modo programmatico piuttosto che caricare tutto nel contesto della conversazione.
La chiamata programmatica agli strumenti è un pattern generalizzabile che può essere implementato al di fuori dell'esecuzione del codice gestita da Anthropic. Ecco una panoramica degli approcci:
Fornisci a Claude uno strumento di esecuzione del codice e descrivi quali funzioni sono disponibili in quell'ambiente. Quando Claude invoca lo strumento con il codice, la tua applicazione lo esegue localmente dove quelle funzioni sono definite.
Vantaggi:
Svantaggi:
Usa quando: La tua applicazione può eseguire in modo sicuro codice arbitrario, vuoi una soluzione semplice e l'offerta gestita di Anthropic non si adatta alle tue esigenze.
Stesso approccio dal punto di vista di Claude, ma il codice viene eseguito in un container sandboxed con restrizioni di sicurezza (ad es., nessun egress di rete). Se i tuoi strumenti richiedono risorse esterne, avrai bisogno di un protocollo per eseguire le chiamate agli strumenti al di fuori della sandbox.
Vantaggi:
Svantaggi:
Usa quando: La sicurezza è critica e la soluzione gestita di Anthropic non si adatta alle tue esigenze.
La chiamata programmatica agli strumenti di Anthropic è una versione gestita dell'esecuzione sandboxed con un ambiente Python orientato ottimizzato per Claude. Anthropic gestisce la gestione dei container, l'esecuzione del codice e la comunicazione sicura delle invocazioni degli strumenti.
Vantaggi:
Considera di utilizzare la soluzione gestita di Anthropic se stai usando l'API Claude.
La chiamata programmatica agli strumenti è costruita sull'infrastruttura di esecuzione del codice e utilizza gli stessi container sandbox. I dati del container, inclusi gli artefatti di esecuzione e gli output, vengono conservati per un massimo di 30 giorni.
Per l'idoneità ZDR in tutte le funzionalità, consulta API e conservazione dei dati.
Scopri la capacità di esecuzione del codice sottostante che alimenta la chiamata programmatica agli strumenti.
Comprendi i fondamenti dell'uso degli strumenti con Claude.
Guida passo-passo per la definizione degli strumenti.
Was this page helpful?