Chiamata programmatica degli strumenti
Consenti a Claude di chiamare i tuoi strumenti dal codice nel container di esecuzione del codice, riducendo i round trip del modello e l'uso di token nei flussi di lavoro con più strumenti.
Il "programmatic tool calling" (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, invece di richiedere round trip attraverso il modello per ogni invocazione di strumento. Questo riduce la "latency" (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 "context window" (finestra di contesto) del modello. Su benchmark di ricerca agentica come BrowseComp e DeepSearchQA, che testano la ricerca web multistep e il recupero di informazioni complesse, l'aggiunta della chiamata programmatica degli strumenti sopra gli strumenti di ricerca di base ha migliorato le prestazioni in media dell'11% utilizzando il 24% in meno di token di input (vedi Improved web search with dynamic filtering).
Considera la verifica della conformità al budget per 20 dipendenti: l'approccio tradizionale richiede 20 round trip separati del modello, portando nel contesto migliaia di voci di spesa 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 una manciata di righe.
La chiamata programmatica degli strumenti richiede lo strumento di esecuzione del codice con la versione dello strumento code_execution_20260120 o successiva. Per verificare se un modello supporta la chiamata programmatica degli strumenti prima di inviare una richiesta, leggi il suo valore capabilities.code_execution.supported dalla Models API. Utilizzo della Models API descrive il campo.
Avvio rapido
Ecco un esempio in cui Claude interroga programmaticamente un database più volte e aggrega i risultati. Aggiungere allowed_callers: ["code_execution_20260120"] a una definizione di strumento è ciò che rende quello strumento chiamabile dall'interno dell'esecuzione del codice (vedi Il campo allowed_callers):
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-5",
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"],
},
],
)
print(response)La risposta si interrompe con stop_reason: "tool_use", un ID container e un blocco tool_use per query_database il cui campo caller identifica l'esecuzione del codice che lo ha chiamato. Restituisci il risultato come mostrato nel Passaggio 3 del flusso di lavoro di esempio in modo che il codice possa terminare.
Come funziona la chiamata programmatica degli strumenti
Quando configuri uno strumento per essere chiamabile dall'esecuzione del codice e Claude determina che quello strumento è necessario:
- Claude scrive codice Python che invoca lo strumento come funzione, includendo potenzialmente più chiamate di strumenti e logica di pre/post-elaborazione
- Claude esegue questo codice in un container sandbox tramite l'esecuzione del codice
- Quando viene chiamata una funzione strumento, l'esecuzione del codice si mette in pausa e l'API restituisce un blocco
tool_use - Tu fornisci il risultato dello strumento e l'esecuzione del codice continua (i risultati intermedi non vengono caricati nella finestra di contesto di Claude)
- Una volta completata tutta l'esecuzione del codice, Claude riceve l'output finale e continua a lavorare sul compito
Questo approccio è particolarmente utile per:
- Elaborazione di grandi quantità di dati: Filtra o aggrega i risultati degli strumenti prima che raggiungano il contesto di Claude
- Flussi di lavoro multistep: Risparmia token e latenza chiamando gli strumenti in serie o in un ciclo senza campionare Claude tra le chiamate degli strumenti
- Logica condizionale: Prendi decisioni basate sui risultati intermedi degli strumenti
Concetti fondamentali
Il campo allowed_callers
Il 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"]- Claude è guidato a chiamare questo strumento direttamente (predefinito se omesso)["code_execution_20260120"]- Claude è guidato a chiamare questo strumento solo dall'interno dell'esecuzione del codice["direct", "code_execution_20260120"]- Claude può chiamare questo strumento direttamente o dall'interno dell'esecuzione del codice
Sia "code_execution_20260120" che "code_execution_20260521" sono accettati in allowed_callers e sono intercambiabili: una richiesta che utilizza una qualsiasi delle due versioni dello strumento di esecuzione del codice soddisfa gli strumenti che elencano uno qualsiasi dei due chiamanti. I blocchi di risposta etichettano sempre il chiamante come code_execution_20260120 indipendentemente dalla versione dichiarata nella richiesta.
Il campo caller nelle risposte
Ogni blocco di uso degli strumenti include un campo caller che indica come è stato invocato:
Invocazione diretta (uso degli strumenti tradizionale):
{
"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 è l'id del blocco server_tool_use di esecuzione del codice che ha effettuato la chiamata, quindi puoi associare ogni tool_use programmatico all'esecuzione del codice che lo ha prodotto.
Ciclo di vita del container
La chiamata programmatica degli strumenti utilizza gli stessi container dell'esecuzione del codice:
- Creazione del container: Viene creato un nuovo container per ogni richiesta a meno che tu non ne riutilizzi uno esistente
- ID del container: Restituito nelle risposte nel campo
container, insieme a un timestampexpires_at - Riutilizzo: Passa l'ID del container nella richiesta successiva per mantenere lo stato. Mentre una chiamata programmatica di strumento è in attesa del tuo risultato, l'ID del container è obbligatorio in quella richiesta, non opzionale: l'API rifiuta la richiesta senza di esso.
- Scadenza:
expires_atti indica quanto tempo rimane al container. I container inattivi vengono attualmente recuperati dopo circa 5 minuti, e nessun container può essere riutilizzato più di 30 giorni dopo la sua creazione.
Flusso di lavoro di esempio
Ecco come funziona un flusso completo di chiamata programmatica degli strumenti:
Passaggio 1: Richiesta iniziale
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.
La forma della richiesta è identica all'esempio di Avvio rapido: includi code_execution nella tua lista di strumenti, aggiungi allowed_callers: ["code_execution_20260120"] a qualsiasi strumento che vuoi che Claude invochi dal codice, e invia il tuo messaggio utente. I passaggi rimanenti di questo flusso di lavoro utilizzano il messaggio utente "Query customer purchase history from the last quarter and identify our top 5 customers by revenue".
Passaggio 2: Risposta API con chiamata di strumento
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": "import json\n\nrows = json.loads(await query_database({'sql': '<sql>'}))\ntop_customers = sorted(rows, 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": "2026-01-20T14:30:00Z"
},
"stop_reason": "tool_use"
}Passaggio 3: Fornisci il risultato dello strumento
Invia l'intera cronologia della conversazione più il risultato del tuo strumento. Tre dettagli sono importanti in questa richiesta:
- Il messaggio utente che trasporta il tuo risultato può contenere solo blocchi
tool_result. Vedi Restrizioni di formattazione dei messaggi. - Passa l'ID
containerdalla risposta in pausa. L'API rifiuta una continuazione che ha chiamate programmatiche di strumenti in sospeso ma nessun ID del container. - Invia lo stesso array
toolsdella richiesta originale. Lo strumento di esecuzione del codice deve essere ancora presente affinché il codice in pausa possa riprendere, e gli strumenti che invii in questa richiesta sono le definizioni che Claude e il codice in esecuzione possono utilizzare per il resto del turno.
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=4096,
container="container_xyz789", # Reuse the container
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}, ...]',
}
],
},
],
# Stesso array di strumenti della richiesta originale
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"],
},
],
)
print(response)Passaggio 4: Chiamata di strumento successiva o completamento
Il codice riprende da dove si era messo in pausa ed elabora il tuo risultato. Ogni risposta di continuazione o si mette nuovamente in pausa con altri blocchi tool_use programmatici, oppure completa l'esecuzione del codice e consente a Claude di continuare il turno (Passaggio 5). Controlla stop_reason e il caller di ogni blocco tool_use per distinguere i due casi: una risposta che si mette in pausa per te ha stop_reason: "tool_use" e un blocco tool_use il cui caller indica una versione di esecuzione del codice, e tu ripeti il Passaggio 3 con un tool_result per ogni chiamata programmatica in sospeso in un unico messaggio utente.
Passaggio 5: Risposta finale
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: [{'customer_id': 'C1', 'revenue': 45000}, {'customer_id': 'C2', 'revenue': 38000}, {'customer_id': 'C5', 'revenue': 32000}, {'customer_id': 'C8', 'revenue': 28500}, {'customer_id': 'C3', 'revenue': 24000}]",
"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"
}Pattern avanzati
Elaborazione batch con cicli
Claude può scrivere codice che elabora più elementi in modo efficiente:
regions = ["West", "East", "Central", "North", "South"]
results = {}
for region in regions:
rows = json.loads(await query_database({"sql": f"<sql for {region}>"}))
results[region] = sum(row["revenue"] for row in rows)
# 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:
- Riduce i round trip del modello da N (uno per regione) a 1
- Elabora grandi set di risultati in modo programmatico prima di restituirli a Claude
- Risparmia token restituendo solo conclusioni aggregate invece di dati grezzi
Terminazione anticipata
Claude può interrompere l'elaborazione non appena i criteri di successo sono soddisfatti:
endpoints = ["us-east", "eu-west", "apac"]
for endpoint in endpoints:
status = await check_health({"endpoint": endpoint})
if status == "healthy":
print(f"Found healthy endpoint: {endpoint}")
break # Stop early, don't check remainingSelezione condizionale degli strumenti
path = "/tmp/example.txt"
file_info = json.loads(await get_file_info({"path": path}))
if file_info["size"] < 10000:
content = await read_full_file({"path": path})
else:
content = await read_file_summary({"path": path})
print(content)Filtraggio dei dati
server_id = "srv-01"
log_text = await fetch_logs({"server_id": server_id})
errors = [line for line in log_text.splitlines() if "ERROR" in line]
print(f"Found {len(errors)} errors")
for error in errors[-10:]: # Only return last 10 errors
print(error)Formato della risposta
Chiamata programmatica di strumento
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"
}
}Gestione del risultato dello strumento
Il risultato del tuo 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}, ...]"
}
]
}Completamento dell'esecuzione del codice
Quando tutte le chiamate di 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": []
}
}Gestione degli errori
Errori comuni
| Errore | Dove appare | Descrizione | Soluzione |
|---|---|---|---|
invalid_tool_input | error_code nel blocco di errore code_execution_tool_result nella risposta | Sono stati passati parametri non validi allo strumento di esecuzione del codice | Vedi gli errori dello strumento di esecuzione del codice |
invalid_request_error (su tool_choice) | Risposta di errore HTTP 400 | tool_choice indica uno strumento il cui allowed_callers non include "direct" | Aggiungi "direct" agli allowed_callers di quello strumento, oppure rimuovi lo strumento da tool_choice e lascia che Claude lo invochi dal codice |
Scadenza del container durante la chiamata dello strumento
Se il risultato del tuo strumento non arriva entro circa 4 minuti, la chiamata in sospeso solleva un TimeoutError all'interno del codice in esecuzione di Claude. Claude vede l'errore in stderr e tipicamente ritenta la chiamata:
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_abc123",
"content": {
"type": "code_execution_result",
"stdout": "",
"stderr": "TimeoutError: Calling tool ['query_database'] timed out (no response after 270s).",
"return_code": 0,
"content": []
}
}Per prevenire i timeout:
- Monitora il campo
expires_atnelle risposte - Implementa timeout per l'esecuzione dei tuoi strumenti
- Considera di suddividere le operazioni lunghe in blocchi più piccoli
Errori di esecuzione degli strumenti
Se 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.
Vincoli e limitazioni
Incompatibilità delle funzionalità
- Output strutturati: Gli strumenti con
strict: truenon sono supportati con la chiamata programmatica - Scelta dello strumento: Non puoi forzare la chiamata programmatica di uno strumento specifico tramite
tool_choice - Uso parallelo degli strumenti:
disable_parallel_tool_use: truenon è supportato con la chiamata programmatica
Limitazioni dello schema di input
Gli strumenti personalizzati il cui input_schema contiene un $ref ricorsivo (un ciclo di riferimenti, come uno schema che fa riferimento a se stesso) non possono essere abilitati per la chiamata programmatica. Includere una versione dello strumento di esecuzione del codice in allowed_callers per un tale strumento fa fallire la richiesta con un 400 invalid_request_error il cui messaggio contiene Circular $ref detected. Lo stesso schema è accettato per la chiamata diretta degli strumenti.
Per aggirare questo problema, esegui una delle seguenti operazioni:
- Mantieni lo strumento solo diretto omettendo
allowed_callers(o impostandolo su["direct"]). Gli altri strumenti nella stessa richiesta possono comunque utilizzare la chiamata programmatica. - Rimuovi il ciclo dallo schema. Ad esempio, srotola la ricorsione a una profondità fissa e descrivi qualsiasi annidamento più profondo nella
descriptiondel livello più interno, oppure sostituisci la proprietà ricorsiva con un semplice{"type": "object"}la cuidescriptionspiega la forma attesa.
Restrizioni degli strumenti
I seguenti strumenti non possono essere chiamati in modo programmatico:
- Strumenti forniti da un connettore MCP
- I toolset computer use e browser use (
computer_toolset_20260801ebrowser_toolset_20260801), il cui campoallowed_callersaccetta solo"direct"
Restrizioni di formattazione dei messaggi
Quando rispondi alle chiamate programmatiche di strumenti, ci sono requisiti di formattazione rigorosi:
Risposte con soli risultati di strumenti: Se ci sono chiamate programmatiche di strumenti in sospeso 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 degli strumenti.
Non valido - Non è possibile includere testo quando si risponde a chiamate programmatiche di 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 di strumenti quando si risponde a chiamate programmatiche di 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 di strumenti programmatiche (esecuzione del codice). Per le normali chiamate di strumenti lato client, puoi includere contenuto testuale dopo i risultati degli strumenti.
Contenuto dei risultati degli strumenti solo testuale: Il content di ogni tool_result che risponde a una chiamata programmatica deve essere una stringa o blocchi text. Immagini, documenti e altri tipi di blocchi di contenuto vengono rifiutati.
Limiti di velocità
Le chiamate programmatiche di strumenti sono soggette agli stessi "rate limit" (limiti di velocità) delle normali chiamate di strumenti. Ogni chiamata di strumento dall'esecuzione del codice conta come un'invocazione separata.
Valida i risultati degli strumenti prima dell'uso
Quando implementi strumenti definiti dall'utente che verranno chiamati in modo programmatico:
- I risultati degli strumenti vengono restituiti come stringhe: Possono contenere qualsiasi contenuto, inclusi frammenti di codice o comandi eseguibili che potrebbero essere elaborati dall'ambiente di esecuzione.
- Valida i risultati degli strumenti esterni: Se il tuo strumento restituisce dati da fonti esterne o accetta input dell'utente, sii consapevole dei rischi di code injection se l'output verrà interpretato o eseguito come codice.
Efficienza dei token
La chiamata programmatica degli strumenti riduce il consumo di token in tre modi:
- I risultati degli strumenti dalle chiamate programmatiche non vengono aggiunti al contesto di Claude - solo l'output finale del codice lo è
- L'elaborazione intermedia avviene nel codice - filtraggio, aggregazione e altre trasformazioni non consumano token del modello
- Più chiamate di strumenti in un'unica esecuzione del codice - riduce l'overhead rispetto a turni del modello separati
Ad esempio, chiamare 10 strumenti direttamente utilizza circa 10 volte i token rispetto a chiamarli in modo programmatico e restituire un riepilogo.
Nelle valutazioni interne di Anthropic su un modello Claude di produzione:
- Su un benchmark di agente di project management con 75 strumenti, l'abilitazione della chiamata programmatica degli strumenti ha ridotto i token di input fatturati di circa il 38% senza alcuna variazione nell'accuratezza dei compiti.
- Su τ²-bench (domini aereo, retail e telecomunicazioni), dove ogni turno effettua una o due chiamate di strumenti sequenziali, la chiamata programmatica degli strumenti ha lasciato i punteggi invariati ed è costata circa l'8% in più. I flussi di lavoro sequenziali a chiamata singola non ne traggono beneficio.
- Nel traffico API di produzione, le richieste il cui array
toolscontiene da 10 a 49 definizioni di strumenti registrano risparmi tipici di token dal 20% al 40% con la chiamata programmatica degli strumenti abilitata.
I risparmi effettivi variano in base alla forma del carico di lavoro. Vedi Quando usare la chiamata programmatica.
Utilizzo e prezzi
La chiamata programmatica degli strumenti utilizza gli stessi prezzi dell'esecuzione del codice. Consulta i prezzi dell'esecuzione del codice per i dettagli.
Best practice
Progettazione degli strumenti
- Fornisci descrizioni dettagliate dell'output: Poiché Claude deserializza i risultati degli strumenti nel codice, documenta il formato (struttura JSON e tipi dei campi)
- Restituisci dati strutturati: JSON o altri formati leggibili dalle macchine funzionano meglio per l'elaborazione programmatica
- Mantieni le risposte concise: Restituisci solo i dati necessari per minimizzare l'overhead di elaborazione
Quando usare la chiamata programmatica
La chiamata programmatica degli strumenti scambia un piccolo overhead fisso (avvio del container, generazione dello script) con grandi risparmi sui token dei risultati degli strumenti e sui round trip del modello. Se questo scambio conviene dipende dalla forma del carico di lavoro.
Adatta:
- Operazioni fan-out o parallele su molti elementi (ad esempio, controllare 50 endpoint o cercare 20 record)
- Risultati di strumenti di grandi dimensioni che possono essere filtrati, aggregati o riepilogati prima di raggiungere il contesto di Claude
- Ricerca e recupero agentici, dove l'interrogazione iterativa e il filtraggio dei risultati dominano il flusso di lavoro
Poco adatta:
- Flussi di lavoro strettamente sequenziali in cui ogni chiamata dipende dal ragionamento di Claude sul risultato precedente, perché in quel caso lo script non può saltare il round trip del modello
- Un piccolo numero di chiamate di strumenti con risposte piccole, specialmente al primo turno di una conversazione, dove l'overhead del container e dello script può superare i risparmi
- Strumenti che richiedono un feedback immediato dell'utente tra le chiamate
Se non sei sicuro, misura i token di input fatturati con e senza allowed_callers su un campione rappresentativo del tuo traffico prima di abilitarla in modo esteso.
Ottimizzazione delle prestazioni
- Riutilizza i container quando effettui più richieste correlate per mantenere lo stato
- Raggruppa operazioni simili in un'unica esecuzione del codice quando possibile
Risoluzione dei problemi
Problemi comuni
invalid_request_error quando si imposta tool_choice
tool_choicenon può indicare uno strumento il cuiallowed_callersomette"direct". Aggiungi"direct"agliallowed_callersdi quello strumento, oppure rimuovi lo strumento datool_choicee lascia che Claude lo invochi dal codice.
Scadenza del container
- Rispondi a ogni chiamata programmatica di strumento ben prima del timestamp
expires_atdella risposta in pausa. Il codice di Claude smette di attendere un risultato dopo circa 4 minuti, e i container inattivi vengono attualmente recuperati dopo circa 5 minuti. - Considera di implementare un'esecuzione degli strumenti più veloce
Risultato dello strumento non analizzato correttamente
- Assicurati che il tuo strumento restituisca dati stringa che Claude possa deserializzare
- Fornisci una documentazione chiara del formato di output nella descrizione del tuo strumento
Suggerimenti per il debugging
- Registra tutte le chiamate di strumenti e i risultati per tracciare il flusso
- Controlla il campo
callerper confermare l'invocazione programmatica - Monitora gli ID dei container per garantire un corretto riutilizzo
- Testa gli strumenti in modo indipendente prima di abilitare la chiamata programmatica
Perché la chiamata programmatica degli strumenti funziona
Claude è addestrato su grandi quantità di codice, quindi presentare gli strumenti come funzioni Python chiamabili gli consente di sfruttare questo punto di forza:
- Composizione degli strumenti: Chiamate concatenate, cicli e condizionali sono normale flusso di controllo Python invece di una serie di round trip del modello
- Elaborazione dei risultati: Il codice di Claude filtra e aggrega output di strumenti di grandi dimensioni, o li scrive su file, e solo l'output finale entra nella finestra di contesto
- Latenza: Il modello non viene ricampionato tra le chiamate di strumenti all'interno di un'unica esecuzione del codice
Implementazioni alternative
La chiamata programmatica degli strumenti è un pattern generalizzabile che può essere implementato anche sulla tua infrastruttura. Ecco come si confrontano gli approcci:
Esecuzione diretta lato client
Fornisci a Claude uno strumento di esecuzione del codice e descrivi quali funzioni sono disponibili in quell'ambiente. Quando Claude invoca lo strumento con del codice, la tua applicazione lo esegue localmente dove quelle funzioni sono definite.
Vantaggi:
- Minima riprogettazione della tua applicazione
- Pieno controllo sull'ambiente e sulle istruzioni
Svantaggi:
- Esegue codice non attendibile al di fuori di una sandbox
- Le invocazioni degli strumenti possono essere vettori di code injection
Usa quando: La tua applicazione può eseguire in sicurezza codice arbitrario, vuoi l'implementazione più piccola possibile e l'offerta gestita di Anthropic non si adatta alle tue esigenze.
Esecuzione sandbox autogestita
Stesso approccio dal punto di vista di Claude, ma il codice viene eseguito in un container sandbox con restrizioni di sicurezza (ad esempio, nessun traffico di rete in uscita). Se i tuoi strumenti richiedono risorse esterne, avrai bisogno di un protocollo per eseguire le chiamate degli strumenti al di fuori della sandbox.
Vantaggi:
- Chiamata programmatica degli strumenti sicura sulla tua infrastruttura
- Pieno controllo sull'ambiente di esecuzione
Svantaggi:
- Complessa da costruire e mantenere
- Richiede la gestione sia dell'infrastruttura che della comunicazione tra processi
Usa quando: La sicurezza è critica e la soluzione gestita di Anthropic non si adatta ai tuoi requisiti.
Esecuzione gestita da Anthropic
La chiamata programmatica degli strumenti di Anthropic è una versione gestita dell'esecuzione sandbox con un ambiente Python opinionated ottimizzato per Claude. Anthropic gestisce la gestione dei container, l'esecuzione del codice e la comunicazione sicura per l'invocazione degli strumenti.
Vantaggi:
- Sicura e protetta per impostazione predefinita
- Abilitata con una definizione di strumento, senza infrastruttura da gestire
- Ambiente e istruzioni ottimizzati per Claude
Considera l'utilizzo della soluzione gestita di Anthropic se stai utilizzando la Claude API, Claude Platform on AWS o Microsoft Foundry. Su Microsoft Foundry, la chiamata programmatica degli strumenti richiede un deployment Hosted on Anthropic.
Conservazione dei dati
La chiamata programmatica degli strumenti è costruita sull'infrastruttura di esecuzione del codice e utilizza gli stessi container sandbox. I dati dei container, inclusi gli artefatti di esecuzione e gli output, vengono conservati per un massimo di 30 giorni.
Per l'idoneità ZDR di tutte le funzionalità, consulta API e conservazione dei dati.
Passaggi successivi
Trasmetti in streaming gli input degli strumenti senza buffering JSON lato server per applicazioni sensibili alla latenza.
Esegui codice Python e bash in un container sandbox per analizzare dati, generare file e iterare sulle soluzioni.
Collega Claude a strumenti e API esterni. Scopri dove vengono eseguiti gli strumenti, quando Claude li chiama e quale strumento si adatta al tuo compito.
Specifica gli schemi degli strumenti, scrivi descrizioni efficaci e controlla quando Claude chiama i tuoi strumenti.
Compatibility
- Supported models
- Fable 5 and 5.1
- Mythos 5 and 5.1
- Opus 4.5, 4.6, 4.7, 4.8, 5, and 5.5
- Sonnet 4.5, 4.6, 5, and 5.5
- Haiku 5.5
- Supported platforms
- Claude API
- Claude Platform on AWS
- Microsoft Foundry1
- Su Microsoft Foundry, la chiamata programmatica degli strumenti richiede un deployment Hosted on Anthropic. ↩
- La chiamata programmatica degli strumenti richiede lo strumento di esecuzione del codice con la versione dello strumento
code_execution_20260120o successiva. - Claude Haiku 4.5 accetta le versioni dello strumento
code_execution_20260120e successive, ma non supporta la chiamata programmatica degli strumenti.
Was this page helpful?