L'elaborazione 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 batch consente di inviare più richieste insieme per l'elaborazione asincrona. Questo pattern è particolarmente utile quando:
La Message Batches API è la prima implementazione di questo pattern da parte di Anthropic.
Questa funzionalità non è idonea per Zero Data Retention (ZDR). I dati vengono conservati secondo la politica di conservazione standard della funzionalità.
La Message Batches API è un modo potente ed economico per elaborare in modo asincrono grandi volumi di richieste Messages. Questo approccio è adatto a compiti che non richiedono risposte immediate, con la maggior parte dei batch che termina in meno di 1 ora riducendo i costi del 50% e aumentando il throughput.
Puoi esplorare direttamente il riferimento API, oltre a questa guida.
Quando invii una richiesta alla Message Batches API:
Questo è particolarmente utile per operazioni in blocco che non richiedono risultati immediati, come:
max_tokens di almeno 1. max_tokens: 0 (pre-riscaldamento della cache) non è supportato all'interno di un batch, poiché una voce di cache effimera scritta durante l'elaborazione del batch probabilmente scadrebbe prima dell'esecuzione della richiesta successiva.Tutti i modelli attivi supportano la Message Batches API.
Quasi tutte le richieste che puoi fare alla Messages API possono essere incluse in un batch. Questo include:
Poiché ogni richiesta nel batch viene elaborata indipendentemente, puoi combinare diversi tipi di richieste all'interno di un singolo batch.
Un piccolo numero di parametri della Messages API non è supportato nelle richieste batch. L'inclusione di uno qualsiasi di questi restituisce un errore di validazione:
| Parametro | Motivo |
|---|---|
stream: true | I risultati del batch vengono restituiti come un singolo file, non come uno stream. |
speed (Fast mode) | La Fast mode ottimizza la latenza sincrona, che non si applica all'elaborazione batch asincrona. |
store / previous_thread_event_id (Threads) | I Thread sono stateful; le richieste batch non lo sono. |
cache_hint / context_hint | Questi suggerimenti di routing si applicano solo alla pianificazione delle richieste sincrone. |
max_tokens: 0 | Consulta Limitazioni dei batch. |
research_preview_2026_02: "active" | La modalità research preview non è disponibile nel percorso 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 cache dei prompt per ottenere migliori tassi di cache hit durante l'elaborazione di batch con contesto condiviso.
La Batches API offre significativi risparmi sui costi. Tutto l'utilizzo viene addebitato al 50% dei prezzi standard dell'API.
| Modello | Input batch | Output batch |
|---|---|---|
| Claude Fable 5 | $5 / MTok | $25 / MTok |
| Claude Mythos 5 (disponibilità limitata) | $5 / MTok | $25 / MTok |
| Claude Opus 4.8 | $2.50 / MTok | $12.50 / MTok |
| Claude Opus 4.7 | $2.50 / MTok | $12.50 / MTok |
| Claude Opus 4.6 | $2.50 / MTok | $12.50 / MTok |
| Claude Opus 4.5 | $2.50 / MTok | $12.50 / MTok |
| Claude Opus 4.1 (deprecato) | $7.50 / MTok | $37.50 / MTok |
| Claude Opus 4 (ritirato, eccetto su Google Cloud) | $7.50 / MTok | $37.50 / MTok |
| Claude Sonnet 5 fino al 31 agosto 2026 | $1 / MTok | $5 / MTok |
| Claude Sonnet 5 a partire dal 1° settembre 2026 | $1.50 / MTok | $7.50 / MTok |
| Claude Sonnet 4.6 | $1.50 / MTok | $7.50 / MTok |
| Claude Sonnet 4.5 | $1.50 / MTok | $7.50 / MTok |
| Claude Sonnet 4 (ritirato, eccetto su Bedrock e Google Cloud) | $1.50 / MTok | $7.50 / MTok |
| Claude Haiku 4.5 | $0.50 / MTok | $2.50 / MTok |
| Claude Haiku 3.5 (ritirato, eccetto su Bedrock e Google Cloud) | $0.40 / MTok | $2 / MTok |
Un Message Batch è composto da un elenco di richieste per creare un Message. La struttura di una singola richiesta è composta da:
custom_id univoco per identificare la richiesta Messages. Deve essere compreso tra 1 e 64 caratteri e contenere solo caratteri alfanumerici, trattini e underscore (corrispondente a ^[a-zA-Z0-9_-]{1,64}$).params con i parametri standard della Messages APIPuoi creare un batch passando questo elenco nel parametro requests:
from anthropic.types.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.messages.batch_create_params import Request
client = anthropic.Anthropic()
message_batch = client.messages.batches.create(
requests=[
Request(
custom_id="my-first-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Hello, world",
}
],
),
),
Request(
custom_id="my-second-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Hi again, friend",
}
],
),
),
]
)
print(message_batch)In questo esempio, due richieste separate vengono raggruppate insieme per l'elaborazione asincrona. Ogni richiesta ha un custom_id univoco e contiene i parametri standard che useresti per una chiamata alla Messages API.
Testa le tue richieste batch con la Messages API
La validazione dell'oggetto params per ogni richiesta di messaggio viene eseguita in modo asincrono, e gli errori di validazione vengono restituiti quando l'elaborazione dell'intero batch è terminata. Puoi assicurarti di costruire correttamente il tuo input verificando prima la struttura della tua richiesta con la Messages API.
Quando un batch viene creato per la prima volta, la risposta avrà uno stato di elaborazione 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 terminato 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 al termine dell'elaborazione:
import time
client = anthropic.Anthropic()
MESSAGE_BATCH_ID = "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d"
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)Puoi elencare tutti i Message Batch nel tuo Workspace utilizzando l'endpoint di elenco. L'API supporta la paginazione, recuperando automaticamente pagine aggiuntive secondo necessità:
client = anthropic.Anthropic()
# Recupera automaticamente più pagine secondo necessità.
for message_batch in client.messages.batches.list(limit=20):
print(message_batch)Una volta terminata l'elaborazione del batch, ogni richiesta Messages nel batch ha un risultato. Esistono 4 tipi di risultato:
| Tipo di risultato | Descrizione |
|---|---|
succeeded | La richiesta è andata a buon fine. Include il risultato del messaggio. |
errored | La richiesta ha riscontrato un errore e non è stato creato un messaggio. I possibili errori includono richieste non valide ed errori interni del server. Non ti verranno addebitate queste richieste. |
canceled | L'utente ha annullato il batch prima che questa richiesta potesse essere inviata al modello. Non ti verranno addebitate queste richieste. |
expired | Il batch ha raggiunto la sua scadenza di 24 ore prima che questa richiesta potesse essere inviata al modello. Non ti verranno addebitate queste richieste. |
Vedrai una panoramica dei tuoi risultati con il request_counts del batch, che mostra quante richieste hanno raggiunto ciascuno di questi quattro stati.
I risultati del batch sono disponibili per il download nella proprietà results_url del Message Batch e, se i permessi dell'organizzazione lo consentono, nella Console. A causa delle dimensioni potenzialmente grandi dei risultati, si consiglia di eseguire lo streaming dei risultati anziché scaricarli tutti in una volta.
client = anthropic.Anthropic()
# Trasmetti in streaming il file dei risultati in blocchi efficienti in memoria, elaborandone uno alla volta
for result in client.messages.batches.results(
"msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d",
):
match result.result.type:
case "succeeded":
print(f"Success! {result.custom_id}")
case "errored":
if result.result.error.error.type == "invalid_request_error":
# Il corpo della richiesta deve essere corretto prima di reinviare la richiesta
print(f"Validation error {result.custom_id}")
else:
# La richiesta può essere ritentata direttamente
print(f"Server error {result.custom_id}")
case "expired":
print(f"Request expired {result.custom_id}")I risultati sono in formato .jsonl, dove ogni riga è un oggetto JSON valido che rappresenta il risultato di una singola richiesta nel Message Batch. Per ogni risultato in streaming, 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-opus-4-8","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-opus-4-8","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 struttura 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'ordinamento delle richieste quando il batch è stato creato. Nell'esempio sopra, il risultato della seconda richiesta del batch viene restituito prima della prima. Per abbinare correttamente i risultati alle richieste corrispondenti, usa sempre il campo custom_id.
Puoi annullare un Message Batch 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 è finalizzato. I batch annullati terminano con uno stato ended e possono contenere risultati parziali per le richieste che sono state elaborate prima dell'annullamento.
client = anthropic.Anthropic()
MESSAGE_BATCH_ID = "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d"
message_batch = client.messages.batches.cancel(
MESSAGE_BATCH_ID,
)
print(message_batch)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
}La Message Batches API supporta la cache dei prompt, consentendoti di ridurre potenzialmente i costi e i tempi di elaborazione per le richieste batch. Gli sconti sui prezzi della cache dei prompt e dei Message Batch possono cumularsi, offrendo 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 vengono forniti su base best-effort. Gli utenti in genere sperimentano tassi di cache hit che vanno dal 30% al 98%, a seconda dei loro pattern 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:
from anthropic.types.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.messages.batch_create_params import Request
client = anthropic.Anthropic()
message_batch = client.messages.batches.create(
requests=[
Request(
custom_id="my-first-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-4-8",
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.",
}
],
),
),
Request(
custom_id="my-second-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-4-8",
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.",
}
],
),
),
]
)In questo esempio, entrambe le richieste nel batch includono messaggi di sistema identici e il testo completo di Orgoglio e Pregiudizio contrassegnato con cache_control per aumentare la probabilità di cache hit.
Tutti gli strumenti server (ricerca web, recupero web, esecuzione di codice, connettori MCP, advisor e ricerca strumenti) funzionano nelle richieste batch. Il worker del batch esegue lo stesso ciclo agentico lato server della Messages API sincrona.
Poiché non c'è una connessione aperta da mantenere, il ciclo batch esegue più iterazioni per turno rispetto a una richiesta sincrona prima di restituire stop_reason: "pause_turn". Se un risultato del batch ritorna con pause_turn, il turno non è terminato; puoi continuarlo inviando il contenuto dell'assistente in pausa in una richiesta successiva (batch o sincrona) esattamente come mostrato nel pattern di continuazione pause_turn.
Il worker del batch inoltre limita web_search per organizzazione in modo che l'elaborazione batch altamente concorrente non esaurisca il limite di velocità della ricerca web della tua organizzazione. Il batch riprova automaticamente le richieste limitate; non devi gestirlo tu stesso, ma batch di ricerca web molto grandi potrebbero richiedere più tempo per essere completati.
L'header beta output-300k-2026-03-24 aumenta il limite di max_tokens a 300.000 per le richieste batch che utilizzano Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, Claude Sonnet 5 o Claude Sonnet 4.6. Includi l'header per generare output molto più lunghi del limite standard (da 64k a 128k a seconda del modello) in un singolo turno.
L'output esteso è disponibile solo sulla Message Batches API, non sulla Messages API sincrona. È supportato sulla Claude API e Claude Platform su AWS, e non è attualmente disponibile su Amazon Bedrock, Google Cloud o Microsoft Foundry.
Usa l'output esteso per la generazione di contenuti lunghi come bozze della lunghezza di un libro e documentazione tecnica, estrazione esaustiva di dati strutturati, grandi scaffold di generazione di codice e lunghe catene di ragionamento.
Una singola generazione di 300k token può richiedere più di un'ora per essere completata, quindi pianifica i tuoi invii batch tenendo presente la finestra di elaborazione di 24 ore. Si applicano i prezzi batch standard (50% dei prezzi standard dell'API).
from anthropic.types.beta.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.beta.messages.batch_create_params import Request
client = anthropic.Anthropic()
message_batch = client.beta.messages.batches.create(
betas=["output-300k-2026-03-24"],
requests=[
Request(
custom_id="long-form-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-4-8",
max_tokens=300_000,
messages=[
{
"role": "user",
"content": "Write a comprehensive technical guide to building distributed systems, covering architecture patterns, consistency models, fault tolerance, and operational best practices.",
}
],
),
),
],
)
print(message_batch)Per ottenere il massimo dalla Batches API:
custom_id significativi per abbinare facilmente i risultati alle richieste, poiché l'ordine non è garantito.Se riscontri comportamenti imprevisti:
request_too_large.custom_id univoco.created_at del batch (non dall'ora ended_at dell'elaborazione). Se sono trascorsi 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 del Workspace: i batch sono isolati all'interno del Workspace in cui sono stati creati. Possono essere accessibili solo tramite chiavi API associate a quel Workspace, o da utenti con il permesso di visualizzare i batch del Workspace nella Console.
Disponibilità dei risultati: i risultati del batch sono disponibili per 29 giorni dopo la creazione del batch, consentendo tempo sufficiente per il recupero e l'elaborazione.
L'elaborazione batch archivia i dati di richiesta e risposta per un massimo di 29 giorni dopo la creazione del batch. Puoi eliminare un message batch in qualsiasi momento dopo l'elaborazione utilizzando l'endpoint DELETE /v1/messages/batches/{batch_id}. Per eliminare un batch in corso, annullalo prima. L'elaborazione asincrona richiede l'archiviazione lato server sia degli input che degli output fino al completamento del batch e al recupero dei risultati.
Per l'idoneità ZDR su tutte le funzionalità, consulta API e conservazione dei dati.
Abilita citazioni naturali per applicazioni RAG fornendo risultati di ricerca con attribuzione della fonte.
Riduci costi e latenza memorizzando nella cache i prefissi dei prompt condivisi tra le richieste in un batch.
Was this page helpful?