Processamento em lote é uma abordagem poderosa para lidar com grandes volumes de solicitações de forma eficiente. Em vez de processar solicitações uma de cada vez com respostas imediatas, o processamento em lote permite que você envie múltiplas solicitações juntas para processamento assíncrono. Este padrão é particularmente útil quando:
A API de Lotes de Mensagens é nossa primeira implementação deste padrão.
A API de Lotes de Mensagens é uma forma poderosa e econômica de processar de forma assíncrona grandes volumes de solicitações de Mensagens. Esta abordagem é bem adequada para tarefas que não requerem respostas imediatas, com a maioria dos lotes sendo concluídos em menos de 1 hora, enquanto reduz custos em 50% e aumenta a taxa de transferência.
Você pode explorar a referência da API diretamente, além deste guia.
Quando você envia uma solicitação para a API de Lotes de Mensagens:
Isto é especialmente útil para operações em massa que não requerem resultados imediatos, como:
Todos os modelos ativos suportam a API de Lotes de Mensagens.
Qualquer solicitação que você possa fazer para a API de Mensagens pode ser incluída em um lote. Isto inclui:
Como cada solicitação no lote é processada independentemente, você pode misturar diferentes tipos de solicitações dentro de um único lote.
Como os lotes podem levar mais de 5 minutos para processar, considere usar a duração de cache de 1 hora com cache de prompt para melhores taxas de acerto de cache ao processar lotes com contexto compartilhado.
A API de Lotes oferece economias significativas de custos. Todo o uso é cobrado a 50% dos preços padrão da API.
| 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 () |
Um Lote de Mensagens é composto por uma lista de solicitações para criar uma Mensagem. A forma de uma solicitação individual é composta por:
custom_id único para identificar a solicitação de Mensagensparams com os parâmetros padrão da API de MensagensVocê pode criar um lote passando esta lista para o parâmetro requests:
Neste exemplo, duas solicitações separadas são processadas em lote juntas para processamento assíncrono. Cada solicitação tem um custom_id único e contém os parâmetros padrão que você usaria para uma chamada da API de Mensagens.
Teste suas solicitações de lote com a API de Mensagens
A validação do objeto params para cada solicitação de mensagem é realizada de forma assíncrona, e os erros de validação são retornados quando o processamento de todo o lote termina. Você pode garantir que está construindo sua entrada corretamente verificando a forma de sua solicitação com a API de Mensagens primeiro.
Quando um lote é criado pela primeira vez, a resposta terá um status de processamento de 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
}O campo processing_status do Lote de Mensagens indica o estágio em que o processamento do lote se encontra. Começa como in_progress, depois é atualizado para ended uma vez que todas as solicitações no lote terminaram o processamento e os resultados estão prontos. Você pode monitorar o estado do seu lote visitando o Console, ou usando o endpoint de recuperação.
Para consultar um Lote de Mensagens, você precisará de seu id, que é fornecido na resposta ao criar um lote ou listando lotes. Você pode implementar um loop de consulta que verifica o status do lote periodicamente até que o processamento tenha terminado:
Você pode listar todos os Lotes de Mensagens em seu Workspace usando o endpoint de listagem. A API suporta paginação, buscando automaticamente páginas adicionais conforme necessário:
Uma vez que o processamento do lote termina, cada solicitação de Mensagens no lote terá um resultado. Existem 4 tipos de resultado:
| Tipo de Resultado | Descrição |
|---|---|
succeeded | A solicitação foi bem-sucedida. Inclui o resultado da mensagem. |
errored | A solicitação encontrou um erro e uma mensagem não foi criada. Os erros possíveis incluem solicitações inválidas e erros internos do servidor. Você não será cobrado por essas solicitações. |
canceled | O usuário cancelou o lote antes que essa solicitação pudesse ser enviada ao modelo. Você não será cobrado por essas solicitações. |
expired | O lote atingiu sua expiração de 24 horas antes que essa solicitação pudesse ser enviada ao modelo. Você não será cobrado por essas solicitações. |
Você verá uma visão geral de seus resultados com o request_counts do lote, que mostra quantas solicitações atingiram cada um desses quatro estados.
Os resultados do lote estão disponíveis para download na propriedade results_url no Lote de Mensagens, e se a permissão da organização permitir, no Console. Devido ao tamanho potencialmente grande dos resultados, é recomendado transmitir resultados em vez de baixá-los todos de uma vez.
Os resultados estarão em formato .jsonl, onde cada linha é um objeto JSON válido representando o resultado de uma única solicitação no Lote de Mensagens. Para cada resultado transmitido, você pode fazer algo diferente dependendo de seu custom_id e tipo de resultado. Aqui está um exemplo de conjunto de resultados:
{"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 seu resultado tiver um erro, seu result.error será definido para nossa forma de erro padrão.
Os resultados do lote podem não corresponder à ordem de entrada
Os resultados do lote podem ser retornados em qualquer ordem e podem não corresponder à ordem das solicitações quando o lote foi criado. No exemplo acima, o resultado para a segunda solicitação do lote é retornado antes da primeira. Para corresponder corretamente os resultados com suas solicitações correspondentes, sempre use o campo custom_id.
Você pode cancelar um Lote de Mensagens que está sendo processado usando o endpoint de cancelamento. Imediatamente após o cancelamento, o processing_status de um lote será canceling. Você pode usar a mesma técnica de consulta descrita acima para aguardar até que o cancelamento seja finalizado. Os lotes cancelados terminam com um status de ended e podem conter resultados parciais para solicitações que foram processadas antes do cancelamento.
A resposta mostrará o lote em um estado 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
}A API Message Batches suporta cache de prompt, permitindo que você reduza potencialmente custos e tempo de processamento para solicitações em lote. Os descontos de preço do cache de prompt e Message Batches podem se acumular, fornecendo economias de custo ainda maiores quando ambos os recursos são usados juntos. No entanto, como as solicitações em lote são processadas de forma assíncrona e concorrente, os acertos de cache são fornecidos com base no melhor esforço. Os usuários normalmente experimentam taxas de acerto de cache variando de 30% a 98%, dependendo de seus padrões de tráfego.
Para maximizar a probabilidade de acertos de cache em suas solicitações em lote:
cache_control idênticos em cada solicitação de Message dentro do seu loteExemplo de implementação de cache de prompt em um lote:
Neste exemplo, ambas as solicitações no lote incluem mensagens de sistema idênticas e o texto completo de Pride and Prejudice marcado com cache_control para aumentar a probabilidade de acertos de cache.
Para aproveitar ao máximo a API Batches:
custom_id significativos para corresponder facilmente resultados com solicitações, já que a ordem não é garantida.Se experimentar comportamento inesperado:
request_too_large.custom_id único.created_at do lote (não o tempo ended_at de processamento). Se mais de 29 dias tiverem passado, os resultados não serão mais visualizáveis.Observe que a falha de uma solicitação em um lote não afeta o processamento de outras solicitações.
Isolamento de Workspace: Os lotes são isolados dentro do Workspace em que foram criados. Eles só podem ser acessados por chaves de API associadas a esse Workspace, ou por usuários com permissão para visualizar lotes de Workspace no Console.
Disponibilidade de resultados: Os resultados do lote estão disponíveis por 29 dias após a criação do lote, permitindo tempo amplo para recuperação e processamento.
| $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."}
]
}
}
]
}'