For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegación principal
Theme

API Batch

Procesa trabajos de forma asíncrona con la API Batch.

Aprende a usar la API Batch de OpenAI para enviar grupos de solicitudes de forma asíncrona, con costos un 50 % más bajos, límites de solicitudes independientes y considerablemente más altos, y un plazo máximo de 24 horas para obtener los resultados. El servicio es ideal para procesar trabajos que no requieren respuestas inmediatas. También puedes consultar directamente la referencia de la API.

Descripción general

Algunos usos de la plataforma de OpenAI requieren que envíes solicitudes síncronas. Sin embargo, en muchos casos no necesitas una respuesta inmediata o los límites de solicitudes te impiden ejecutar muchas consultas en poco tiempo. El procesamiento por lotes suele ser útil para tareas como las siguientes:

  1. Ejecutar evaluaciones
  2. Clasificar grandes conjuntos de datos
  3. Generar embeddings para el contenido de repositorios

La API Batch ofrece puntos de acceso fáciles de usar que te permiten reunir varias solicitudes en un solo archivo, iniciar un trabajo por lotes para ejecutarlas, consultar el estado del lote mientras se ejecutan las solicitudes y recuperar los resultados una vez que se completa el lote.

En comparación con el uso directo de los puntos de acceso estándar, la API Batch ofrece las siguientes ventajas:

  1. Menor costo: un descuento del 50 % respecto a las API síncronas
  2. Límites de solicitudes más altos: un margen considerablemente mayor que el de las API síncronas
  3. Plazos cortos: cada lote se completa en un máximo de 24 horas y, a menudo, en menos tiempo

Primeros pasos

1. Prepara el archivo del lote

Cada lote comienza con un archivo .jsonl en el que cada línea contiene los detalles de una solicitud individual a la API. Por ahora, los puntos de acceso disponibles son los siguientes:

En cada línea del archivo de entrada, los parámetros del campo body son los mismos que los del punto de acceso correspondiente. Cada solicitud debe incluir un valor único de custom_id, que puedes usar para identificar su resultado una vez que se complete el lote. A continuación se muestra un archivo de entrada con dos solicitudes. Cada archivo de entrada solo puede incluir solicitudes dirigidas a un mismo modelo.

Si usas /v1/moderations, incluye el campo input en el cuerpo de cada solicitud. Con omni-moderation-latest, Batch acepta entradas de texto sin formato y arreglos de contenido con entradas de texto o imágenes. El proceso que ejecuta el lote rechaza las solicitudes que especifican stream=true, al igual que el punto de acceso de moderación síncrona.

{"custom_id": "request-1", "method": "POST", "url": "/v1/responses", "body": {"model": "gpt-6-luna", "input": "Reply with the word blue.", "reasoning": {"effort": "none"}, "max_output_tokens": 64}}
{"custom_id": "request-2", "method": "POST", "url": "/v1/responses", "body": {"model": "gpt-6-luna", "input": "Reply with the word green.", "reasoning": {"effort": "none"}, "max_output_tokens": 64}}

Ejemplos de entradas para moderación

Solicitud con solo texto:

{
  "custom_id": "moderation-text-1",
  "method": "POST",
  "url": "/v1/moderations",
  "body": {
    "model": "omni-moderation-latest",
    "input": "This is a harmless test sentence."
  }
}

Solicitud con texto y una imagen:

{
  "custom_id": "moderation-mm-1",
  "method": "POST",
  "url": "/v1/moderations",
  "body": {
    "model": "omni-moderation-latest",
    "input": [
      {
        "type": "text",
        "text": "Describe this image"
      },
      {
        "type": "image_url",
        "image_url": {
          "url": "https://api.nga.gov/iiif/a2e6da57-3cd1-4235-b20e-95dcaefed6c8/full/!800,800/0/default.jpg"
        }
      }
    ]
  }
}

Es preferible hacer referencia a los recursos remotos con image_url en lugar de incluir bloques de datos en base64. Así, el tamaño de tus archivos .jsonl se mantiene muy por debajo del límite de carga de 200 MB de Batch, especialmente en las solicitudes de moderación multimodal.

2. Sube el archivo de entrada del lote

Al igual que con nuestra API de ajuste fino, primero debes subir el archivo de entrada para poder hacer referencia a él al iniciar los lotes. Sube el archivo .jsonl con la API de archivos.

Subir archivos para la API Batch
import fs from "fs";
import OpenAI from "openai";
const openai = new OpenAI();

const file = await openai.files.create({
  file: fs.createReadStream("fixtures/batchinput.jsonl"),
  purpose: "batch",
});

console.log(file);

3. Crea el lote

Una vez que hayas subido el archivo de entrada, puedes crear un lote con el ID del objeto File correspondiente. Para este ejemplo, supongamos que el ID del archivo es file-abc123. Por ahora, el único plazo de ejecución que puedes configurar es 24h. También puedes incluir metadatos personalizados con el parámetro opcional metadata.

Crear el lote
import OpenAI from "openai";
const openai = new OpenAI();

const batch = await openai.batches.create({
  input_file_id: "file-abc123",
  endpoint: "/v1/responses",
  completion_window: "24h",
});

console.log(batch);

La solicitud devuelve un objeto Batch con los metadatos del lote:

{
  "id": "batch_abc123",
  "object": "batch",
  "endpoint": "/v1/responses",
  "errors": null,
  "input_file_id": "file-abc123",
  "completion_window": "24h",
  "status": "validating",
  "output_file_id": null,
  "error_file_id": null,
  "created_at": 1714508499,
  "in_progress_at": null,
  "expires_at": 1714536634,
  "completed_at": null,
  "failed_at": null,
  "expired_at": null,
  "request_counts": {
    "total": 0,
    "completed": 0,
    "failed": 0
  },
  "metadata": null
}

4. Consulta el estado de un lote

Puedes consultar el estado de un lote en cualquier momento. Esta consulta también devuelve un objeto Batch.

Consultar el estado de un lote
import OpenAI from "openai";
const openai = new OpenAI();

const batch = await openai.batches.retrieve("batch_abc123");
console.log(batch);

Un objeto Batch puede tener cualquiera de los siguientes estados:

Estado Descripción
validating Se está validando el archivo de entrada antes de iniciar el lote.
failed El archivo de entrada no pasó la validación.
in_progress El archivo de entrada pasó la validación y el lote está en ejecución.
finalizing El lote se completó y se están preparando los resultados.
completed El lote se completó y los resultados están listos.
expired El lote no se pudo completar en el plazo de 24 horas.
cancelling La cancelación del lote está en curso y puede tardar hasta 10 minutos.
cancelled El lote se canceló.

5. Recupera los resultados

Una vez que se complete el lote, puedes descargar los resultados. Envía una solicitud a la API de archivos con el valor del campo output_file_id del objeto Batch y guarda el contenido en un archivo en tu computadora. En este ejemplo, el archivo se llama batch_output.jsonl.

Recuperar los resultados del lote
import OpenAI from "openai";
const openai = new OpenAI();

const fileResponse = await openai.files.content("file-xyz123");
const fileContents = await fileResponse.text();

console.log(fileContents);

El archivo .jsonl de salida contiene una línea de respuesta por cada línea del archivo de entrada cuya solicitud se procesó correctamente. Si alguna solicitud del lote falla, la información del error se guarda en un archivo de errores que puedes localizar con el campo error_file_id del lote.

El orden de las líneas de salida puede diferir del orden de las líneas de entrada. Para procesar los resultados, usa el campo custom_id que aparece en cada línea del archivo de salida. Así podrás asociar cada solicitud del archivo de entrada con su resultado sin depender del orden.

El siguiente ejemplo de salida está abreviado para mostrar cómo se relaciona cada resultado con su solicitud mediante el ID y qué texto se generó. Para leer el texto de cada mensaje, busca el contenido de tipo output_text en response.body.output.

{"id": "batch_req_2", "custom_id": "request-2", "response": {"status_code": 200, "request_id": "req_2", "body": {"id": "resp_2", "object": "response", "status": "completed", "output": [{"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "green"}]}]}}, "error": null}
{"id": "batch_req_1", "custom_id": "request-1", "response": {"status_code": 200, "request_id": "req_1", "body": {"id": "resp_1", "object": "response", "status": "completed", "output": [{"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "blue"}]}]}}, "error": null}

El archivo de salida se elimina automáticamente 30 días después de que se completa el lote.

6. Cancela un lote

Si es necesario, puedes cancelar un lote en curso. El estado del lote cambia a cancelling hasta que se completen las solicitudes en curso, lo que puede tardar hasta 10 minutos. Después, el estado cambia a cancelled.

Cancelar un lote
import OpenAI from "openai";
const openai = new OpenAI();

const batch = await openai.batches.cancel("batch_abc123");
console.log(batch);

7. Obtén la lista de todos los lotes

Puedes consultar todos tus lotes en cualquier momento. Si tienes muchos, usa los parámetros limit y after para paginar los resultados.

Obtener la lista de todos los lotes
import OpenAI from "openai";
const openai = new OpenAI();

const list = await openai.batches.list();

for await (const batch of list) {
  console.log(batch);
}

Disponibilidad de los modelos

La mayoría de los modelos son compatibles con la API Batch. Busca tu modelo en la referencia de modelos. GPT-6 Sol y Luna admiten la residencia de datos en la UE con las modalidades de procesamiento Standard, Flex y Batch. Consulta qué modelos y funciones admiten la residencia de datos.

GPT Image 2.5 admite la generación y edición de imágenes por lotes con gpt-image-2.5-flare y gpt-image-2.5-sunburst, incluidas sus versiones del 2026-09-08. Usa /v1/images/generations o /v1/images/edits y consulta los precios de generación de imágenes para conocer las tarifas de Batch.

Límites de solicitudes

Los límites de solicitudes de la API Batch son independientes de los límites existentes para cada modelo. La API Batch tiene tres tipos de límites de solicitudes:

  1. Límites por lote: un lote puede incluir hasta 50 000 solicitudes y su archivo de entrada puede ocupar hasta 200 MB. Además, en los lotes de /v1/embeddings, el total de entradas para generar embeddings entre todas las solicitudes del lote no puede superar las 50 000.
  2. Tokens de prompt en cola por modelo: cada modelo admite un número máximo de tokens de prompt en la cola de procesamiento por lotes. Puedes consultar estos límites en la página de configuración de la plataforma.
  3. Límite de creación de lotes: puedes crear hasta 2000 lotes por hora. Si necesitas enviar más solicitudes, aumenta el número de solicitudes por lote.

Actualmente, la API Batch no tiene un límite de tokens de salida. Como la API Batch tiene límites de solicitudes nuevos e independientes, los tokens que consumas al usar la API Batch no cuentan para los límites de solicitudes estándar de cada modelo. Así puedes enviar más solicitudes y procesar más tokens al consultar nuestra API.

Vencimiento de los lotes

Los lotes que no se completan a tiempo pasan al estado expired. Las solicitudes pendientes del lote se cancelan y las respuestas a las solicitudes completadas quedan disponibles en el archivo de salida del lote. Se te cobrarán los tokens consumidos por las solicitudes completadas.

Las solicitudes vencidas se registran en el archivo de errores con el mensaje que se muestra a continuación. Puedes usar el campo custom_id para recuperar los datos de cada solicitud vencida.

{"id": "batch_req_123", "custom_id": "request-3", "response": null, "error": {"code": "batch_expired", "message": "This request could not be executed before the completion window expired."}}
{"id": "batch_req_123", "custom_id": "request-7", "response": null, "error": {"code": "batch_expired", "message": "This request could not be executed before the completion window expired."}}