API Abierta

Gemini Batch Image API

API de imágenes por lotes asíncrono de LMU AI: envía muchas tareas de imágenes Gemini a la vez, consulta el estado y los detalles, descarga imágenes o un ZIP, con idempotencia y estimaciones de costo.

La API de imágenes por lotes Gemini de LMU AI te permite enviar múltiples tareas de imágenes Gemini a la vez. El servidor crea de forma asíncrona la tarea por lotes, rastrea su estado, organiza los resultados y liquida el costo.

Endpoint principal:

POST https://api.lmuai.com/v1/images/batches

Esta es una API de extensión de LMU AI

La API por lotes reside en /v1/images/batches. Es una API de tareas asíncronas que LMU AI expone a los usuarios — no la ruta nativa /v1beta de Google Gemini.

La implementación actual solo admite Gemini. Aunque el cuerpo de la solicitud incluye un campo genérico model, no puedes enviar gpt-image-2 ni modelos de imágenes Grok en este endpoint. Para texto a imagen con GPT, usa la API de GPT Image; para texto a imagen con Grok, usa la API de Grok Image.

Si solo necesitas generar una única imagen Gemini, o necesitas 2K / 4K, usa la API de Gemini Image en tiempo real.


1. Cuándo usarla

La API por lotes es una buena opción cuando:

  • envías de decenas a cientos de prompts diferentes a la vez;
  • no necesitas que las tareas de imágenes se devuelvan de inmediato dentro de la misma solicitud HTTP;
  • necesitas estado de la tarea, detalles de fallos, cancelación y descarga por lotes;
  • produces ilustraciones para artículos, recursos de comercio electrónico, conjuntos de datos o candidatos de diseño sin conexión;
  • quieres usar Idempotency-Key para evitar envíos duplicados y cobros dobles.

No es una buena opción cuando:

  • mides la latencia de una única generación de imagen en tiempo real;
  • necesitas 2K / 4K;
  • necesitas esperar sincrónicamente una imagen y mostrarla de inmediato;
  • ejecutas pruebas de estrés de concurrencia o RPM.

2. Requisitos previos

La función por lotes requiere que el administrador la habilite tanto en el despliegue como en el grupo, y que configure cuentas upstream compatibles y precios.

Puedes solicitar primero la lista de modelos para comprobar si la función está disponible:

GET /v1/images/batches/models

Si devuelve BATCH_IMAGE_DISABLED

BATCH_IMAGE_DISABLED significa que la función global de imágenes por lotes del relay de API no ha sido habilitada. No es un error de la clave de API, del modelo ni del prompt.

Proporciona el código de error completo y el ID de solicitud de los encabezados de respuesta al administrador, por ejemplo:

Error code: BATCH_IMAGE_DISABLED
Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Condiciones comunes de admisión:

  • el estado actual de la clave de API es activo;
  • la plataforma del grupo de la clave de API es Gemini;
  • el grupo permite la generación de imágenes por lotes;
  • hay recursos de ejecución de imágenes por lotes disponibles;
  • el modelo tiene configurados los precios de imágenes por lotes;
  • el servicio de tareas por lotes asíncronas funciona con normalidad.

3. Autenticación

La API por lotes usa tu propia clave de API de LMU AI:

Authorization: Bearer YOUR_API_KEY

Ejemplo:

curl 'https://api.lmuai.com/v1/images/batches/models' \
  -H 'Authorization: Bearer YOUR_API_KEY'

No pongas tu clave de API en URLs, código fuente del front-end ni repositorios públicos.


4. Resumen de endpoints

MétodoRutaDescripción
GET/v1/images/batches/modelsLista los modelos que la clave actual puede usar para la generación de imágenes por lotes
POST/v1/images/batchesCrea una tarea de imágenes por lotes
GET/v1/images/batchesLista las tareas por lotes creadas por la clave actual
GET/v1/images/batches/{id}Consulta el estado de una tarea específica
GET/v1/images/batches/{id}/itemsConsulta los detalles de los ítems de la tarea
GET/v1/images/batches/{id}/items/{custom_id}/contentDescarga la imagen de un ítem de tarea individual
GET/v1/images/batches/{id}/downloadDescarga todo el lote como un ZIP
POST/v1/images/batches/{id}/cancelCancela una tarea
DELETE/v1/images/batches/{id}/outputsElimina los archivos de salida del lote
DELETE/v1/images/batches/{id}Elimina el registro de la tarea por lotes

Todos los datos de las tareas están aislados por la clave de API usada para crearlas.


5. Listar los modelos por lotes disponibles

GET /v1/images/batches/models

curl 'https://api.lmuai.com/v1/images/batches/models' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Una respuesta típica (extracto):

{
  "object": "list",
  "data": [
    {
      "id": "gemini-3.1-flash-image",
      "object": "image.batch.model"
    }
  ]
}

La lista de modelos por lotes difiere de la lista de modelos regular

Usa /v1/images/batches/models como el selector de modelos para las tareas por lotes. Comprueba además los permisos de la función por lotes, los recursos de ejecución, la compatibilidad del modelo y la configuración de facturación por lotes.

No todos los modelos devueltos por el /v1/models o /v1beta/models regular pueden usarse para la generación de imágenes por lotes asíncrona.


6. Crear una tarea por lotes

POST /v1/images/batches

curl --request POST \
  'https://api.lmuai.com/v1/images/batches' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Idempotency-Key: client-batch-20260725-001' \
  --header 'Content-Type: application/json' \
  --data-raw '{
    "model": "gemini-3.1-flash-image",
    "task_name": "Product image batch eval 001",
    "response_mime_type": "image/png",
    "image_size": "1K",
    "items": [
      {
        "custom_id": "image_001",
        "prompt": "An orange tabby cat wearing an astronaut helmet, cinematic lighting",
        "output_count": 1
      },
      {
        "custom_id": "image_002",
        "prompt": "A futuristic city in morning mist, ultra-wide-angle photography",
        "output_count": 1
      },
      {
        "custom_id": "image_003",
        "prompt": "A seaside lighthouse at sunset, watercolor illustration, warm tones",
        "output_count": 1
      }
    ]
  }'

Campos de la solicitud de nivel superior

CampoTipoRequeridoValor por defectoDescripción
modelstringDebe provenir de la lista de modelos por lotes
task_namestringNoAutogeneradoNombre de la tarea; el contenido demasiado largo se trunca
parent_batch_idstringNoVincula una tarea padre, adecuado para reintentar ítems fallidos
itemsarrayÍtems de la tarea por lotes, al menos uno
response_mime_typestringNoimage/pngEl tipo MIME de salida esperado
aspect_ratiostringNoAún no se envía al upstream en la versión actual; no dependas de este campo para controlar la relación de aspecto
image_sizestringNo1KActualmente solo se admite 1K
metadataobjectNoPares clave-valor de cadenas personalizados

Campos de items[]

CampoTipoRequeridoValor por defectoDescripción
custom_idstringNoAutogeneradoEl ID de tarea del llamante, debe ser único dentro del mismo lote
promptstringCada tarea puede usar un prompt diferente
output_countintegerNo1Actualmente hasta 4 por ítem, según la configuración del despliegue
reference_imagesarrayNoImágenes de referencia para imagen a imagen

Idempotency-Key

Se recomienda encarecidamente incluir una única con cada creación de tarea:

Idempotency-Key: client-batch-20260725-001

Cuando la misma clave de API reenvía con la misma Idempotency-Key y un cuerpo de solicitud idéntico, el servidor puede devolver la tarea original, evitando la creación duplicada y las retenciones de costo duplicadas tras un tiempo de espera de red.

Si reutilizas la misma Idempotency-Key pero con contenido de solicitud diferente, devuelve:

BATCH_IMAGE_IDEMPOTENCY_CONFLICT

7. Límites actuales por lotes

Los límites por defecto en el código fuente están a continuación; el despliegue real puede ser ajustado por el administrador:

LímiteValor por defecto
Máx. ítems de entrada por lote200
Máx. imágenes de salida por lote200
Máx. output_count por ítem4
Máx. caracteres por prompt8000
Máx. tamaño por imagen de referencia en línea10 MiB
Máx. ítems por defecto por ZIP200

Aún no se puede especificar la relación de aspecto del lote

aspect_ratio actualmente no tiene efecto

Aunque la estructura de la solicitud por lotes mantiene un campo aspect_ratio, la lógica actual de construcción de solicitudes de Gemini Batch y Vertex Batch aún no lo escribe en el generationConfig.imageConfig del upstream.

Como resultado, la relación de aspecto de una tarea por lotes está determinada actualmente por el comportamiento por defecto del upstream. Omite aspect_ratio en tu solicitud y no dependas de él como una capacidad estable de la API.

Cuando necesites un control preciso sobre relaciones de aspecto como 1:1, 16:9 o 21:9, usa la API de Gemini Image en tiempo real.

Solo se admite 1K

La API por lotes aún no admite 2K / 4K

El image_size de la API por lotes actualmente solo acepta:

{
  "image_size": "1K"
}

Enviar 2K o 4K devuelve BATCH_IMAGE_INVALID_ITEMS.

Cuando necesites 2K / 4K, usa la API de Gemini Image en tiempo real y gestiona la concurrencia de múltiples solicitudes en el lado del cliente.

Cómo output_count se expande en tareas

Si un ítem establece:

{
  "custom_id": "poster",
  "prompt": "Movie poster",
  "output_count": 3
}

el servidor lo expande en IDs de tarea separados, por ejemplo:

poster_01
poster_02
poster_03

El número total de imágenes tras la expansión no puede exceder el número máximo de salida del lote.


8. Imagen a imagen por lotes

Cada ítem puede incluir reference_images:

{
  "model": "gemini-3.1-flash-image",
  "task_name": "Product image style transfer",
  "image_size": "1K",
  "items": [
    {
      "custom_id": "product_001",
      "prompt": "Place the product on a clean light-gray studio background, keeping the product structure and text accurate",
      "reference_images": [
        {
          "id": "source_001",
          "type": "reference",
          "mime_type": "image/png",
          "data": "BASE64_IMAGE_DATA"
        }
      ]
    }
  ]
}

Campos de la imagen de referencia

CampoTipoRequeridoDescripción
idstringNoID de la imagen de referencia
typestringNoUna etiqueta para el propósito de la imagen de referencia
mime_typestringimage/png, image/jpeg o image/webp
datastringUno de dosEl contenido Base64 de la imagen

Para la integración de la API pública, recomendamos pasar imágenes de referencia en Base64 mediante data. Otros métodos de referencia de almacenamiento son una capacidad avanzada controlada — contacta al administrador si los necesitas.

El número de imágenes de referencia depende del modelo. El servicio aplica actualmente los siguientes límites por defecto según el nombre del modelo:

  • nombres que contienen flash-image: hasta 3 imágenes de referencia por tarea;
  • nombres que contienen pro-image: hasta 14 imágenes de referencia por tarea.

El número realmente utilizable también puede verse afectado por las capacidades del modelo upstream y la configuración del despliegue.


9. Respuesta de creación de tarea

Una creación exitosa devuelve HTTP 200 y el objeto de lote:

{
  "id": "imgbatch_abc123",
  "object": "image.batch",
  "task_name": "Product image batch eval 001",
  "status": "queued",
  "model": "gemini-3.1-flash-image",
  "item_count": 3,
  "success_count": 0,
  "fail_count": 0,
  "estimated_cost": 0.15,
  "hold_amount": 0.09,
  "actual_cost": null,
  "created_at": 1784995200,
  "submitted_at": 1784995201,
  "settled_at": null
}

Campos clave

CampoDescripción
idEl ID del lote, usado para consultas y descargas posteriores
statusEl estado de la tarea expuesto al usuario
item_countNúmero total de ítems de tarea tras la expansión
success_countNúmero de tareas exitosas
fail_countNúmero de tareas fallidas
estimated_costCosto estimado en el momento del envío
hold_amountLa retención de saldo aplicada cuando se crea la tarea
actual_costEl costo real tras la liquidación; null mientras está incompleta

Un envío exitoso no significa que las imágenes estén listas

Un 200 del endpoint de creación solo significa que el lote ha sido aceptado y enviado al pipeline de procesamiento asíncrono. El cliente debe seguir consultando el estado de la tarea hasta que alcance completed, failed o cancelled.


10. Consultar el estado de la tarea

GET /v1/images/batches/{id}

curl 'https://api.lmuai.com/v1/images/batches/imgbatch_abc123' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Estados de cara al usuario

EstadoDescripciónTerminal
queuedCreado, subido o enviado; esperando el procesamiento upstreamNo
runningEl upstream está generando imágenesNo
processing_resultsDescargando e indexando los resultados del upstreamNo
settlingLiquidando el costo realNo
completedProcesamiento completo; los resultados se pueden consultar y descargar
failedEl lote falló
cancelledCancelado
output_deletedArchivos de salida eliminados, pero el registro de la tarea permanece

Intervalos de sondeo recomendados:

First 2 minutes: every 10-15 seconds
After 2 minutes: every 30 seconds
Long tasks: gradually increase to every 60 seconds

No hagas sondeo cada segundo.

Los webhooks de finalización aún no se admiten

La API por lotes actualmente no tiene configuración de callback_url, webhook_url ni de callback de finalización. No notifica proactivamente al servidor del llamante cuando una tarea se completa.

El llamante necesita hacer sondeo de GET /v1/images/batches/{id}, detener el sondeo una vez que el estado alcance completed, failed, cancelled u output_deleted, y luego consultar los detalles o descargar los resultados.


11. Listar tareas

GET /v1/images/batches

curl 'https://api.lmuai.com/v1/images/batches?status=completed&limit=20' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Parámetros de consulta

ParámetroTipoDescripción
statusstringqueued, running, processing_results, settling, completed, failed, cancelled, output_deleted
task_namestringBúsqueda difusa por nombre de tarea
downloadedstringtrue / false, filtra por si se ha descargado
fromstringInicio del rango de tiempo de creación
tostringFin del rango de tiempo de creación
limitintegerPor defecto 20, máx. 100
cursorstringCursor de paginación

Respuesta:

{
  "object": "list",
  "data": [
    {
      "id": "imgbatch_abc123",
      "object": "image.batch",
      "task_name": "Product image batch eval 001",
      "status": "completed",
      "model": "gemini-3.1-flash-image",
          "item_count": 3,
      "success_count": 3,
      "fail_count": 0,
      "estimated_cost": 0.15,
      "hold_amount": 0.09,
      "actual_cost": 0.12,
      "created_at": 1784995200,
      "submitted_at": 1784995201,
      "settled_at": 1784998800
    }
  ],
  "has_more": false
}

12. Consultar los detalles de los ítems de la tarea

GET /v1/images/batches/{id}/items

curl 'https://api.lmuai.com/v1/images/batches/imgbatch_abc123/items?status=success&limit=100' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Valores de status admitidos:

all
pending
success
failed

Una respuesta típica (extracto):

{
  "object": "list",
  "data": [
    {
      "custom_id": "image_001",
      "status": "success",
      "prompt_preview": "An orange tabby cat wearing an astronaut helmet...",
      "mime_type": "image/png",
      "file_extension": "png",
      "image_count": 1,
      "error": null
    },
    {
      "custom_id": "image_002",
      "status": "failed",
      "prompt_preview": "A futuristic city in morning mist...",
      "mime_type": null,
      "file_extension": null,
      "image_count": 0,
      "error": {
        "code": "PROVIDER_ITEM_FAILED",
        "message": "image generation failed",
        "source": "provider"
      }
    }
  ],
  "has_more": false
}

Los ítems de tarea son por defecto 100 por página, con un máximo de 500.


13. Descargar imágenes

Descargar un ítem de tarea individual

curl \
  'https://api.lmuai.com/v1/images/batches/imgbatch_abc123/items/image_001/content' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  --output image_001.png

Si un ítem de tarea tiene varias imágenes, puedes especificar:

?image_index=0
?image_index=1

image_index comienza en 0.

Descargar todo el lote como un ZIP

curl \
  'https://api.lmuai.com/v1/images/batches/imgbatch_abc123/download' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  --output imgbatch_abc123.zip

Parámetros opcionales:

?status=success
?max_items=100

El ZIP contiene las imágenes y un manifiesto de resultados. Tras una descarga exitosa, la tarea registra un downloaded_at.


14. Cancelar y eliminar

Cancelar una tarea

curl --request POST \
  'https://api.lmuai.com/v1/images/batches/imgbatch_abc123/cancel' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Una tarea que ya ha alcanzado un estado terminal no se cancelará de nuevo. Que aún se puedan evitar los cargos del upstream depende del estado actual de la tarea Batch del upstream.

Eliminar archivos de salida

curl --request DELETE \
  'https://api.lmuai.com/v1/images/batches/imgbatch_abc123/outputs' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Después de eliminar la salida, el estado se muestra como output_deleted y las imágenes ya no se pueden descargar.

Eliminar el registro de la tarea

curl --request DELETE \
  'https://api.lmuai.com/v1/images/batches/imgbatch_abc123' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Solo las tareas en un estado terminal pueden tener su registro eliminado. Un éxito devuelve HTTP 204.

Eliminar el registro y eliminar las imágenes son dos cosas diferentes

  • Eliminar la salida: limpia los archivos de imágenes, pero el registro de la tarea permanece;
  • Eliminar el registro: oculta la tarea de la lista de tareas del usuario actual;
  • Los sistemas de producción deben confirmar que los resultados se han descargado y archivado antes de eliminar.

15. Flujo de trabajo completo en Node.js

import { mkdir, writeFile } from 'node:fs/promises';

const BASE_URL = process.env.LMU_BASE_URL || 'https://api.lmuai.com';
const API_KEY = process.env.LMU_API_KEY;

if (!API_KEY) throw new Error('Missing LMU_API_KEY');

const headers = {
  Authorization: `Bearer ${API_KEY}`,
};

async function jsonRequest(path, options = {}) {
  const response = await fetch(`${BASE_URL}${path}`, {
    ...options,
    headers: {
      ...headers,
      ...(options.headers || {}),
    },
  });

  const text = await response.text();
  let data;
  try {
    data = text ? JSON.parse(text) : null;
  } catch {
    throw new Error(`Non-JSON response: HTTP ${response.status}`);
  }

  if (!response.ok) {
    const error = data?.error || {};
    throw new Error(
      `${error.code || response.status}: ${error.message || text}`,
    );
  }

  return data;
}

const batch = await jsonRequest('/v1/images/batches', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Idempotency-Key': `client-${Date.now()}`,
  },
  body: JSON.stringify({
    model: 'gemini-3.1-flash-image',
    task_name: 'Node batch image demo',
    image_size: '1K',
    items: [
      { custom_id: 'cat', prompt: 'A cinematic astronaut orange tabby cat' },
      { custom_id: 'city', prompt: 'A futuristic city in morning mist' },
    ],
  }),
});

console.log('batch id:', batch.id);

let job = batch;
while (!['completed', 'failed', 'cancelled', 'output_deleted'].includes(job.status)) {
  await new Promise((resolve) => setTimeout(resolve, 15_000));
  job = await jsonRequest(`/v1/images/batches/${encodeURIComponent(batch.id)}`);
  console.log('status:', job.status);
}

if (job.status !== 'completed') {
  throw new Error(`Batch task did not complete successfully: ${job.status}`);
}

const items = await jsonRequest(
  `/v1/images/batches/${encodeURIComponent(batch.id)}/items?status=success`,
);

await mkdir('batch-output', { recursive: true });

for (const item of items.data || []) {
  const response = await fetch(
    `${BASE_URL}/v1/images/batches/${encodeURIComponent(batch.id)}` +
      `/items/${encodeURIComponent(item.custom_id)}/content`,
    { headers },
  );

  if (!response.ok) {
    console.error('Download failed:', item.custom_id, response.status);
    continue;
  }

  const extension = item.file_extension || 'png';
  await writeFile(
    `batch-output/${item.custom_id}.${extension}`,
    Buffer.from(await response.arrayBuffer()),
  );
}

16. Flujo de trabajo completo en Python

import os
import time
from pathlib import Path
import requests

BASE_URL = os.getenv("LMU_BASE_URL", "https://api.lmuai.com")
API_KEY = os.environ["LMU_API_KEY"]
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

payload = {
    "model": "gemini-3.1-flash-image",
    "task_name": "Python batch image demo",
    "image_size": "1K",
    "items": [
        {"custom_id": "cat", "prompt": "A cinematic astronaut orange tabby cat"},
        {"custom_id": "city", "prompt": "A futuristic city in morning mist"},
    ],
}

response = requests.post(
    f"{BASE_URL}/v1/images/batches",
    headers={
        **HEADERS,
        "Content-Type": "application/json",
        "Idempotency-Key": f"client-{int(time.time())}",
    },
    json=payload,
    timeout=300,
)
response.raise_for_status()
batch = response.json()
print("batch id:", batch["id"])

terminal = {"completed", "failed", "cancelled", "output_deleted"}
job = batch
while job["status"] not in terminal:
    time.sleep(15)
    response = requests.get(
        f"{BASE_URL}/v1/images/batches/{batch['id']}",
        headers=HEADERS,
        timeout=60,
    )
    response.raise_for_status()
    job = response.json()
    print("status:", job["status"])

if job["status"] != "completed":
    raise RuntimeError(f"Batch task did not complete successfully: {job['status']}")

items_response = requests.get(
    f"{BASE_URL}/v1/images/batches/{batch['id']}/items",
    headers=HEADERS,
    params={"status": "success"},
    timeout=60,
)
items_response.raise_for_status()
items = items_response.json().get("data", [])

output_dir = Path("batch-output")
output_dir.mkdir(exist_ok=True)

for item in items:
    content = requests.get(
        f"{BASE_URL}/v1/images/batches/{batch['id']}"
        f"/items/{item['custom_id']}/content",
        headers=HEADERS,
        timeout=300,
    )
    content.raise_for_status()
    extension = item.get("file_extension") or "png"
    (output_dir / f"{item['custom_id']}.{extension}").write_bytes(content.content)

17. Facturación y retenciones de saldo

Las tareas por lotes siguen un flujo de "estimar, retener y luego liquidar al completar":

  1. El servidor estima el costo según el modelo, el número de tareas, el multiplicador del grupo y el descuento por lotes;
  2. Aplica una retención hold_amount cuando se crea la tarea;
  3. Después de que finaliza el procesamiento upstream, calcula actual_cost según el número de imágenes exitosas;
  4. Tras la liquidación, libera cualquier exceso de retención;
  5. Si la tarea falla o se cancela antes del envío, el sistema intenta liberar la retención según el estado de la tarea.

Los campos de respuesta:

estimated_cost
hold_amount
actual_cost

representan el monto estimado, el monto retenido y el monto real final, respectivamente.

Los precios siguen la configuración actual del grupo

El descuento por lotes, el multiplicador del grupo, el multiplicador de la cuenta y el precio por imagen pueden ser configurados por el administrador. La documentación no promete precios fijos; el cargo final está determinado por los detalles de uso en la consola y el actual_cost del lote.


18. Formato de error

La API por lotes usa la siguiente estructura de error:

{
  "error": {
    "type": "invalid_request_error",
    "code": "BATCH_IMAGE_INVALID_ITEMS",
    "message": "batch image items are invalid"
  }
}

Registra también el ID de solicitud de los encabezados de respuesta. En la consola, el mensaje de error se muestra como:

Error code: BATCH_IMAGE_DISABLED
Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Códigos de error comunes

Código de errorHTTPSignificadoQué hacer
BATCH_IMAGE_DISABLED404La generación global de imágenes por lotes no está habilitadaProporciona el código de error y el ID de solicitud al administrador
BATCH_IMAGE_GROUP_DISABLED403El grupo de la clave actual no permite la generación de imágenes por lotes, o no es un grupo GeminiCambia de clave o contacta al administrador para habilitar el permiso del grupo
BATCH_IMAGE_NO_ACCOUNT_AVAILABLE502No hay recursos de ejecución por lotes disponibles actualmenteGuarda el ID de solicitud y contacta al administrador
BATCH_IMAGE_SETTLEMENT_PRICING_MISSING400El modelo por lotes no tiene precio de facturaciónContacta al administrador para configurar el precio del modelo
BATCH_IMAGE_INVALID_MODEL400No se proporcionó ningún modeloUsa un modelo de la lista de modelos por lotes
BATCH_IMAGE_INVALID_ITEMS400Los ítems, la resolución o los campos de la solicitud son inválidosVerifica el cuerpo de la solicitud; actualmente solo se admite 1K
BATCH_IMAGE_DUPLICATE_CUSTOM_ID400custom_id duplicadoAsegúrate de que sea único dentro del mismo lote
BATCH_IMAGE_PROMPT_TOO_LONG400El prompt es demasiado largoAcorta el prompt
BATCH_IMAGE_TOO_MANY_OUTPUT_IMAGES400El número de imágenes tras la expansión excede el límiteReduce los ítems o el output_count
BATCH_IMAGE_INVALID_REFERENCE_IMAGE400El formato, tamaño o URI de la imagen de referencia es inválidoVerifica el tipo MIME, el Base64 y el file_uri
BATCH_IMAGE_INSUFFICIENT_BALANCE402El saldo es insuficiente para aplicar la retenciónRecarga o reduce el volumen de tareas
BATCH_IMAGE_IDEMPOTENCY_CONFLICT409La misma clave de idempotencia se asigna a un cuerpo de solicitud diferenteUsa una nueva Idempotency-Key
BATCH_IMAGE_PROVIDER_SUBMIT_FAILED502La creación de la tarea Batch del upstream fallóGuarda el ID de solicitud, reintenta un número limitado de veces o contacta al administrador
BATCH_IMAGE_QUEUE_FAILED502El servicio de tareas asíncronas no está disponible temporalmenteGuarda el ID de solicitud y contacta al administrador
BATCH_IMAGE_NOT_READY409Intentaste descargar antes de que la tarea se completaraEspera hasta que el estado sea completed
BATCH_IMAGE_OUTPUT_DELETED410La salida ya ha sido limpiadaNo se puede descargar de nuevo; necesitas recrear la tarea
BATCH_IMAGE_ITEM_FAILED409El ítem de tarea especificado no tiene ninguna imagen exitosaVerifica item.error
BATCH_IMAGE_DOWNLOAD_LIMITED429Demasiadas descargas simultáneasReintenta más tarde

19. API por lotes vs. API en tiempo real

AspectoImagen Gemini en tiempo realImagen por lotes asíncrona
Endpoint/v1beta/models/{model}:generateContent/v1/images/batches
Método de retornoDevuelve una imagen en Base64 en la misma solicitud HTTPDevuelve un ID de lote; consulta y descarga después
Resolución1K / 2K / 4KActualmente solo acepta 1K, y el upstream usa su configuración de imagen por defecto
Relación de aspectoControlada por el enum de relación que el modelo realmente admiteNo se puede especificar actualmente; usa la relación de aspecto por defecto del upstream
Múltiples promptsEl cliente realiza múltiples solicitudesUn lote contiene múltiples ítems
Múltiples imágenes por ítemMúltiples solicitudes separadasoutput_count, hasta 4 por defecto
Gestión de estadoEl llamante lo rastrea por sí mismoEstado de tarea, detalles, cancelación y eliminación integrados
Método de descargaDecodificación Base64Descarga de imagen individual o ZIP
CostoFacturado por solicitud en tiempo realEstimar, retener saldo, liquidar al completar
Ideal paraInteracción en línea, pruebas de calidad, pruebas de estrés de rendimientoProducción sin conexión a gran escala

20. Lista de verificación de integración

  • /v1/images/batches/models devuelve al menos un modelo;
  • la clave de API que usas pertenece a un grupo Gemini que permite la generación de imágenes por lotes;
  • la creación de la tarea incluye una Idempotency-Key única;
  • image_size usa 1K;
  • todos los valores de custom_id son únicos;
  • puedes hacer sondeo hasta completed o un estado terminal definitivo;
  • puedes consultar los detalles de éxito / fallo;
  • puedes descargar una imagen individual;
  • puedes descargar el ZIP y leer el manifiesto de resultados;
  • puedes identificar los ítems fallidos y evitar reenviar todo el lote;
  • has verificado estimated_cost, hold_amount y actual_cost;
  • los registros anotan el código de error y el ID de solicitud pero no la clave de API completa.

Próximos pasos

Última actualización:

En esta página