Skip to main content
La API Batch te permite enviar grupos de solicitudes como un solo trabajo que se procesa de forma asíncrona. Esto es útil cuando necesitas ejecutar muchas solicitudes y no requieres resultados inmediatos — por ejemplo, realizar evaluaciones, generar embeddings para un gran conjunto de datos o clasificar contenido en masa.

Cómo se ejecutan los lotes

Un lote procesa sus líneas una a la vez, así que la latencia de cada solicitud determina su rendimiento: 1,000 líneas que tardan 3 segundos cada una terminan en unos 50 minutos. Los lotes distintos se ejecutan en paralelo, así que divide un trabajo grande en varios lotes para terminarlo antes. Las líneas de un lote no cuentan para los límites de tasa de tu clave de API. Si tu organización usa enrutamiento automático basado en un juez, una línea con model: "auto" sigue contando para los límites de tasa propios del modelo seleccionado, y una línea que los supere falla con rate_limit_exceeded. Las solicitudes por lotes se facturan con las mismas tarifas que las solicitudes síncronas. Planifica cada lote para que termine dentro de su ventana de finalización de 24 horas. Un lote que se excede se detiene y no devuelve resultados, ni siquiera de las líneas que se completaron. Su estado permanece en in_progress, así que dale a tu bucle de polling su propio plazo límite.

Endpoints compatibles

Todas las solicitudes en un solo lote deben dirigirse al mismo endpoint.

Ciclo de vida

Un lote pasa por estos estados:
El campo status del objeto batch también define finalizing y expired, pero los lotes no entran en ninguno de los dos. Un lote pasa de in_progress directamente a completed, y un lote que excede su ventana no se marca como expired.

Paso 1 — Prepara el archivo de entrada

Crea un archivo JSONL donde cada línea sea una solicitud. Cada línea tiene cuatro campos:
Cada body acepta los mismos parámetros que una solicitud síncrona de Responses, con estas reglas:
  • Omite stream y background, o establécelos en false. Una línea que establezca cualquiera de los dos en true falla.
  • Para establecer el esfuerzo de razonamiento, envía ambas claves del objeto reasoning, por ejemplo "reasoning": {"effort": "low", "summary": null}.
Estas líneas establecen store: false porque el archivo de salida ya contiene cada resultado. Omítelo si también quieres recuperar cada respuesta por ID más adelante. Un solo lote puede contener hasta 10,000 solicitudes. El archivo de entrada puede ocupar hasta 25 MB; una carga más grande se rechaza con HTTP 413.

Paso 2 — Sube el archivo de entrada

Sube el archivo JSONL usando la API de Archivos con purpose: "batch".

Paso 3 — Crea el lote

Pasa el ID del archivo subido, el endpoint de destino y la ventana de finalización.
También puedes adjuntar metadatos para tu propio seguimiento:

Paso 4 — Consulta el estado del lote

Consulta el lote hasta que alcance un estado terminal.
Aquí tienes un ayudante para hacer polling y esperar a que el lote termine, hasta un plazo límite:

Paso 5 — Descarga los resultados

Una vez que el lote esté completed, descarga el archivo de salida. Es un archivo JSONL donde cada línea contiene el custom_id que proporcionaste, la respuesta y cualquier error.
Cada línea en el archivo de salida tiene esta estructura:
Si una solicitud falló, response es null y error contiene los detalles:
Si alguna solicitud falló, el lote también proporciona un error_file_id que contiene solo las entradas fallidas.

Cancelar un lote

Cancela un lote que aún está en progreso. Las solicitudes que ya se hayan completado permanecen en la salida.
El lote pasa a cancelling mientras terminan las solicitudes en curso, y luego a cancelled.

Listar lotes

Recupera todos los lotes de la cuenta actual, del más reciente al más antiguo. Soporta paginación.
Usa el parámetro after con un ID de lote para paginar los resultados.

Ejemplo: completaciones de chat por lote

El mismo flujo funciona para completaciones de chat. Cambia el url en cada línea del JSONL y el endpoint al crear el lote.

Ejemplo: embeddings por lote

El mismo flujo funciona para embeddings. Cambia el url en cada línea del JSONL y el endpoint al crear el lote.

Errores de validación

Si el archivo de entrada tiene problemas de formato, el lote pasa a failed inmediatamente. Causas comunes:
  • JSON inválido — una línea no es un JSON válido.
  • Campos faltantes — falta custom_id, method, url o body en una línea.
  • Método incorrecto — method debe ser "POST".
  • URL no coincide — el url de una línea no coincide con el endpoint declarado al crear el lote.
  • custom_id duplicado — cada custom_id debe ser único dentro del archivo.
Consulta batch.errors.data para ver los mensajes de error específicos y los números de línea.

Ver también