Procesamiento por lotes
Procesa grandes volúmenes de solicitudes de Messages de forma asíncrona con la Message Batches API, reduciendo los costos en un 50% y aumentando el rendimiento.
El "batch processing" (procesamiento por lotes) es un enfoque poderoso para manejar grandes volúmenes de solicitudes de manera eficiente. En lugar de procesar las solicitudes una a la vez con respuestas inmediatas, el procesamiento por lotes te permite enviar múltiples solicitudes juntas para su procesamiento asíncrono. Este patrón es particularmente útil cuando:
- Necesitas procesar grandes volúmenes de datos
- No se requieren respuestas inmediatas
- Quieres optimizar la eficiencia de costos
- Estás ejecutando evaluaciones o análisis a gran escala
La Message Batches API es la primera implementación de Anthropic de este patrón.
Message Batches API
La Message Batches API es una forma poderosa y rentable de procesar de manera asíncrona grandes volúmenes de solicitudes de Messages. Este enfoque es adecuado para tareas que no requieren respuestas inmediatas; la mayoría de los lotes finalizan en menos de 1 hora, a la vez que reducen los costos en un 50% y aumentan el rendimiento.
Puedes explorar la referencia de la API directamente, además de esta guía.
Cómo funciona la Message Batches API
Cuando envías una solicitud a la Message Batches API:
- El sistema crea un nuevo Message Batch con las solicitudes de Messages proporcionadas.
- Luego, el lote se procesa de forma asíncrona, y cada solicitud se maneja de manera independiente.
- Puedes consultar el estado del lote y recuperar los resultados cuando el procesamiento haya finalizado para todas las solicitudes.
Esto es especialmente útil para operaciones masivas que no requieren resultados inmediatos, como:
- Evaluaciones a gran escala: Procesa miles de casos de prueba de manera eficiente.
- Moderación de contenido: Analiza grandes volúmenes de contenido generado por usuarios de forma asíncrona.
- Análisis de datos: Genera información o resúmenes para grandes conjuntos de datos.
- Generación masiva de contenido: Crea grandes cantidades de texto para diversos propósitos (por ejemplo, descripciones de productos, resúmenes de artículos).
Limitaciones de los lotes
- Un Message Batch está limitado a 100,000 solicitudes de Message o 256 MB de tamaño, lo que se alcance primero.
- El sistema procesa cada lote lo más rápido posible, y la mayoría de los lotes se completan en 1 hora. Puedes acceder a los resultados del lote cuando todos los mensajes se hayan completado o después de 24 horas, lo que ocurra primero. Los lotes expiran si el procesamiento no se completa en 24 horas.
- Los resultados del lote están disponibles durante 29 días después de su creación. Después de eso, aún podrás ver el lote, pero sus resultados ya no estarán disponibles para descargar.
- Los lotes están limitados al ámbito de un Workspace. Puedes ver todos los lotes (y sus resultados) que se crearon dentro del Workspace en el que se ejecuta tu solicitud.
- Los "rate limits" (límites de velocidad) se aplican tanto a las solicitudes HTTP de la Batches API como al número de solicitudes dentro de un lote en espera de ser procesadas. Consulta Límites de velocidad de la Message Batches API. Además, el procesamiento puede ralentizarse según la demanda actual y tu volumen de solicitudes. En ese caso, es posible que veas más solicitudes que expiran después de 24 horas.
- Debido al alto rendimiento y al procesamiento concurrente, los lotes pueden superar ligeramente el límite de gasto configurado de tu Workspace.
- Cada solicitud en un lote debe tener un
max_tokensde al menos1.max_tokens: 0(precalentamiento de la caché) no es compatible dentro de un lote, porque una entrada de caché efímera escrita durante el procesamiento del lote probablemente expiraría antes de que se ejecute la solicitud de seguimiento.
Modelos compatibles
Todos los modelos activos son compatibles con la Message Batches API.
Qué se puede procesar por lotes
Casi cualquier solicitud que puedas hacer a la Messages API se puede incluir en un lote. Esto incluye:
- Visión
- Uso de herramientas, incluidas todas las herramientas de servidor (búsqueda web, obtención web, ejecución de código, conectores MCP, advisor y búsqueda de herramientas)
- Mensajes del sistema
- Conversaciones de múltiples turnos
- Pensamiento extendido
- La mayoría de las funciones beta
Dado que cada solicitud del lote se procesa de forma independiente, puedes mezclar diferentes tipos de solicitudes dentro de un mismo lote.
Un pequeño número de parámetros de la Messages API no son compatibles con las solicitudes por lotes. Incluir cualquiera de ellos devuelve un error de validación:
| Parámetro | Motivo |
|---|---|
stream: true | Los resultados del lote se devuelven como un único archivo, no como un stream. |
speed (Modo rápido) | El modo rápido ajusta la latencia síncrona, lo cual no aplica al procesamiento asíncrono por lotes. |
max_tokens: 0 | Consulta Limitaciones de los lotes. |
Precios
La Batches API ofrece ahorros de costos significativos. Todo el uso se cobra al 50% de los precios estándar de la API.
| Model | Batch tokens | |
|---|---|---|
| Name | Input | Output |
Claude Fable 5.1For demanding reasoning and long-horizon agentic work | $5 / | $25 / MTok |
Claude Opus 5.5For long-running agentic coding and knowledge work | $2 / MTok | $10 / MTok |
Claude Sonnet 5.5The best combination of speed and intelligence | $1 / MTok | $5 / MTok |
Claude Haiku 4.5The fastest model with near-frontier intelligence | $0.50 / MTok | $2.50 / MTok |
$5 / MTok | $25 / MTok | |
$5 / MTok | $25 / MTok | |
$5 / MTok | $25 / MTok | |
$2.50 / MTok | $12.50 / MTok | |
$2.50 / MTok | $12.50 / MTok | |
$2.50 / MTok | $12.50 / MTok | |
$2.50 / MTok | $12.50 / MTok | |
$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 |
$1 / MTok | $5 / MTok | |
$1.50 / MTok | $7.50 / MTok | |
$1.50 / MTok | $7.50 / MTok | |
Claude Sonnet 4 | $1.50 / MTok | $7.50 / MTok |
Claude Haiku 3.5 | $0.40 / MTok | $2 / MTok |
Cómo usar la Message Batches API
Prepara y crea tu lote
Un Message Batch se compone de una lista de solicitudes para crear un Message. La forma de una solicitud individual comprende:
- Un
custom_idúnico para identificar la solicitud de Messages. Debe tener entre 1 y 64 caracteres y contener solo caracteres alfanuméricos, guiones y guiones bajos (que coincida con^[a-zA-Z0-9_-]{1,64}$). - Un objeto
paramscon los parámetros estándar de la Messages API
Puedes crear un lote pasando esta lista en el 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-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Hello, world",
}
],
),
),
Request(
custom_id="my-second-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-5-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Hi again, friend",
}
],
),
),
]
)
print(message_batch)En este ejemplo, dos solicitudes separadas se agrupan en un lote para su procesamiento asíncrono. Cada solicitud tiene un custom_id único y contiene los parámetros estándar que usarías para una llamada a la Messages API.
Cuando se crea un lote por primera vez, la respuesta tiene un estado de procesamiento 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
}Seguimiento de tu lote
El campo processing_status del Message Batch indica la etapa de procesamiento en la que se encuentra el lote. Comienza como in_progress, luego se actualiza a ended una vez que todas las solicitudes del lote han terminado de procesarse y los resultados están listos. Puedes monitorear el estado de tu lote visitando la Console o usando el endpoint de recuperación.
Consultar la finalización de un Message Batch
Para consultar un Message Batch, necesitarás su id, que se proporciona en la respuesta al crear un lote o al listar los lotes. Puedes implementar un bucle de consulta que verifique el estado del lote periódicamente hasta que el procesamiento haya finalizado:
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)Listar todos los Message Batches
Puedes listar todos los Message Batches de tu Workspace usando el endpoint de listado. La API admite paginación y obtiene automáticamente páginas adicionales según sea necesario:
client = anthropic.Anthropic()
# Obtiene automáticamente más páginas según sea necesario.
for message_batch in client.messages.batches.list(limit=20):
print(message_batch)Recuperar los resultados del lote
Una vez que el procesamiento del lote ha finalizado, cada solicitud de Messages del lote tiene un resultado. Hay cuatro tipos de resultados:
| Tipo de resultado | Descripción |
|---|---|
succeeded | La solicitud fue exitosa. Incluye el resultado del mensaje. |
errored | La solicitud encontró un error y no se creó un mensaje. Los posibles errores incluyen solicitudes no válidas y errores internos del servidor. No se te facturarán estas solicitudes. |
canceled | El usuario canceló el lote antes de que esta solicitud pudiera enviarse al modelo. No se te facturarán estas solicitudes. |
expired | El lote alcanzó su expiración de 24 horas antes de que esta solicitud pudiera enviarse al modelo. No se te facturarán estas solicitudes. |
El campo request_counts del lote muestra un resumen de tus resultados, indicando cuántas solicitudes alcanzaron cada uno de estos cuatro estados.
Los resultados del lote están disponibles para descargar en la propiedad results_url del Message Batch y, si el permiso de la organización lo permite, en la Console. Debido al tamaño potencialmente grande de los resultados, se recomienda obtener los resultados mediante streaming en lugar de descargarlos todos a la vez.
client = anthropic.Anthropic()
# Hace streaming del archivo de resultados en fragmentos eficientes en memoria, procesando uno a la vez
for result in client.messages.batches.results(
"msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d",
):
outcome = result.result
match outcome.type:
case "succeeded":
print(f"Success! {result.custom_id}")
case "errored":
if outcome.error.error.type == "invalid_request_error":
# El cuerpo de la solicitud debe corregirse antes de reenviar la solicitud
print(f"Validation error {result.custom_id}")
else:
# La solicitud se puede reintentar directamente
print(f"Server error {result.custom_id}")
case "expired":
print(f"Request expired {result.custom_id}")Los resultados están en formato .jsonl, donde cada línea es un objeto JSON válido que representa el resultado de una única solicitud del Message Batch. Para cada resultado obtenido mediante streaming, puedes hacer algo diferente según su custom_id y tipo de resultado. Aquí hay un conjunto de resultados de ejemplo:
{"custom_id":"my-second-request","result":{"type":"succeeded","message":{"id":"msg_014VwiXbi91y3JMjcpyGBHX5","type":"message","role":"assistant","model":"claude-opus-5-5","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-5-5","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}}}}Si tu resultado tiene un error, su result.error se establecerá con la forma de error estándar.
Cancelar un Message Batch
Puedes cancelar un Message Batch que se está procesando actualmente usando el endpoint de cancelación. Inmediatamente después de la cancelación, el processing_status del lote será canceling. Puedes usar la misma técnica de consulta descrita anteriormente para esperar hasta que la cancelación se finalice. Los lotes cancelados terminan con un estado de ended y pueden contener resultados parciales de las solicitudes que se procesaron antes de la cancelación.
client = anthropic.Anthropic()
MESSAGE_BATCH_ID = "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d"
message_batch = client.messages.batches.cancel(
MESSAGE_BATCH_ID,
)
print(message_batch)La respuesta muestra el lote en 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
}Usar el almacenamiento en caché de prompts con Message Batches
La Message Batches API admite el "prompt caching" (almacenamiento en caché de prompts), lo que te permite reducir potencialmente los costos y el tiempo de procesamiento de las solicitudes por lotes. Los descuentos de precios del almacenamiento en caché de prompts y de Message Batches pueden acumularse, proporcionando ahorros de costos aún mayores cuando ambas funciones se usan juntas. Sin embargo, dado que las solicitudes por lotes se procesan de forma asíncrona y concurrente, los aciertos de caché se proporcionan en la medida de lo posible. Los usuarios suelen experimentar tasas de aciertos de caché que van del 30% al 98%, según sus patrones de tráfico.
Para maximizar la probabilidad de aciertos de caché en tus solicitudes por lotes:
- Incluye bloques
cache_controlidénticos en cada solicitud de Message dentro de tu lote. - Mantén un flujo constante de solicitudes para evitar que las entradas de caché expiren después de su vida útil de 5 minutos.
- Estructura tus solicitudes para compartir la mayor cantidad posible de contenido en caché.
Ejemplo de implementación del almacenamiento en caché de prompts en un 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-5-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.",
}
],
),
),
Request(
custom_id="my-second-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-5-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.",
}
],
),
),
]
)En este ejemplo, ambas solicitudes del lote incluyen mensajes del sistema idénticos y el texto completo de Orgullo y prejuicio marcado con cache_control para aumentar la probabilidad de aciertos de caché.
Herramientas de servidor y el bucle agéntico
Todas las herramientas de servidor (búsqueda web, obtención web, ejecución de código, conectores MCP, advisor y búsqueda de herramientas) funcionan en las solicitudes por lotes. El worker de lotes ejecuta el mismo bucle agéntico del lado del servidor que la Messages API síncrona.
Dado que no hay una conexión abierta que mantener, el bucle de lotes ejecuta más iteraciones por turno que una solicitud síncrona antes de devolver stop_reason: "pause_turn". Si un resultado del lote regresa con pause_turn, el turno no finalizó; puedes continuarlo enviando el contenido del asistente en pausa en una solicitud de seguimiento (por lotes o síncrona) exactamente como se muestra en el patrón de continuación de pause_turn.
Además, el worker de lotes limita web_search por organización para que el procesamiento por lotes altamente concurrente no agote el límite de velocidad de búsqueda web de tu organización. El lote reintenta automáticamente las solicitudes limitadas; no necesitas manejar esto tú mismo, pero los lotes de búsqueda web muy grandes podrían tardar más en completarse.
Salida extendida (beta)
El encabezado beta output-300k-2026-03-24 eleva el límite de max_tokens a 300,000 para las solicitudes por lotes que usan Claude Opus 5.5, Claude Opus 5, Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, Claude Sonnet 5.5, Claude Sonnet 5 o Claude Sonnet 4.6. Incluye el encabezado para generar salidas mucho más largas que el límite estándar de 128k de max_tokens en un solo turno.
Usa la salida extendida para la generación de contenido extenso, como borradores de la longitud de un libro y documentación técnica, extracción exhaustiva de datos estructurados, grandes estructuras de generación de código y largas cadenas de razonamiento.
Una sola generación de 300k tokens puede tardar más de una hora en completarse, así que planifica tus envíos de lotes teniendo en cuenta la ventana de procesamiento de 24 horas. Se aplican los precios estándar de lotes (50% de los precios estándar de la 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-5-5",
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)Mejores prácticas para un procesamiento por lotes efectivo
Para aprovechar al máximo la Batches API:
- Monitorea el estado de procesamiento del lote regularmente e implementa una lógica de reintento adecuada para las solicitudes fallidas.
- Usa valores de
custom_idsignificativos para hacer coincidir fácilmente los resultados con las solicitudes, ya que el orden no está garantizado. - Considera dividir los conjuntos de datos muy grandes en múltiples lotes para una mejor gestión.
- Haz una prueba en seco de una única forma de solicitud con la Messages API para evitar errores de validación.
Solución de problemas comunes
Si experimentas un comportamiento inesperado:
- Verifica que el tamaño total de la solicitud del lote no supere los 256 MB. Si el tamaño de la solicitud es demasiado grande, es posible que recibas un error 413
request_too_large. - Comprueba que estás usando modelos compatibles para todas las solicitudes del lote.
- Asegúrate de que cada solicitud del lote tenga un
custom_idúnico. - Asegúrate de que hayan pasado menos de 29 días desde la hora
created_atdel lote (no la horaended_atdel procesamiento). Si han pasado más de 29 días, los resultados ya no se podrán ver. - Confirma que el lote no haya sido cancelado.
Ten en cuenta que el fallo de una solicitud en un lote no afecta el procesamiento de las demás solicitudes.
Almacenamiento y privacidad de los lotes
-
Aislamiento por Workspace: Los lotes están aislados dentro del Workspace en el que se crean. Solo pueden acceder a ellos las solicitudes de API de ese mismo Workspace o los usuarios con permiso para ver los lotes del Workspace en la Console.
-
Disponibilidad de resultados: Los resultados del lote están disponibles durante 29 días después de la creación del lote, lo que permite un tiempo amplio para su recuperación y procesamiento.
Retención de datos
El procesamiento por lotes almacena los datos de solicitudes y respuestas hasta 29 días después de la creación del lote. Puedes eliminar un lote de mensajes en cualquier momento después del procesamiento usando el endpoint DELETE /v1/messages/batches/{batch_id}. Para eliminar un lote en curso, cancélalo primero. El procesamiento asíncrono requiere el almacenamiento del lado del servidor tanto de las entradas como de las salidas hasta la finalización del lote y la recuperación de los resultados.
Para conocer la elegibilidad de ZDR en todas las funciones, consulta API y retención de datos.
Preguntas frecuentes
Los lotes pueden tardar hasta 24 horas en procesarse, pero muchos terminan antes. El tiempo real de procesamiento depende del tamaño del lote, la demanda actual y tu volumen de solicitudes. Es posible que un lote expire y no se complete en 24 horas.
Consulta Modelos compatibles para ver la lista de modelos compatibles.
Sí, la Message Batches API admite casi todas las funciones disponibles en la Messages API, incluida la mayoría de las funciones beta. Un pequeño número de parámetros (stream, speed y max_tokens: 0) no es compatible. Consulta Qué se puede procesar por lotes para ver la lista completa.
La Message Batches API ofrece un descuento del 50% en todo el uso en comparación con los precios estándar de la API. Esto se aplica a los tokens de entrada, los tokens de salida y cualquier token especial. Para más información sobre precios, visita Precios.
No, una vez que se ha enviado un lote, no se puede modificar. Si necesitas hacer cambios, debes cancelar el lote actual y enviar uno nuevo. Ten en cuenta que la cancelación puede no tener efecto inmediato.
La Message Batches API tiene límites de velocidad basados en solicitudes HTTP, además de límites en el número de solicitudes que necesitan procesamiento. Consulta Límites de velocidad de la Message Batches API. El uso de la Batches API no afecta los límites de velocidad de la Messages API.
Cuando recuperas los resultados, cada solicitud tiene un campo result que indica si fue succeeded, errored, canceled o expired. Para los resultados errored, se proporciona información adicional sobre el error. Consulta el objeto de respuesta de error en la referencia de la API.
La Message Batches API está diseñada con sólidas medidas de privacidad y separación de datos:
- Los lotes y sus resultados están aislados dentro del Workspace en el que se crearon. Esto significa que solo pueden acceder a ellos las solicitudes de API de ese mismo Workspace.
- Cada solicitud dentro de un lote se procesa de forma independiente, sin fuga de datos entre solicitudes.
- Los resultados solo están disponibles por un tiempo limitado (29 días) y siguen la política de retención de datos de Anthropic.
- La descarga de resultados de lotes en la Console se puede deshabilitar a nivel de organización o por Workspace.
Sí, es posible usar el almacenamiento en caché de prompts con la Message Batches API. Sin embargo, dado que las solicitudes por lotes asíncronas pueden procesarse de forma concurrente y en cualquier orden, los aciertos de caché se proporcionan en la medida de lo posible.
Próximos pasos
Habilita citas naturales para aplicaciones RAG proporcionando resultados de búsqueda con atribución de fuentes.
Reduce el costo y la latencia almacenando en caché los prefijos de prompts compartidos entre las solicitudes de un lote.
Was this page helpful?