El procesamiento por lotes es un enfoque poderoso para manejar grandes volúmenes de solicitudes de manera eficiente. En lugar de procesar solicitudes una a la vez con respuestas inmediatas, el procesamiento por lotes te permite enviar múltiples solicitudes juntas para procesamiento asincrónico. Este patrón es particularmente útil cuando:
La API de Lotes de Mensajes es nuestra primera implementación de este patrón.
La API de Lotes de Mensajes es una forma poderosa y rentable de procesar de forma asincrónica grandes volúmenes de solicitudes de Mensajes. Este enfoque es muy adecuado para tareas que no requieren respuestas inmediatas, con la mayoría de los lotes finalizándose en menos de 1 hora mientras se reducen los costos en un 50% y se aumenta el rendimiento.
Puedes explorar la referencia de la API directamente, además de esta guía.
Cuando envías una solicitud a la API de Lotes de Mensajes:
Esto es especialmente útil para operaciones en masa que no requieren resultados inmediatos, tales como:
Todos los modelos activos son compatibles con la API de Lotes de Mensajes.
Cualquier solicitud que puedas hacer a la API de Mensajes puede incluirse en un lote. Esto incluye:
Dado que cada solicitud en el lote se procesa independientemente, puedes mezclar diferentes tipos de solicitudes dentro de un único lote.
Dado que los lotes pueden tardar más de 5 minutos en procesarse, considera usar la duración de caché de 1 hora con almacenamiento en caché de indicaciones para mejores tasas de acierto de caché al procesar lotes con contexto compartido.
La API de Lotes ofrece ahorros de costos significativos. Todo el uso se cobra al 50% de los precios estándar de la API.
| Model | Batch input | Batch output |
|---|---|---|
| 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.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 |
Un Lote de Mensajes se compone de una lista de solicitudes para crear un Mensaje. La forma de una solicitud individual se compone de:
custom_id único para identificar la solicitud de Mensajesparams con los parámetros estándar de la API de MensajesPuedes crear un lote pasando esta lista al parámetro requests:
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-opus-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, world"}
]
}
},
{
"custom_id": "my-second-request",
"params": {
"model": "claude-opus-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hi again, friend"}
]
}
}
]
}'En este ejemplo, dos solicitudes separadas se procesan por lotes juntas para procesamiento asincrónico. Cada solicitud tiene un custom_id único y contiene los parámetros estándar que usarías para una llamada a la API de Mensajes.
Prueba tus solicitudes de lote con la API de Mensajes
La validación del objeto params para cada solicitud de mensaje se realiza de forma asincrónica, y los errores de validación se devuelven cuando el procesamiento de todo el lote ha finalizado. Puedes asegurar que estás construyendo tu entrada correctamente verificando tu forma de solicitud con la API de Mensajes primero.
Cuando se crea un lote por primera vez, la respuesta tendrá 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
}El campo processing_status del Lote de Mensajes indica la etapa en la que se encuentra el procesamiento del lote. Comienza como in_progress, luego se actualiza a ended una vez que todas las solicitudes en el lote han terminado de procesarse y los resultados están listos. Puedes monitorear el estado de tu lote visitando la Consola, o usando el punto final de recuperación.
Para sondear un Lote de Mensajes, necesitarás su id, que se proporciona en la respuesta al crear un lote o listando lotes. Puedes implementar un bucle de sondeo que verifique el estado del lote periódicamente hasta que el procesamiento haya finalizado:
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)Puedes listar todos los Lotes de Mensajes en tu Espacio de trabajo usando el punto final de listado. La API admite paginación, obteniendo automáticamente páginas adicionales según sea necesario:
import anthropic
client = anthropic.Anthropic()
# Automatically fetches more pages as needed.
for message_batch in client.messages.batches.list(
limit=20
):
print(message_batch)Una vez que el procesamiento del lote ha finalizado, cada solicitud de Mensajes en el lote tendrá un resultado. Hay 4 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 errores posibles incluyen solicitudes inválidas y errores internos del servidor. No se te cobrará por estas solicitudes. |
canceled | El usuario canceló el lote antes de que esta solicitud pudiera enviarse al modelo. No se te cobrará por estas solicitudes. |
expired | El lote alcanzó su expiración de 24 horas antes de que esta solicitud pudiera enviarse al modelo. No se te cobrará por estas solicitudes. |
Verás una descripción general de tus resultados con el request_counts del lote, que muestra cuántas solicitudes alcanzaron cada uno de estos cuatro estados.
Los resultados del lote están disponibles para descargar en la propiedad results_url en el Lote de Mensajes, y si el permiso de la organización lo permite, en la Consola. Debido al tamaño potencialmente grande de los resultados, se recomienda transmitir resultados en lugar de descargarlos todos a la vez.
#!/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
Los resultados estarán en formato .jsonl, donde cada línea es un objeto JSON válido que representa el resultado de una única solicitud en el Lote de Mensajes. Para cada resultado transmitido, puedes hacer algo diferente dependiendo de su custom_id y tipo de resultado. Aquí hay un conjunto de ejemplo de resultados:
{"custom_id":"my-second-request","result":{"type":"succeeded","message":{"id":"msg_014VwiXbi91y3JMjcpyGBHX5","type":"message","role":"assistant","model":"claude-opus-4-6","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-6","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á en nuestra forma de error estándar.
Los resultados del lote pueden no coincidir con el orden de entrada
Los resultados del lote pueden devolverse en cualquier orden y pueden no coincidir con el orden de las solicitudes cuando se creó el lote. En el ejemplo anterior, el resultado para la segunda solicitud del lote se devuelve antes que la primera. Para hacer coincidir correctamente los resultados con sus solicitudes correspondientes, siempre usa el campo custom_id.
Puedes cancelar un Lote de Mensajes que se está procesando actualmente usando el punto final de cancelación. Inmediatamente después de la cancelación, el processing_status de un lote será canceling. Puedes usar la misma técnica de sondeo 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 para solicitudes que fueron procesadas antes de la cancelación.
import anthropic
client = anthropic.Anthropic()
message_batch = client.messages.batches.cancel(
MESSAGE_BATCH_ID,
)
print(message_batch)La respuesta mostrará el lote en un 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
}La API de Message Batches admite el almacenamiento en caché de indicaciones, lo que le permite reducir potencialmente los costos y el tiempo de procesamiento para solicitudes por lotes. Los descuentos de precios del almacenamiento en caché de indicaciones y Message Batches se pueden acumular, proporcionando ahorros de costos aún mayores cuando se utilizan ambas características juntas. Sin embargo, dado que las solicitudes por lotes se procesan de forma asincrónica y concurrente, los aciertos de caché se proporcionan en base al mejor esfuerzo. Los usuarios generalmente experimentan tasas de acierto de caché que van del 30% al 98%, dependiendo de sus patrones de tráfico.
Para maximizar la probabilidad de aciertos de caché en sus solicitudes por lotes:
cache_control idénticos en cada solicitud de Message dentro de su loteEjemplo de implementación del almacenamiento en caché de indicaciones en un lote:
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-opus-4-6",
"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-opus-4-6",
"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 en el lote incluyen mensajes del sistema idénticos y el texto completo de Pride and Prejudice marcado con cache_control para aumentar la probabilidad de aciertos de caché.
Para aprovechar al máximo la API de Batches:
custom_id significativos para hacer coincidir fácilmente los resultados con las solicitudes, ya que el orden no está garantizado.Si experimenta un comportamiento inesperado:
request_too_large 413.custom_id único.created_at del lote (no el tiempo de ended_at del procesamiento). Si han pasado más de 29 días, los resultados ya no serán visibles.Tenga en cuenta que el fallo de una solicitud en un lote no afecta el procesamiento de otras solicitudes.
Aislamiento del espacio de trabajo: Los lotes se aíslan dentro del espacio de trabajo en el que se crean. Solo pueden ser accedidos por claves API asociadas con ese espacio de trabajo, o usuarios con permiso para ver lotes de espacios de trabajo en la Consola.
Disponibilidad de resultados: Los resultados de los lotes están disponibles durante 29 días después de que se crea el lote, lo que permite tiempo suficiente para la recuperación y el procesamiento.
Was this page helpful?