El procesamiento por lotes es un enfoque potente para manejar grandes volúmenes de solicitudes de manera eficiente. En lugar de procesar las solicitudes una a una con respuestas inmediatas, el procesamiento por lotes te permite enviar múltiples solicitudes juntas para un 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 API de Lotes de Mensajes es nuestra primera implementación de este patrón.


API de Lotes de Mensajes

La API de Lotes de Mensajes es una forma potente y rentable de procesar asincrónicamente grandes volúmenes de solicitudes de Mensajes. Este enfoque es adecuado para tareas que no requieren respuestas inmediatas, con la mayoría de los lotes finalizando 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 de forma asíncrona, 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 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 Lote de Mensajes está limitado a 100,000 solicitudes de Mensajes o 256 MB de tamaño, lo que se alcance primero.
  • Procesamos cada lote lo más rápido posible, con la mayoría de los lotes completándose dentro de 1 hora. Podrás 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 caducarán si el procesamiento no se completa dentro de las 24 horas.
  • Los resultados de los lotes 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 a un Espacio de trabajo. Puedes ver todos los lotes —y sus resultados— que fueron creados dentro del Espacio de trabajo al que pertenece tu clave API.
  • Los límites de tasa se aplican tanto a las solicitudes HTTP de la API de Lotes como al número de solicitudes dentro de un lote en espera de ser procesadas. Consulta Límites de tasa de la API de Lotes de Mensajes. Además, podemos ralentizar el procesamiento según la demanda actual y el volumen de tus solicitudes. En ese caso, es posible que veas más solicitudes caducando después de 24 horas.
  • Debido al alto rendimiento y procesamiento concurrente, los lotes pueden superar ligeramente el límite de gasto configurado para tu Espacio de trabajo.

Modelos compatibles

La API de Lotes de Mensajes actualmente es compatible con:

  • Claude Opus 4 (claude-opus-4-20250514)
  • Claude Sonnet 4 (claude-sonnet-4-20250514)
  • Claude Sonnet 3.7 (claude-3-7-sonnet-20250219)
  • Claude Sonnet 3.5 (claude-3-5-sonnet-20240620 y claude-3-5-sonnet-20241022)
  • Claude Haiku 3.5 (claude-3-5-haiku-20241022)
  • Claude Haiku 3 (claude-3-haiku-20240307)
  • Claude Opus 3 (claude-3-opus-20240229)

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 de forma independiente, puedes mezclar diferentes tipos de solicitudes dentro de un solo lote.


Precios

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

ModelBatch inputBatch output
Claude Opus 4$7.50 / MTok$37.50 / MTok
Claude Sonnet 4$1.50 / MTok$7.50 / MTok
Claude Sonnet 3.7$1.50 / MTok$7.50 / MTok
Claude Sonnet 3.5$1.50 / MTok$7.50 / MTok
Claude Haiku 3.5$0.40 / MTok$2 / MTok
Claude Opus 3$7.50 / MTok$37.50 / MTok
Claude Haiku 3$0.125 / MTok$0.625 / MTok

Cómo usar la API de Lotes de Mensajes

Preparar y crear tu lote

Un Lote de Mensajes se compone de una lista de solicitudes para crear un Mensaje. La forma de una solicitud individual comprende:

  • Un custom_id único para identificar la solicitud de Mensajes
  • 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:

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-20250514",
                "max_tokens": 1024,
                "messages": [
                    {"role": "user", "content": "Hello, world"}
                ]
            }
        },
        {
            "custom_id": "my-second-request",
            "params": {
                "model": "claude-opus-4-20250514",
                "max_tokens": 1024,
                "messages": [
                    {"role": "user", "content": "Hi again, friend"}
                ]
            }
        }
    ]
}'

En este ejemplo, dos solicitudes separadas se agrupan para 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 API de Mensajes.

Prueba tus solicitudes por lotes con la API de Mensajes

La validación del objeto params para cada solicitud de mensaje se realiza de forma asíncrona, y los errores de validación se devuelven cuando finaliza el procesamiento de todo el lote. Puedes asegurarte de que estás construyendo tu entrada correctamente verificando primero la forma de tu solicitud con la API de Mensajes.

Cuando se crea un lote por primera vez, la respuesta tendrá un estado de procesamiento de in_progress.

JSON
{
  "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 de procesamiento en la que se encuentra el 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 de conexión de recuperación:

curl https://api.anthropic.com/v1/messages/batches/msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d \
 --header "x-api-key: $ANTHROPIC_API_KEY" \
 --header "anthropic-version: 2023-06-01" \
 | sed -E 's/.*"id":"([^"]+)".*"processing_status":"([^"]+)".*/Batch \1 processing status is \2/'

Puedes consultar este punto de conexión para saber cuándo ha finalizado el procesamiento.

Recuperación de resultados del lote

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 resultadoDescripción
succeededLa solicitud fue exitosa. Incluye el resultado del mensaje.
erroredLa solicitud encontró un error y no se creó un mensaje. Los posibles errores incluyen solicitudes inválidas y errores internos del servidor. No se te cobrará por estas solicitudes.
canceledEl usuario canceló el lote antes de que esta solicitud pudiera ser enviada al modelo. No se te cobrará por estas solicitudes.
expiredEl lote alcanzó su expiración de 24 horas antes de que esta solicitud pudiera ser enviada al modelo. No se te cobrará por estas solicitudes.

Verás un resumen de tus resultados con los 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 del 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 los 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 sola 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 ejemplo de conjunto de resultados:

.jsonl file
{"custom_id":"my-second-request","result":{"type":"succeeded","message":{"id":"msg_014VwiXbi91y3JMjcpyGBHX5","type":"message","role":"assistant","model":"claude-opus-4-20250514","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-20250514","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 de la segunda solicitud del lote se devuelve antes que el primero. Para hacer coincidir correctamente los resultados con sus solicitudes correspondientes, utiliza siempre el campo custom_id.

Uso del almacenamiento en caché de prompts con Lotes de Mensajes

La API de Lotes de Mensajes admite el almacenamiento en caché de prompts, lo que te permite reducir potencialmente los costos y el tiempo de procesamiento para las solicitudes por lotes. Los descuentos de precios del almacenamiento en caché de prompts y los Lotes de Mensajes pueden acumularse, proporcionando aún mayores ahorros de costos cuando ambas características se utilizan juntas. Sin embargo, dado que las solicitudes por lotes se procesan de forma asíncrona y concurrente, los aciertos de caché se proporcionan con el mejor esfuerzo posible. Los usuarios suelen experimentar tasas de aciertos 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 Mensaje 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 tanto contenido en caché como sea posible

Ejemplo de implementación de almacenamiento en caché de prompts 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-20250514",
                "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-20250514",
                "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 de sistema idénticos y el texto completo de Orgullo y Prejuicio marcado con cache_control para aumentar la probabilidad de aciertos de caché.

Mejores prácticas para un procesamiento por lotes efectivo

Para aprovechar al máximo la API de Lotes:

  • Monitorea regularmente el estado de procesamiento del lote e implementa una lógica de reintento apropiada para las 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 gestión.
  • Realiza una prueba de ejecución de una sola forma de solicitud con la API de Mensajes 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 los 256 MB. Si el tamaño de la solicitud es demasiado grande, puedes recibir un error 413 request_too_large.
  • 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 han pasado menos de 29 días desde el tiempo created_at del lote (no el tiempo 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 al procesamiento de otras solicitudes.


Almacenamiento y privacidad de lotes

  • Aislamiento del Espacio de trabajo: Los lotes están aislados 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.


Preguntas frecuentes