B2BB2B LLM

API por lotes compatible con OpenAI

Cargue archivos de entrada por lotes JSONL y procese lotes compatibles con OpenAI a través de la cola duradera de Model Gate.

API por lotes compatible con OpenAI

Model Gate implementa el flujo de trabajo OpenAI Files + Batch en https://api.model-gate.com/v1. Esta es una capa de compatibilidad: cada elemento JSONL se ejecuta a través de la ruta de inferencia normal de Model Gate. El modelo Gate lo hace no envíe un lote de OpenAI nativo del proveedor ascendente.

Los puntos finales de control/lectura por lotes de archivos son un plano de control: una credencial API activa que de otro modo sería válida puede enumerar/leer/descargar/cancelar/eliminar recursos existentes incluso cuando el saldo de la cuenta es actualmente cero o se ha agotado un límite de gasto reiniciable. Las operaciones de producción de almacenamiento son diferentes: POST /v1/files y POST /v1/batches requerir una nueva admisión de saldo/gasto positivo antes de que Model Gate inserte datos de archivo/trabajo/artículo. Por lo tanto, una clave de saldo cero no puede cargar JSONL ni crear un nuevo almacenamiento por lotes. Los artículos del lote real aún vuelven a verificar la admisión en el momento del reclamo de los trabajadores y permanecen en cola si los fondos se agotan más tarde. La entrada JSONL se lee incrementalmente y se valida/inserta línea por línea; Model Gate no retiene la entrada completa de 200 MB más todos los cuerpos de solicitud en la memoria del proceso mientras crea un lote. Las cuotas de bytes almacenados/archivos/trabajos activos/elementos en cola por usuario proporcionan un límite independiente de abuso de la base de datos.

Los puntos finales por lotes admitidos en esta versión son:

  • /v1/responses
  • /v1/chat/completions
  • /v1/embeddings
  • /v1/images/generations

Cada elemento ejecutado está marcado. request_mode=batch, batch_protocol=openai, con su batch_job_public_id y custom_id.

1. Cargue un archivo de entrada JSONL

Cada línea no vacía contiene custom_id, method, url, y body. La URL debe ser igual al punto final proporcionado posteriormente a /v1/batches.

Ejemplo batch.jsonl:

{"custom_id":"request-1","method":"POST","url":"/v1/responses","body":{"model":"gpt-5.4","input":"Summarize this text."}}
{"custom_id":"request-2","method":"POST","url":"/v1/responses","body":{"model":"gpt-5.4","input":"Classify this text."}}

Pedido

curl https://api.model-gate.com/v1/files \
  -H "Authorization: Bearer mg_live_..." \
  -F "purpose=batch" \
  -F "[email protected]"

Respuesta: 200

{
  "id": "file-01K...",
  "object": "file",
  "bytes": 322,
  "created_at": 1786610000,
  "filename": "batch.jsonl",
  "purpose": "batch",
  "status": "processed",
  "status_details": null
}

2. Crea el lote

completion_window debe ser 24h.

Pedido

curl https://api.model-gate.com/v1/batches \
  -H "Authorization: Bearer mg_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "input_file_id":"file-01K...",
    "endpoint":"/v1/responses",
    "completion_window":"24h",
    "metadata":{"job":"nightly-evaluation"}
  }'

Respuesta: 200

{
  "id": "batch_01K...",
  "object": "batch",
  "endpoint": "/v1/responses",
  "input_file_id": "file-01K...",
  "completion_window": "24h",
  "status": "in_progress",
  "output_file_id": null,
  "error_file_id": null,
  "request_counts": {
    "total": 2,
    "completed": 0,
    "failed": 0
  },
  "metadata": {
    "job": "nightly-evaluation"
  }
}

3. Recuperar un lote

Pedido

curl https://api.model-gate.com/v1/batches/batch_01K... \
  -H "Authorization: Bearer mg_live_..."

Respuesta: completada

{
  "id": "batch_01K...",
  "object": "batch",
  "endpoint": "/v1/responses",
  "status": "completed",
  "output_file_id": "file-01KOUTPUT...",
  "error_file_id": null,
  "request_counts": {
    "total": 2,
    "completed": 2,
    "failed": 0
  },
  "usage": {
    "input_tokens": 240,
    "input_tokens_details": {"cached_tokens": 0},
    "output_tokens": 90,
    "output_tokens_details": {"reasoning_tokens": 0},
    "total_tokens": 330
  }
}

4. Descargar resultados

Pedido

curl https://api.model-gate.com/v1/files/file-01KOUTPUT.../content \
  -H "Authorization: Bearer mg_live_..."

Respuesta: 200

{"id":"batch_req_01K...","custom_id":"request-1","response":{"status_code":200,"request_id":"01K...","body":{"id":"resp_...","status":"completed"}},"error":null}

Los artículos fallidos, cancelados o vencidos se escriben a error_file_id como registros JSONL con response:null y un error objeto.

5. Listar lotes

limit por defecto es 20 y debe ser de 1 a 100. Usar after para paginación del cursor.

Pedido

curl "https://api.model-gate.com/v1/batches?limit=20&after=batch_01K..." \
  -H "Authorization: Bearer mg_live_..."

Respuesta: 200

{
  "object": "list",
  "data": [],
  "first_id": null,
  "last_id": null,
  "has_more": false
}

Los objetos de lote completados pueden incluir un agregado usage objeto cuando se liquida la contabilidad de solicitud de Model Gate está disponible.

6. Cancelar un lote

Cancelar evita que se inicien los elementos en cola; un artículo que ya se está procesando puede finalizar.

Pedido

curl -X POST https://api.model-gate.com/v1/batches/batch_01K.../cancel \
  -H "Authorization: Bearer mg_live_..."

Respuesta: 200

{
  "id": "batch_01K...",
  "object": "batch",
  "status": "cancelling",
  "request_counts": {
    "total": 2,
    "completed": 0,
    "failed": 0
  }
}

7. Metadatos de archivos, listado y eliminación

Recuperar metadatos:

curl https://api.model-gate.com/v1/files/file-01K... \
  -H "Authorization: Bearer mg_live_..."
{
  "id": "file-01K...",
  "object": "file",
  "bytes": 322,
  "filename": "batch.jsonl",
  "purpose": "batch",
  "status": "processed",
  "expires_at": 1789202000
}

Listar archivos con opcional purpose, after, y order=asc|desc; limit por defecto es 10000 y debe ser de 1 a 10000:

curl "https://api.model-gate.com/v1/files?purpose=batch&order=desc&limit=100" \
  -H "Authorization: Bearer mg_live_..."
{
  "object": "list",
  "data": [],
  "first_id": null,
  "last_id": null,
  "has_more": false
}

Eliminar un archivo compatible sin referencia o caducado:

curl -X DELETE https://api.model-gate.com/v1/files/file-01K... \
  -H "Authorization: Bearer mg_live_..."
{
  "id": "file-01K...",
  "object": "file",
  "deleted": true
}

Límites y semántica de recuperación.

Model Gate acepta hasta 50.000 elementos JSONL y limita el archivo cargado al configurado OPENAI_BATCH_MAX_FILE_BYTES valor (200 MiB por defecto). Cada artículo de lote individual también debe ajustarse a los estándares normales de Model Gate. MAX_REQUEST_BODY_BYTES límite. custom_id Los valores deben ser únicos. Los artículos por lotes no se pueden utilizar stream:true o anidado async:true. Los archivos JSONL de gran tamaño se conservan internamente como fragmentos de base de datos en lugar de un valor SQL de gran tamaño.

La recuperación de la ejecución es al menos una vez, no exactamente una vez. Si un trabajador se detiene después de que se aceptó una solicitud ascendente pero antes de que su resultado se registre de forma duradera, un contrato de arrendamiento vencido puede hacer que se vuelva a intentar el mismo ID de solicitud de Model Gate. La liquidación sigue siendo idempotente para las filas de solicitudes ya finalizadas, pero los efectos secundarios externos o de herramienta iniciados por un modelo deberían ser en sí mismos idempotentes.

Cada elemento JSONL se admite inmediatamente antes de que un trabajador lo reclame. Los artículos que de otro modo serían válidos permanecen en cola mientras el saldo de la cuenta actual no sea positivo o el límite de gasto reiniciable de clave/grupo ya esté agotado. Este estado de espera no consume un intento ni crea un registro de error; una recarga posterior, un restablecimiento de uso o un aumento de límite hacen que los artículos restantes sean elegibles automáticamente. Model Gate no reserva un costo de lote máximo teórico. Por lo tanto, los artículos ya admitidos pueden liquidarse en su totalidad incluso cuando el trabajo simultáneo hace que el saldo final sea negativo o produce un pequeño exceso en el límite de gasto, después de lo cual los artículos nuevos permanecen en cola hasta que la cuenta sea elegible nuevamente.

Precios y contabilidad

El adaptador por lotes no utiliza la ejecución por lotes nativa del proveedor. Cada artículo pasa por el enrutamiento y liquidación normal del modelo Model Gate y luego recibe la plantilla de precios. Coeficiente de precio de solicitud de lote. Por defecto: 1.

Si el coeficiente es 0.5, un objeto cuyo coste normal de Model Gate es 0.02 se carga como 0.01. El precio de referencia oficial se mantiene sin cambios. El coeficiente aplicado se toma una instantánea y se almacena en la solicitud de auditoría.

Errores

{
  "error": {
    "message": "line 2 url must match batch endpoint /v1/responses",
    "type": "invalid_request_error",
    "param": null,
    "code": "invalid_batch_file"
  }
}