Processamento em lote é uma abordagem poderosa para lidar com grandes volumes de requisições de forma eficiente. Em vez de processar requisições uma de cada vez com respostas imediatas, o processamento em lote permite que você envie múltiplas requisições juntas para processamento assíncrono. Este padrão é particularmente útil quando:
A API Message Batches é a primeira implementação deste padrão pela Anthropic.
This feature is not eligible for Zero Data Retention (ZDR). Data is retained according to the feature's standard retention policy.
A API Message Batches é uma forma poderosa e econômica de processar de forma assíncrona grandes volumes de requisições de Messages. Esta abordagem é bem adequada para tarefas que não requerem respostas imediatas, com a maioria dos lotes sendo concluída 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 requisição para a API Message Batches:
Isto é especialmente útil para operações em massa que não requerem resultados imediatos, como:
Todos os modelos ativos suportam a API Message Batches.
Qualquer requisição que você possa fazer para a API Messages pode ser incluída em um lote. Isto inclui:
Como cada requisição no lote é processada independentemente, você pode misturar diferentes tipos de requisiçõ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 prompt caching para melhores taxas de acerto de cache ao processar lotes com contexto compartilhado.
A API Batches 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.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 | $7.50 / MTok | $37.50 / MTok |
| Claude Opus 4 | $7.50 / MTok | $37.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 | $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 (deprecated) | $7.50 / MTok | $37.50 / MTok |
| Claude Haiku 3 | $0.125 / MTok | $0.625 / MTok |
Um Message Batch é composto por uma lista de requisições para criar uma Message. A forma de uma requisição individual é composta por:
custom_id único para identificar a requisição de Messages. Deve ter de 1 a 64 caracteres e conter apenas caracteres alfanuméricos, hífens e sublinhados (correspondendo a ^[a-zA-Z0-9_-]{1,64}$).params com os parâmetros padrão da API MessagesVocê pode criar um lote passando esta lista para o parâmetro 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-7",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Hello, world",
}
],
),
),
Request(
custom_id="my-second-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-4-7",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Hi again, friend",
}
],
),
),
]
)
print(message_batch)Neste exemplo, duas requisições separadas são colocadas em lote juntas para processamento assíncrono. Cada requisição tem um custom_id único e contém os parâmetros padrão que você usaria para uma chamada da API Messages.
Teste suas requisições de lote com a API Messages
A validação do objeto params para cada requisiçã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 requisição com a API Messages 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 Message Batch indica o estágio de processamento em que o lote se encontra. Começa como in_progress, depois é atualizado para ended uma vez que todas as requisiçõ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 fazer polling de um Message Batch, você precisará de seu id, que é fornecido na resposta ao criar um lote ou listando lotes. Você pode implementar um loop de polling que verifica o status do lote periodicamente até que o processamento tenha terminado:
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)Você pode listar todos os Message Batches em seu Workspace usando o endpoint de listagem. A API suporta paginação, buscando automaticamente páginas adicionais conforme necessário:
client = anthropic.Anthropic()
# Automatically fetches more pages as needed.
for message_batch in client.messages.batches.list(limit=20):
print(message_batch)Após o processamento em lote ter terminado, cada solicitação de Messages no lote tem 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 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 Message Batch 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.
client = anthropic.Anthropic()
# Stream results file in memory-efficient chunks, processing one at a time
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":
# Request body must be fixed before re-sending request
print(f"Validation error {result.custom_id}")
else:
# Request can be retried directly
print(f"Server error {result.custom_id}")
case "expired":
print(f"Request expired {result.custom_id}")Os resultados estão em formato .jsonl, onde cada linha é um objeto JSON válido representando o resultado de uma única solicitação no Message Batch. 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-opus-4-7","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-7","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 como a 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 Message Batch 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 polling 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.
client = anthropic.Anthropic()
MESSAGE_BATCH_ID = "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d"
message_batch = client.messages.batches.cancel(
MESSAGE_BATCH_ID,
)
print(message_batch)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, proporcionando 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 em base de 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 de seu loteExemplo de implementação de cache de prompt em um lote:
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-7",
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-7",
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.",
}
],
),
),
]
)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.
O cabeçalho beta output-300k-2026-03-24 aumenta o limite de max_tokens para 300.000 para solicitações em lote usando Claude Opus 4.7, Claude Opus 4.6 ou Claude Sonnet 4.6. Inclua o cabeçalho para gerar saídas muito mais longas do que o limite padrão (64k a 128k dependendo do modelo) em uma única volta.
A saída estendida está disponível apenas na API Message Batches, não na API Messages síncrona. É suportada na Claude API e não está disponível no Amazon Bedrock, Vertex AI ou Microsoft Foundry.
Use saída estendida para geração de longa forma, como rascunhos de livros e documentação técnica, extração de dados estruturados exaustiva, grandes scaffolds de geração de código e cadeias de raciocínio longas.
Uma única geração de 300k tokens pode levar mais de uma hora para ser concluída, então planeje seus envios em lote com a janela de processamento de 24 horas em mente. O preço padrão de lote (50% dos preços padrão da API) se aplica.
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-7",
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)Para aproveitar ao máximo a API Batches:
custom_id significativos para corresponder facilmente os resultados com as solicitações, já que a ordem não é garantida.Se estiver experimentando 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 se passaram, 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 espaço de trabalho: 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 do 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.
O processamento em lote armazena dados de solicitação e resposta por até 29 dias após a criação do lote. Você pode excluir um lote de mensagens a qualquer momento após o processamento usando o endpoint DELETE /v1/messages/batches/{batch_id}. Para excluir um lote em andamento, cancele-o primeiro. O processamento assíncrono requer armazenamento no servidor de entradas e saídas até a conclusão do lote e recuperação de resultados.
Para elegibilidade de ZDR em todos os recursos, consulte Retenção de API e dados.
Was this page helpful?