Guía del formato JSONL para OpenAI Batch API
Aprende a estructurar archivos JSONL para la Batch API de OpenAI y ahorra un 50% en costos
Última actualización: febrero de 2026
¿Qué es la OpenAI Batch API?
La OpenAI Batch API te permite enviar grandes volúmenes de solicitudes de API como un único trabajo por lotes. En lugar de hacer miles de llamadas individuales a la API, subes un archivo JSONL que contiene todas tus solicitudes y OpenAI las procesa de forma asíncrona en 24 horas.
El beneficio clave es el costo: las solicitudes por lotes son un 50% más baratas que las llamadas a la API en tiempo real. Esto hace que la Batch API sea ideal para tareas que no necesitan respuestas inmediatas, como generación de contenido, clasificación de datos, cálculo de embeddings y pipelines de evaluación.
Formato de solicitud JSONL
Cada línea en el archivo JSONL de entrada del lote representa una solicitud de API. Cada línea debe contener tres campos obligatorios y sigue una estructura específica.
custom_id — Un identificador único para cada solicitud. Se usa para asociar solicitudes con respuestas. Puede ser cualquier cadena de hasta 512 caracteres.method — El método HTTP. Actualmente solo se admite POST.url — La ruta del endpoint de la API. Para chat completions: /v1/chat/completions. Para embeddings: /v1/embeddings.body — El cuerpo de la solicitud. Mismo formato que el cuerpo de solicitud del endpoint de API correspondiente.{"custom_id": "req-001", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "user", "content": "Hello"}]}}
Lote de Chat Completions
El caso de uso más común para la Batch API es enviar múltiples solicitudes de chat completion. Cada línea contiene una solicitud completa con model, messages y parámetros opcionales como max_tokens o temperature.
Solicitud única
Cada línea contiene una solicitud completa de chat completion con model, messages y parámetros opcionales.
{"custom_id": "task-001", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Summarize the benefits of renewable energy."}], "max_tokens": 500}}
Archivo JSONL con múltiples solicitudes
Un archivo de lote típicamente contiene cientos o miles de solicitudes. Aquí hay un archivo con tres tareas diferentes: resumen, clasificación y traducción.
{"custom_id": "summary-001", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "user", "content": "Summarize: Solar energy is a renewable source of power that harnesses sunlight using photovoltaic cells."}], "max_tokens": 200}}{"custom_id": "classify-001", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "user", "content": "Classify this review as positive or negative: Great product, works perfectly!"}], "max_tokens": 50}}{"custom_id": "translate-001", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "user", "content": "Translate to French: Hello, how are you today?"}], "max_tokens": 100}}
Lote de Embeddings
La Batch API también admite solicitudes de embedding, lo cual es útil para procesar grandes colecciones de documentos. Los lotes de embedding usan la misma estructura JSONL pero apuntan al endpoint /v1/embeddings.
Las solicitudes de embedding usan una estructura de cuerpo más simple con model y texto de entrada.
{"custom_id": "embed-001", "method": "POST", "url": "/v1/embeddings", "body": {"model": "text-embedding-3-small", "input": "JSONL is a text format for storing structured data."}}{"custom_id": "embed-002", "method": "POST", "url": "/v1/embeddings", "body": {"model": "text-embedding-3-small", "input": "Each line contains one valid JSON object."}}{"custom_id": "embed-003", "method": "POST", "url": "/v1/embeddings", "body": {"model": "text-embedding-3-small", "input": "JSONL files use the .jsonl extension."}}
Formato de respuesta
Cuando un trabajo por lotes se completa, OpenAI proporciona un archivo JSONL de salida donde cada línea contiene la respuesta para una solicitud. La respuesta incluye el custom_id original para que puedas asociar respuestas con solicitudes.
Respuesta exitosa
Una respuesta exitosa incluye el custom_id, el código de estado de respuesta y el cuerpo completo de la respuesta de la API.
{"id": "batch_req_abc123", "custom_id": "task-001", "response": {"status_code": 200, "body": {"id": "chatcmpl-xyz", "object": "chat.completion", "choices": [{"index": 0, "message": {"role": "assistant", "content": "Renewable energy provides numerous benefits including reduced greenhouse gas emissions, lower long-term costs, and energy independence."}}]}}, "error": null}
Respuesta de error
Las solicitudes fallidas incluyen un objeto de error con un código y un mensaje que explica lo que salió mal.
{"id": "batch_req_def456", "custom_id": "task-002", "response": null, "error": {"code": "invalid_request_error", "message": "The model 'gpt-5' does not exist."}}
Flujo de trabajo completo de la Batch API
Aquí está el flujo de trabajo completo de cinco pasos para usar la Batch API con el SDK de Python, desde la creación del archivo JSONL hasta la descarga y análisis de resultados.
- 1Crea un archivo JSONL con una solicitud por línea
- 2Sube el archivo usando la Files API con purpose establecido en batch
- 3Crea un trabajo por lotes haciendo referencia al ID del archivo subido
- 4Consulta el estado del lote hasta que alcance completed, failed o cancelled
- 5Descarga y parsea el archivo JSONL de salida para extraer resultados
from openai import OpenAIimport jsonimport timeclient = OpenAI()# Step 1: Create the JSONL batch fileprompts = ["Summarize the benefits of renewable energy.","Classify this text as positive or negative: Great product!","Translate to French: Hello, how are you?",]requests = [{"custom_id": f"req-{i}","method": "POST","url": "/v1/chat/completions","body": {"model": "gpt-4o-mini","messages": [{"role": "user", "content": prompt}],"max_tokens": 200,},}for i, prompt in enumerate(prompts)]with open("batch_input.jsonl", "w") as f:for req in requests:f.write(json.dumps(req) + "\n")# Step 2: Upload the filebatch_file = client.files.create(file=open("batch_input.jsonl", "rb"),purpose="batch",)# Step 3: Create the batchbatch = client.batches.create(input_file_id=batch_file.id,endpoint="/v1/chat/completions",completion_window="24h",)print(f"Batch created: {batch.id}")# Step 4: Poll for completionwhile True:status = client.batches.retrieve(batch.id)print(f"Status: {status.status}")if status.status in ("completed", "failed", "cancelled"):breaktime.sleep(60)# Step 5: Download resultsif status.output_file_id:content = client.files.content(status.output_file_id)with open("batch_output.jsonl", "wb") as f:f.write(content.read())
Batch API vs API en tiempo real
Comprender cuándo usar la Batch API frente a la API estándar en tiempo real te ayuda a optimizar tanto el costo como el rendimiento.
Para detalles sobre el formato JSONL para fine-tuning de OpenAI, consulta nuestra Guía del formato JSONL de OpenAI.
Prepara tus archivos de lote
Usa nuestras herramientas gratuitas para crear, validar e inspeccionar tus archivos JSONL de lote antes de enviarlos a OpenAI.