> ## Documentation Index
> Fetch the complete documentation index at: https://novita.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Inferencia por lotes

export const BatchApiModels = () => {
  if (typeof document === "undefined") {
    return null;
  } else {
    let attempts = 0;
    const maxAttempts = 50;
    const INIT_DISPLAY_COUNT = 3;
    const interval = setInterval(() => {
      const clientComponent = document.getElementById("batch-api-models");
      if (clientComponent && window.novitaRemoteData.llmModels.status === 'loaded') {
        const modelList = window.novitaRemoteData.llmModels.data.filter(model => {
          return (model.endpoints || []).includes('batch-api');
        });
        let displayModels = modelList.slice(0, INIT_DISPLAY_COUNT).map(model => {
          return `<li><span class="model-id-item">${model.id}</span></li>`;
        }).join('');
        let showMoreButton = '';
        if (modelList.length > INIT_DISPLAY_COUNT) {
          showMoreButton = `<button id="show-more-batch-api-model-btn" style="margin-left: 32px; color: rgb(40 116 255)">View More</button>`;
        }
        clientComponent.innerHTML = `
          <ul>${displayModels}</ul>
          ${showMoreButton}
        `;
        document.getElementById('show-more-batch-api-model-btn')?.addEventListener('click', () => {
          clientComponent.innerHTML = `
            <ul>${modelList.map(model => {
            return `<li><span class="model-id-item">${model.id}</span></li>`;
          }).join('')}</ul>
          `;
        });
        clearInterval(interval);
      }
      attempts++;
      if (attempts >= maxAttempts) {
        clearInterval(interval);
      }
    }, 200);
    return <div id="batch-api-models"></div>;
  }
};

La Batch API para Large Language Models permite el procesamiento asíncrono de numerosas solicitudes de inferencia y es totalmente compatible con el estándar de la OpenAI API.

La Batch API es una solución rentable cuando no se necesitan resultados de inferencia inmediatos. Proporciona límites de tasa más altos que las llamadas en línea, lo que garantiza que los resultados se entreguen dentro de un plazo razonable de 24 horas.

Esta API es ideal para:

* Realizar evaluaciones y análisis de datos.
* Clasificar conjuntos de datos extensos.
* Generar resúmenes de documentos en modo sin conexión.

Modelos admitidos:

<BatchApiModels />

## Inicio rápido

### 1. Preparar archivos por lotes

La Batch API utiliza archivos en formato .jsonl como entrada, donde cada línea representa los detalles de una solicitud de inferencia de API. Los endpoints disponibles incluyen `/v1/chat/completions` y `/v1/completions`.

<Warning>
  Establece el parámetro `endpoint` en `/v1/chat/completions` o `/v1/completions` para la compatibilidad con la OpenAI API.
</Warning>

Cada solicitud debe incluir un `custom_id` único para localizar los resultados de inferencia en el archivo de salida una vez completado el lote. Los parámetros del campo `body` de cada línea se envían como parámetros reales de la solicitud de inferencia al endpoint.

<Warning>
  Todas las solicitudes dentro de un único archivo JSONL por lotes deben apuntar al mismo modelo. No mezcles solicitudes para diferentes modelos en un solo lote.
</Warning>

A continuación se muestra un archivo de entrada de ejemplo que contiene 2 solicitudes:

```JSON theme={"system"}
{"custom_id": "request-1", "body": {"model": "deepseek/deepseek-v3-0324", "messages": [{"role": "user", "content": "Hello, world!"}], "max_tokens": 400}}
{"custom_id": "request-2", "body": {"model": "deepseek/deepseek-v3-0324", "messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello world!"}],"max_tokens": 1000}}
```

### 2. Subir el archivo de entrada por lotes

Sube el archivo de entrada por lotes para garantizar que pueda referenciarse con precisión al crear un lote. Usa la Files API para subir tu archivo .jsonl y establece el purpose en `batch`. Ten en cuenta que el archivo se conservará durante 15 días.

<Tip>
  Para saber cómo obtener una API key, consulta [Gestión de API Key](/docs/es/api-reference/basic-authentication).
</Tip>

Ejemplo de código

**Python**

```python theme={"system"}
from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/openai/v1",
    api_key="<Your API Key>",
)

batch_input_file = client.files.create(
    file=open("batch_input.jsonl", "rb"),
    purpose="batch",
)

print(batch_input_file)
```

**Curl**

```bash theme={"system"}
export API_KEY="<Your API Key>"

curl --request POST \
  --url https://api.novita.ai/openai/v1/files \
  --header 'Authorization: Bearer ${API_KEY}' \
  --form 'file=@"/your/batch_input.jsonl"' \
  --form 'purpose="batch"'
```

Respuesta de ejemplo tras una subida de archivo correcta:

```
{
    "id": "file_d2co***as73c0cjd0",
    "object": "file",
    "bytes": 238,
    "filename": "batch_input.jsonl",
    "created_at": 1754894162,
    "purpose": "batch",
    "metadata": {
        "total_requests": 2
    }
}
```

### 3. Crear un lote

Una vez que el archivo de entrada se haya subido correctamente, puedes iniciar un lote usando el ID del objeto File subido. La ventana de finalización está fijada en `24h` y actualmente no se puede ajustar.

Ejemplo de código

**Python**

```python theme={"system"}
from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/openai/v1",
    api_key="<Your API Key>",
)

batch = client.batches.create(
  input_file_id="file_d2cor0es1cas73c0cj60",
  endpoint="/v1/chat/completions",
  completion_window="24h"
)
print(batch)
```

**Curl**

```bash theme={"system"}
export API_KEY="<Your API Key>"

curl --request POST \
  --url https://api.novita.ai/openai/v1/batches \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer ${API_KEY}' \
  --data '{
      "input_file_id": "file_d2co***as73c0cjd0",
      "endpoint": "/v1/chat/completions",
      "completion_window": "24h"
  }'
```

Esta solicitud generará un objeto Batch que incluye metadatos sobre tu lote, como se ilustra en el siguiente ejemplo:

```JSON theme={"system"}
{
    "id": "batch_d2cq***73a68lu0",
    "object": "batch",
    "endpoint": "/v1/chat/completions",
    "input_file_id": "file_d2co***as73c0cjd0",
    "output_file_id": "",
    "error_file_id": "",
    "completion_window": "24h",
    "in_progress_at": null,
    "expires_at": null,
    "finalizing_at": null,
    "completed_at": null,
    "failed_at": null,
    "expired_at": null,
    "cancelling_at": null,
    "cancelled_at": null,
    "status": "validating",
    "errors": "",
    "version": 0,
    "created_at": "2025-08-11T16:31:52.949816948+08:00",
    "updated_at": null,
    "created_by": "8f242aa1-f725-4a67-8***9-cb68025e0976",
    "created_by_key_id": "key_cc19f96c***e7390644a37da21",
    "remark": "",
    "total": 0,
    "completed": 0,
    "failed": 0,
    "metadata": null,
    "request_counts": {
        "total": 0,
        "completed": 0,
        "failed": 0
    }
}
```

### 4. Comprobar el estado de un lote

Puedes comprobar el estado de un lote en cualquier momento para recibir la información más reciente del lote.

Los valores de enumeración de estado del objeto Batch son los siguientes:

<table class="table table-big">
  <thead>
    <tr>
      <th>Estado</th>
      <th>Descripción</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>VALIDATING</td>
      <td>El archivo de entrada se está validando antes de que el lote pueda comenzar</td>
    </tr>

    <tr>
      <td>PROGRESS</td>
      <td>El lote está en progreso</td>
    </tr>

    <tr>
      <td>COMPLETED</td>
      <td>El procesamiento por lotes se completó correctamente</td>
    </tr>

    <tr>
      <td>FAILED</td>
      <td>El procesamiento por lotes falló</td>
    </tr>

    <tr>
      <td>EXPIRED</td>
      <td>El lote superó la fecha límite</td>
    </tr>

    <tr>
      <td>CANCELLING</td>
      <td>El lote se está cancelando</td>
    </tr>

    <tr>
      <td>CANCELLED</td>
      <td>El lote fue cancelado</td>
    </tr>
  </tbody>
</table>

Ejemplo de código

**Python**

```python theme={"system"}
from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/openai/v1",
    api_key="<Your API Key>",
)
batch = client.batches.retrieve("batch_d2cq***73a68lu0")
print(batch)
```

**Curl**

```bash theme={"system"}
export API_KEY="<Your API Key>"

curl --request GET \
  --url https://api.novita.ai/openai/v1/batches/{batch_id} \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer ${API_KEY}'
```

### 5. Recuperar los resultados

Una vez completada la inferencia por lotes, puedes descargar el archivo de salida de resultados usando el campo `output_file_id` del objeto Batch.

El archivo de salida de resultados se eliminará 30 días después de que concluya la inferencia por lotes, así que recupéralo cuanto antes mediante la interfaz.

Ejemplo de código

**Python**

```python theme={"system"}
from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/openai/v1",
    api_key="<Your API Key>",
)

content = client.files.content("example-250811-1")
print(content.read())
```

**Curl**

```bash theme={"system"}
export API_KEY="<Your API Key>"

curl --request GET \
  --url https://api.novita.ai/openai/v1/files/{file_id}/content \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer ${API_KEY}'
```

La respuesta devuelve el contenido sin procesar del archivo. Para los archivos de salida por lotes, cada línea contiene una respuesta como esta:

```json theme={"system"}
{
  "custom_id": "request-2589",
  "error": null,
  "id": "batch_req_task_d2c",
  "response": {
    "body": {
      "id": "29e1432c-edfb-44a4-b531-c23c600abfae",
      "object": "chat.completion",
      "created": 1754902266,
      "model": "deepseek-test",
      "choices": [
        {
          "index": 0,
          "message": {
            "role": "assistant",
            "content": "Hello! 👋 How can I assist you today? 😊"
          },
          "finish_reason": "stop"
        }
      ],
      "usage": {
        "prompt_tokens": 5,
        "completion_tokens": 13,
        "total_tokens": 18
      }
    },
    "request_id": "request-2589",
    "status_code": 200
  }
}
```

## Instrucciones

### Limitaciones

1. Cada lote puede contener hasta 50,000 solicitudes.<br />
2. El tamaño máximo del archivo de entrada por lote es de 100MB.

### Manejo de errores

Los errores encontrados durante el procesamiento por lotes se registran en un archivo de errores independiente, accesible mediante el campo error\_file\_id. Los códigos de error comunes incluyen:

<table class="table table-big">
  <thead>
    <tr>
      <th>Código de error</th>
      <th>Descripción</th>
      <th>Solución</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>400</td>
      <td>Formato de solicitud no válido</td>
      <td>Comprueba la sintaxis JSONL y los campos obligatorios</td>
    </tr>

    <tr>
      <td>401</td>
      <td>Error de autenticación</td>
      <td>Verifica la API key</td>
    </tr>

    <tr>
      <td>404</td>
      <td>Lote no encontrado</td>
      <td>Comprueba el batch ID</td>
    </tr>

    <tr>
      <td>429</td>
      <td>Límite de tasa superado</td>
      <td>Reduce la frecuencia de las solicitudes</td>
    </tr>

    <tr>
      <td>500</td>
      <td>Error del servidor</td>
      <td>Contáctanos</td>
    </tr>
  </tbody>
</table>

### Expiración de lotes

Los lotes que no se completen en un plazo de 24 horas pasarán a un estado EXPIRED. Las solicitudes no finalizadas se cancelarán, mientras que las solicitudes completadas se proporcionarán mediante un archivo de salida. Solo pagas por los tokens consumidos por las solicitudes completadas. El lote hará todo lo posible por completarse dentro de 24 horas.

## Toda la Batch API

1. [Crear lote](/docs/es/api-reference/model-apis-llm-create-batch)
2. [Recuperar lote](/docs/es/api-reference/model-apis-llm-retrieve-batch)
3. [Cancelar lote](/docs/es/api-reference/model-apis-llm-cancel-batch)
4. [Listar lotes](/docs/es/api-reference/model-apis-llm-list-batches)
5. [Subir archivo](/docs/es/api-reference/model-apis-llm-upload-batch-input-file)
6. [Listar archivos](/docs/es/api-reference/model-apis-llm-list-files)
7. [Recuperar archivo](/docs/es/api-reference/model-apis-llm-query-file)
8. [Eliminar archivo](/docs/es/api-reference/model-apis-llm-delete-file)
9. [Recuperar contenido de archivo](/docs/es/api-reference/model-apis-llm-retrieve-file-content)
