L'elaborazione in batch è un approccio potente per gestire grandi volumi di richieste in modo efficiente. Invece di elaborare le richieste una alla volta con risposte immediate, l'elaborazione in batch ti consente di inviare più richieste insieme per l'elaborazione asincrona. Questo modello è particolarmente utile quando:
L'API Message Batches è la nostra prima implementazione di questo modello.
L'API Message Batches è un modo potente e conveniente per elaborare in modo asincrono grandi volumi di richieste Messages. Questo approccio è ben adatto a compiti che non richiedono risposte immediate, con la maggior parte dei batch che si completano in meno di 1 ora riducendo i costi del 50% e aumentando la velocità effettiva.
Puoi esplorare il riferimento API direttamente, oltre a questa guida.
Quando invii una richiesta all'API Message Batches:
Questo è particolarmente utile per operazioni in blocco che non richiedono risultati immediati, come:
Tutti i modelli attivi supportano l'API Message Batches.
Qualsiasi richiesta che puoi fare all'API Messages può essere inclusa in un batch. Questo include:
Poiché ogni richiesta nel batch viene elaborata indipendentemente, puoi mescolare diversi tipi di richieste all'interno di un singolo batch.
Poiché i batch possono richiedere più di 5 minuti per l'elaborazione, considera l'utilizzo della durata della cache di 1 ora con la memorizzazione nella cache dei prompt per migliori tassi di hit della cache durante l'elaborazione di batch con contesto condiviso.
L'API Batches offre risparmi significativi sui costi. Tutti gli utilizzi vengono addebitati al 50% dei prezzi API standard.
| Model | Batch input | Batch output |
|---|---|---|
| Claude Opus 4.5 | $2.50 / MTok | $12.50 / MTok |
| Claude Opus 4.1 | $7.50 / MTok | $37.50 / MTok |
| Claude Opus 4 | $7.50 / MTok | $37.50 / MTok |
| Claude Sonnet 4.5 | $1.50 / MTok | $7.50 / MTok |
| Claude Sonnet 4 | $1.50 / MTok | $7.50 / MTok |
| Claude Sonnet 3.7 (deprecated) | $1.50 / MTok | $7.50 / MTok |
| Claude Haiku 4.5 | $0.50 / MTok | $2.50 / MTok |
| Claude Haiku 3.5 | $0.40 / MTok | $2 / MTok |
| Claude Opus 3 () |
Un Message Batch è composto da un elenco di richieste per creare un Message. La forma di una singola richiesta è composta da:
custom_id univoco per identificare la richiesta Messagesparams con i parametri standard dell'API MessagesPuoi creare un batch passando questo elenco nel parametro requests:
In questo esempio, due richieste separate vengono elaborate in batch insieme per l'elaborazione asincrona. Ogni richiesta ha un custom_id univoco e contiene i parametri standard che useresti per una chiamata all'API Messages.
Testa le tue richieste di batch con l'API Messages
La convalida dell'oggetto params per ogni richiesta di messaggio viene eseguita in modo asincrono e gli errori di convalida vengono restituiti quando l'elaborazione dell'intero batch è terminata. Puoi assicurarti di costruire il tuo input correttamente verificando la forma della tua richiesta con l'API Messages per primo.
Quando un batch viene creato per la prima volta, la risposta avrà uno stato di elaborazione di in_progress.
{
"id": "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d",
"type": "message_batch",
"processing_status": "in_progress",
"request_counts": {
"processing": 2,
"succeeded": 0,
"errored": 0,
"canceled": 0,
"expired": 0
},
"ended_at": null,
"created_at": "2024-09-24T18:37:24.100435Z",
"expires_at": "2024-09-25T18:37:24.100435Z",
"cancel_initiated_at": null,
"results_url": null
}Il campo processing_status del Message Batch indica la fase di elaborazione in cui si trova il batch. Inizia come in_progress, quindi si aggiorna a ended una volta che tutte le richieste nel batch hanno finito l'elaborazione e i risultati sono pronti. Puoi monitorare lo stato del tuo batch visitando la Console, o utilizzando l'endpoint di recupero.
Per eseguire il polling di un Message Batch, avrai bisogno del suo id, che viene fornito nella risposta quando crei un batch o elencando i batch. Puoi implementare un ciclo di polling che controlla periodicamente lo stato del batch fino a quando l'elaborazione non è terminata:
Puoi elencare tutti i Message Batches nel tuo Workspace utilizzando l'endpoint di elenco. L'API supporta la paginazione, recuperando automaticamente pagine aggiuntive secondo necessità:
Una volta terminata l'elaborazione del batch, ogni richiesta Messages nel batch avrà un risultato. Ci sono 4 tipi di risultati:
| Tipo di risultato | Descrizione |
|---|---|
succeeded | La richiesta è stata completata con successo. Include il risultato del messaggio. |
errored | La richiesta ha riscontrato un errore e un messaggio non è stato creato. Gli errori possibili includono richieste non valide e errori interni del server. Non ti verrà addebitato per queste richieste. |
canceled | L'utente ha annullato il batch prima che questa richiesta potesse essere inviata al modello. Non ti verrà addebitato per queste richieste. |
expired | Il batch ha raggiunto la sua scadenza di 24 ore prima che questa richiesta potesse essere inviata al modello. Non ti verrà addebitato per queste richieste. |
Vedrai una panoramica dei tuoi risultati con il request_counts del batch, che mostra quante richieste hanno raggiunto ognuno di questi quattro stati.
I risultati del batch sono disponibili per il download nella proprietà results_url sul Message Batch e, se il permesso dell'organizzazione lo consente, nella Console. A causa della potenziale grande dimensione dei risultati, è consigliato trasmettere i risultati invece di scaricarli tutti in una volta.
I risultati saranno in formato .jsonl, dove ogni riga è un oggetto JSON valido che rappresenta il risultato di una singola richiesta nel Message Batch. Per ogni risultato trasmesso, puoi fare qualcosa di diverso a seconda del suo custom_id e del tipo di risultato. Ecco un esempio di set di risultati:
{"custom_id":"my-second-request","result":{"type":"succeeded","message":{"id":"msg_014VwiXbi91y3JMjcpyGBHX5","type":"message","role":"assistant","model":"claude-sonnet-4-5-20250929","content":[{"type":"text","text":"Hello again! It's nice to see you. How can I assist you today? Is there anything specific you'd like to chat about or any questions you have?"}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":11,"output_tokens":36}}}}
{"custom_id":"my-first-request","result":{"type":"succeeded","message":{"id":"msg_01FqfsLoHwgeFbguDgpz48m7","type":"message","role":"assistant","model":"claude-sonnet-4-5-20250929","content":[{"type":"text","text":"Hello! How can I assist you today? Feel free to ask me any questions or let me know if there's anything you'd like to chat about."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":10,"output_tokens":34}}}}Se il tuo risultato ha un errore, il suo result.error sarà impostato sulla nostra forma di errore standard.
I risultati del batch potrebbero non corrispondere all'ordine di input
I risultati del batch possono essere restituiti in qualsiasi ordine e potrebbero non corrispondere all'ordine delle richieste quando il batch è stato creato. Nell'esempio precedente, il risultato per la seconda richiesta del batch viene restituito prima della prima. Per abbinare correttamente i risultati alle loro richieste corrispondenti, usa sempre il campo custom_id.
Puoi annullare un Message Batch che è attualmente in elaborazione utilizzando l'endpoint di annullamento. Immediatamente dopo l'annullamento, il processing_status di un batch sarà canceling. Puoi utilizzare la stessa tecnica di polling descritta sopra per attendere fino a quando l'annullamento non è finalizzato. I batch annullati finiscono con uno stato di ended e possono contenere risultati parziali per le richieste che sono state elaborate prima dell'annullamento.
La risposta mostrerà il batch in uno stato canceling:
{
"id": "msgbatch_013Zva2CMHLNnXjNJJKqJ2EF",
"type": "message_batch",
"processing_status": "canceling",
"request_counts": {
"processing": 2,
"succeeded": 0,
"errored": 0,
"canceled": 0,
"expired": 0
},
"ended_at": null,
"created_at": "2024-09-24T18:37:24.100435Z",
"expires_at": "2024-09-25T18:37:24.100435Z",
"cancel_initiated_at": "2024-09-24T18:39:03.114875Z",
"results_url": null
}L'API Message Batches supporta la cache dei prompt, consentendoti di ridurre potenzialmente i costi e il tempo di elaborazione per le richieste batch. Gli sconti sui prezzi dalla cache dei prompt e da Message Batches possono accumularsi, fornendo risparmi sui costi ancora maggiori quando entrambe le funzionalità vengono utilizzate insieme. Tuttavia, poiché le richieste batch vengono elaborate in modo asincrono e concorrente, i cache hit sono forniti su base best-effort. Gli utenti in genere sperimentano tassi di cache hit che vanno dal 30% al 98%, a seconda dei loro modelli di traffico.
Per massimizzare la probabilità di cache hit nelle tue richieste batch:
cache_control identici in ogni richiesta Message all'interno del tuo batchEsempio di implementazione della cache dei prompt in un batch:
In questo esempio, entrambe le richieste nel batch includono messaggi di sistema identici e il testo completo di Pride and Prejudice contrassegnato con cache_control per aumentare la probabilità di cache hit.
Per ottenere il massimo dall'API Batches:
custom_id significativi per abbinare facilmente i risultati alle richieste, poiché l'ordine non è garantito.Se si verificano comportamenti inaspettati:
request_too_large.custom_id univoco.created_at del batch (non dal tempo di elaborazione ended_at). Se sono passati più di 29 giorni, i risultati non saranno più visualizzabili.Nota che il fallimento di una richiesta in un batch non influisce sull'elaborazione delle altre richieste.
Isolamento dell'area di lavoro: I batch sono isolati all'interno dell'area di lavoro in cui vengono creati. Possono essere accessibili solo da chiavi API associate a quell'area di lavoro, o da utenti con autorizzazione per visualizzare i batch dell'area di lavoro nella Console.
Disponibilità dei risultati: I risultati del batch sono disponibili per 29 giorni dopo la creazione del batch, consentendo ampio tempo per il recupero e l'elaborazione.
| $7.50 / MTok |
| $37.50 / MTok |
| Claude Haiku 3 | $0.125 / MTok | $0.625 / MTok |
curl https://api.anthropic.com/v1/messages/batches \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"requests": [
{
"custom_id": "my-first-request",
"params": {
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, world"}
]
}
},
{
"custom_id": "my-second-request",
"params": {
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hi again, friend"}
]
}
}
]
}'import anthropic
import time
client = anthropic.Anthropic()
message_batch = None
while True:
message_batch = client.messages.batches.retrieve(
MESSAGE_BATCH_ID
)
if message_batch.processing_status == "ended":
break
print(f"Batch {MESSAGE_BATCH_ID} is still processing...")
time.sleep(60)
print(message_batch)import anthropic
client = anthropic.Anthropic()
# Automatically fetches more pages as needed.
for message_batch in client.messages.batches.list(
limit=20
):
print(message_batch)#!/bin/sh
curl "https://api.anthropic.com/v1/messages/batches/msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d" \
--header "anthropic-version: 2023-06-01" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
| grep -o '"results_url":[[:space:]]*"[^"]*"' \
| cut -d'"' -f4 \
| while read -r url; do
curl -s "$url" \
--header "anthropic-version: 2023-06-01" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
| sed 's/}{/}\n{/g' \
| while IFS= read -r line
do
result_type=$(echo "$line" | sed -n 's/.*"result":[[:space:]]*{[[:space:]]*"type":[[:space:]]*"\([^"]*\)".*/\1/p')
custom_id=$(echo "$line" | sed -n 's/.*"custom_id":[[:space:]]*"\([^"]*\)".*/\1/p')
error_type=$(echo "$line" | sed -n 's/.*"error":[[:space:]]*{[[:space:]]*"type":[[:space:]]*"\([^"]*\)".*/\1/p')
case "$result_type" in
"succeeded")
echo "Success! $custom_id"
;;
"errored")
if [ "$error_type" = "invalid_request" ]; then
# Request body must be fixed before re-sending request
echo "Validation error: $custom_id"
else
# Request can be retried directly
echo "Server error: $custom_id"
fi
;;
"expired")
echo "Expired: $line"
;;
esac
done
done
import anthropic
client = anthropic.Anthropic()
message_batch = client.messages.batches.cancel(
MESSAGE_BATCH_ID,
)
print(message_batch)curl https://api.anthropic.com/v1/messages/batches \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"requests": [
{
"custom_id": "my-first-request",
"params": {
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"system": [
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n"
},
{
"type": "text",
"text": "<the entire contents of Pride and Prejudice>",
"cache_control": {"type": "ephemeral"}
}
],
"messages": [
{"role": "user", "content": "Analyze the major themes in Pride and Prejudice."}
]
}
},
{
"custom_id": "my-second-request",
"params": {
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"system": [
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n"
},
{
"type": "text",
"text": "<the entire contents of Pride and Prejudice>",
"cache_control": {"type": "ephemeral"}
}
],
"messages": [
{"role": "user", "content": "Write a summary of Pride and Prejudice."}
]
}
}
]
}'