Loading...
  • Construir
  • Administración
  • Modelos y precios
  • SDKs de cliente
  • Referencia de API
Search...
⌘K
Log in
Procesamiento por lotes
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Solutions

  • AI agents
  • Code modernization
  • Coding
  • Customer support
  • Education
  • Financial services
  • Government
  • Life sciences

Partners

  • Amazon Bedrock
  • Google Cloud's Vertex AI

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Company

  • Anthropic
  • Careers
  • Economic Futures
  • Research
  • News
  • Responsible Scaling Policy
  • Security and compliance
  • Transparency

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Help and security

  • Availability
  • Status
  • Support
  • Discord

Terms and policies

  • Privacy policy
  • Responsible disclosure policy
  • Terms of service: Commercial
  • Terms of service: Consumer
  • Usage policy
Construir/Capacidades del modelo

Procesamiento por lotes

Procesa grandes volúmenes de solicitudes de forma asincrónica y eficiente con la API de lotes de mensajes de Anthropic

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:

  • Necesitas procesar grandes volúmenes de datos
  • Las respuestas inmediatas no son necesarias
  • Deseas optimizar la eficiencia de costos
  • Estás ejecutando evaluaciones o análisis a gran escala

La API de lotes de mensajes es la primera implementación de este patrón por parte de Anthropic.

This feature is not eligible for Zero Data Retention (ZDR). Data is retained according to the feature's standard retention policy.


API de lotes de mensajes

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 ideal 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.

Cómo funciona la API de lotes de mensajes

Cuando envías una solicitud a la API de lotes de mensajes:

  1. El sistema crea un nuevo lote de mensajes con las solicitudes de mensajes proporcionadas.
  2. El lote se procesa entonces de forma asincrónica, con cada solicitud manejada independientemente.
  3. 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 en masa 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 asincrónica.
  • Análisis de datos: Genera información o resúmenes para grandes conjuntos de datos.
  • Generación de contenido en masa: Crea grandes cantidades de texto para diversos propósitos (por ejemplo, descripciones de productos, resúmenes de artículos).

Limitaciones de lotes

  • Un lote de mensajes está limitado a 100,000 solicitudes de mensajes o 256 MB de tamaño, lo que se alcance primero.
  • El sistema procesa cada lote lo más rápido posible, con la mayoría de los lotes completándose 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 de los lotes están disponibles durante 29 días después de la creación. Después de eso, aún puedes ver el lote, pero sus resultados ya no estarán disponibles para descargar.
  • Los lotes están limitados a un Workspace. Puedes ver todos los lotes (y sus resultados) que se crearon dentro del Workspace al que pertenece tu clave de API.
  • Los límites de velocidad se aplican tanto a las solicitudes HTTP de la API de lotes como al número de solicitudes dentro de un lote esperando ser procesadas. Consulta Límites de velocidad de la API de lotes de mensajes. 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 expirando después de 24 horas.
  • Debido al alto rendimiento y procesamiento concurrente, los lotes pueden exceder ligeramente el límite de gasto configurado de tu Workspace.

Modelos compatibles

Todos los modelos activos son compatibles con la API de lotes de mensajes.

Qué se puede procesar por lotes

Cualquier solicitud que puedas hacer a la API de mensajes puede incluirse en un lote. Esto incluye:

  • Visión
  • Uso de herramientas
  • Mensajes del sistema
  • Conversaciones de múltiples turnos
  • Cualquier característica beta

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.


Precios

La API de lotes ofrece ahorros de costos significativos. Todo el uso se cobra al 50% de los precios estándar de la API.

ModelBatch inputBatch 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 (deprecated)$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 (deprecated)$1.50 / MTok$7.50 / MTok

Cómo usar la API de lotes de mensajes

Prepara y crea tu lote

Un lote de mensajes se compone de una lista de solicitudes para crear un mensaje. La forma de una solicitud individual consta de:

  • Un custom_id único para identificar la solicitud de mensajes. Debe tener entre 1 y 64 caracteres y contener solo caracteres alfanuméricos, guiones e guiones bajos (coincidiendo con ^[a-zA-Z0-9_-]{1,64}$).
  • Un objeto params con los parámetros estándar de la API de mensajes

Puedes crear un lote pasando esta lista al parámetro requests:

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 la forma de tu 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.

Output
{
  "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 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 hayan 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.

Sondeo para completar el lote de mensajes

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:

Listado de todos los lotes de mensajes

Puedes listar todos los lotes de mensajes en tu Workspace usando el punto final de lista. La API admite paginación, obteniendo automáticamente páginas adicionales según sea necesario:

Recuperación de resultados de lotes

Una vez que el procesamiento por lotes ha finalizado, cada solicitud de Messages en el lote tiene un resultado. Hay 4 tipos de resultados:

Tipo de resultadoDescripción
succeededLa solicitud fue exitosa. Incluye el resultado del mensaje.
erroredLa solicitud encontró un error y no se creó un mensaje. Los errores posibles incluyen solicitudes inválidas y errores internos del servidor. No se le cobrará por estas solicitudes.
canceledEl usuario canceló el lote antes de que esta solicitud pudiera enviarse al modelo. No se le cobrará por estas solicitudes.
expiredEl lote alcanzó su vencimiento de 24 horas antes de que esta solicitud pudiera enviarse al modelo. No se le cobrará por estas solicitudes.

Verá una descripción general de sus resultados con 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 Message Batch, y si los permisos de la organización lo permiten, en la Console. Debido al tamaño potencialmente grande de los resultados, se recomienda transmitir resultados en lugar de descargarlos todos a la vez.

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 en el Message Batch. Para cada resultado transmitido, puede hacer algo diferente dependiendo de su custom_id y tipo de resultado. Aquí hay un conjunto de resultados de ejemplo:

.jsonl file
{"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}}}}

Si su resultado tiene un error, su result.error se establecerá en la 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 de la segunda solicitud del lote se devuelve antes que la primera. Para hacer coincidir correctamente los resultados con sus solicitudes correspondientes, siempre use el campo custom_id.

Cancelación de un Message Batch

Puede cancelar un Message Batch 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. Puede usar la misma técnica de sondeo descrita anteriormente para esperar hasta que se finalice la cancelación. Los lotes cancelados terminan con un estado de ended y pueden contener resultados parciales para solicitudes que se procesaron antes de la cancelación.

La respuesta mostrará el lote en estado canceling:

Output
{
  "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
}

Uso del almacenamiento en caché de indicaciones con Message Batches

La API de Message Batches admite el almacenamiento en caché de indicaciones, lo que te 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 sobre la base del mejor esfuerzo. Los usuarios típicamente 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 tus solicitudes por lotes:

  1. Incluye bloques cache_control idénticos en cada solicitud de Message dentro de tu lote
  2. Mantén un flujo constante de solicitudes para evitar que las entradas de caché expiren después de su vida útil de 5 minutos
  3. Estructura tus solicitudes para compartir la mayor cantidad de contenido almacenado en caché posible

Ejemplo de implementación del almacenamiento en caché de indicaciones en un lote:

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é.

Salida extendida (beta)

El encabezado beta output-300k-2026-03-24 eleva el límite de max_tokens a 300,000 para solicitudes por lotes usando Claude Opus 4.7, Claude Opus 4.6 o Claude Sonnet 4.6. Incluye el encabezado para generar salidas mucho más largas que el límite estándar (64k a 128k dependiendo del modelo) en un solo turno.

La salida extendida está disponible solo en la API de Message Batches, no en la API de Messages sincrónica. Es compatible con la API de Claude y no está disponible en Amazon Bedrock, Vertex AI o Microsoft Foundry.

Utiliza la salida extendida para generación de formato largo como borradores de libros completos y documentación técnica, extracción exhaustiva de datos estructurados, andamios de generación de código grandes y cadenas de razonamiento largas.

Una 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 aplica la fijación de precios estándar de lotes (50% de los precios estándar de la API).

Mejores prácticas para procesamiento por lotes efectivo

Para aprovechar al máximo la API de Batches:

  • Monitorea regularmente el estado del procesamiento por lotes e implementa la lógica de reintentos apropiada para solicitudes fallidas.
  • Utiliza valores custom_id significativos para hacer coincidir fácilmente los resultados con las solicitudes, ya que el orden no está garantizado.
  • Considera dividir conjuntos de datos muy grandes en múltiples lotes para una mejor manejabilidad.
  • Realiza una ejecución de prueba de una sola forma de solicitud con la API de Messages 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 por lotes no exceda 256 MB. Si el tamaño de la solicitud es demasiado grande, puedes obtener un error request_too_large 413.
  • Comprueba que estés utilizando modelos compatibles para todas las solicitudes en el lote.
  • Asegúrate de que cada solicitud en el lote tenga un custom_id único.
  • Asegúrate de que hayan pasado menos de 29 días desde el tiempo de 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.
  • Confirma que el lote no ha sido cancelado.

Ten en cuenta que el fallo de una solicitud en un lote no afecta el procesamiento de otras solicitudes.


Almacenamiento de lotes y privacidad

  • 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 del espacio 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.


Retención de datos

El procesamiento por lotes almacena datos de solicitud y respuesta 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 utilizando el punto final DELETE /v1/messages/batches/{batch_id}. Para eliminar un lote en progreso, cancélalo primero. El procesamiento asincrónico requiere almacenamiento del lado del servidor de entradas y salidas hasta la finalización del lote y la recuperación de resultados.

Para elegibilidad de ZDR en todas las características, consulta Retención de API y datos.

Preguntas frecuentes

Was this page helpful?

  • Cómo funciona la API de lotes de mensajes
  • Limitaciones de lotes
  • Modelos compatibles
  • Qué se puede procesar por lotes
  • Precios
  • Cómo usar la API de lotes de mensajes
  • Prepara y crea tu lote
  • Seguimiento de tu lote
  • Listado de todos los lotes de mensajes
  • Recuperación de resultados de lotes
  • Cancelación de un Message Batch
  • Uso del almacenamiento en caché de indicaciones con Message Batches
  • Salida extendida (beta)
  • Mejores prácticas para procesamiento por lotes efectivo
  • Solución de problemas comunes
  • Almacenamiento de lotes y privacidad
  • Retención de datos
  • Preguntas frecuentes
Claude Haiku 4.5
$0.50 / MTok
$2.50 / MTok
Claude Haiku 3.5 (retired, except on Bedrock and Vertex AI)$0.40 / MTok$2 / MTok
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)
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)
client = anthropic.Anthropic()

# Automatically fetches more pages as needed.
for message_batch in client.messages.batches.list(limit=20):
    print(message_batch)
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}")
client = anthropic.Anthropic()

MESSAGE_BATCH_ID = "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d"

message_batch = client.messages.batches.cancel(
    MESSAGE_BATCH_ID,
)
print(message_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-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.",
                    }
                ],
            ),
        ),
    ]
)
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)