Open API

Gemini Batch-Bild-API

LMU AI asynchrone Batch-Bild-API: viele Gemini-Bildaufgaben gleichzeitig einreichen, Status und Details abfragen, Bilder oder ZIP herunterladen, mit Idempotenz und Kostenschätzungen.

Die LMU AI Gemini Batch-Bild-API ermöglicht es dir, mehrere Gemini-Bildaufgaben gleichzeitig einzureichen. Der Server erstellt die Batch-Aufgabe asynchron, verfolgt ihren Status, organisiert die Ergebnisse und rechnet die Kosten ab.

Haupt-Endpunkt:

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

Dies ist eine LMU AI Erweiterungs-API

Die Batch-API befindet sich unter /v1/images/batches. Sie ist eine asynchrone Aufgaben-API, die LMU AI für Nutzer bereitstellt — nicht Google Geminis nativer /v1beta-Pfad.

Die aktuelle Implementierung unterstützt nur Gemini. Obwohl der Request-Body ein generisches model-Feld enthält, kannst du an diesem Endpunkt keine gpt-image-2- oder Grok-Bildmodelle einreichen. Für GPT Text-zu-Bild nutze die GPT Image API; für Grok Text-zu-Bild nutze die Grok Image API.

Wenn du nur ein einzelnes Gemini-Bild erzeugen musst oder 2K / 4K benötigst, nutze die Echtzeit-Gemini Image API.


1. Wann sie zu verwenden ist

Die Batch-API eignet sich gut, wenn du:

  • Dutzende bis Hunderte verschiedene Prompts gleichzeitig einreichst;
  • nicht benötigst, dass die Bildaufgaben sofort innerhalb derselben HTTP-Anfrage zurückkommen;
  • Aufgabenstatus, Fehlerdetails, Abbruch und Batch-Download brauchst;
  • Artikelillustrationen, E-Commerce-Assets, Datensätze oder Design-Kandidaten offline produzierst;
  • Idempotency-Key verwenden möchtest, um doppelte Einreichungen und doppelte Kosten zu verhindern.

Sie eignet sich nicht gut, wenn du:

  • die Latenz einer einzelnen Echtzeit-Bilderzeugung misst;
  • 2K / 4K benötigst;
  • synchron auf ein Bild warten und es sofort anzeigen musst;
  • Nebenläufigkeits- oder RPM-Stresstests durchführst.

2. Voraussetzungen

Die Batch-Funktion erfordert, dass der Administrator sie sowohl auf Bereitstellungs- als auch auf Gruppenseite aktiviert und kompatible Upstream-Konten und Preise konfiguriert.

Du kannst zuerst die Modellliste anfordern, um zu prüfen, ob die Funktion verfügbar ist:

GET /v1/images/batches/models

Falls BATCH_IMAGE_DISABLED zurückgegeben wird

BATCH_IMAGE_DISABLED bedeutet, dass die globale Batch-Bild-Funktion des API-Relays nicht aktiviert wurde. Es ist kein Fehler beim API-Schlüssel, Modell oder Prompt.

Gib dem Administrator den vollständigen Fehlercode und die Request-ID aus den Response-Headern an, zum Beispiel:

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

Häufige Zulassungsbedingungen:

  • der aktuelle API-Schlüssel ist aktiv;
  • die Gruppenplattform des API-Schlüssels ist Gemini;
  • die Gruppe erlaubt Batch-Bilderzeugung;
  • Ausführungsressourcen für Batch-Bilder sind verfügbar;
  • das Modell hat eine Batch-Bild-Preiskonfiguration;
  • der asynchrone Batch-Aufgabendienst läuft normal.

3. Authentifizierung

Die Batch-API verwendet deinen eigenen LMU AI API-Schlüssel:

Authorization: Bearer YOUR_API_KEY

Beispiel:

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

Setze deinen API-Schlüssel nicht in URLs, Frontend-Quellcode oder öffentliche Repositories ein.


4. Endpunktübersicht

MethodePfadBeschreibung
GET/v1/images/batches/modelsListe der Modelle, die der aktuelle Schlüssel für Batch-Bilderzeugung nutzen kann
POST/v1/images/batchesEine Batch-Bildaufgabe erstellen
GET/v1/images/batchesDie vom aktuellen Schlüssel erstellten Batch-Aufgaben auflisten
GET/v1/images/batches/{id}Den Status einer bestimmten Aufgabe abfragen
GET/v1/images/batches/{id}/itemsDetails der Aufgaben-Items abfragen
GET/v1/images/batches/{id}/items/{custom_id}/contentDas Bild für ein einzelnes Aufgaben-Item herunterladen
GET/v1/images/batches/{id}/downloadDen gesamten Batch als ZIP herunterladen
POST/v1/images/batches/{id}/cancelEine Aufgabe abbrechen
DELETE/v1/images/batches/{id}/outputsDie Batch-Ausgabedateien löschen
DELETE/v1/images/batches/{id}Den Batch-Aufgabendatensatz löschen

Alle Aufgabendaten sind nach dem API-Schlüssel isoliert, der zur Erstellung der Aufgabe verwendet wurde.


5. Verfügbare Batch-Modelle auflisten

GET /v1/images/batches/models

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

Eine typische Antwort (Auszug):

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

Die Batch-Modellliste unterscheidet sich von der regulären Modellliste

Verwende /v1/images/batches/models als Modellauswahl für Batch-Aufgaben. Sie prüft zusätzlich Batch-Funktionsberechtigungen, Ausführungsressourcen, Modellunterstützung und Batch-Abrechnungskonfiguration.

Nicht jedes Modell, das die regulären /v1/models oder /v1beta/models zurückgeben, kann für asynchrone Batch-Bilderzeugung verwendet werden.


6. Eine Batch-Aufgabe erstellen

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
      }
    ]
  }'

Felder auf oberster Ebene des Requests

FeldTypErforderlichStandardBeschreibung
modelstringJaMuss aus der Batch-Modellliste stammen
task_namestringNeinAutomatisch generiertAufgabenname; zu langer Inhalt wird gekürzt
parent_batch_idstringNeinVerknüpft eine übergeordnete Aufgabe, geeignet für erneutes Ausführen fehlgeschlagener Items
itemsarrayJaBatch-Aufgaben-Items, mindestens eines
response_mime_typestringNeinimage/pngDer erwartete Ausgabe-MIME-Typ
aspect_ratiostringNeinWird in der aktuellen Version noch nicht an den Upstream übergeben; verlasse dich nicht auf dieses Feld zur Steuerung des Seitenverhältnisses
image_sizestringNein1KDerzeit wird nur 1K unterstützt
metadataobjectNeinBenutzerdefinierte String-Schlüssel-Wert-Paare

items[]-Felder

FeldTypErforderlichStandardBeschreibung
custom_idstringNeinAutomatisch generiertDie Aufgaben-ID des Aufrufers, muss innerhalb desselben Batch eindeutig sein
promptstringJaJede Aufgabe kann einen anderen Prompt verwenden
output_countintegerNein1Derzeit bis zu 4 pro Item, abhängig von der Bereitstellungskonfiguration
reference_imagesarrayNeinReferenzbilder für Bild-zu-Bild

Idempotency-Key

Es wird dringend empfohlen, bei jeder Aufgabenerstellung einen eindeutigen einzubinden:

Idempotency-Key: client-batch-20260725-001

Wenn derselbe API-Schlüssel mit demselben Idempotency-Key und einem identischen Request-Body erneut einreicht, kann der Server die ursprüngliche Aufgabe zurückgeben und so eine doppelte Erstellung und doppelte Kostenrückstellungen nach einem Netzwerk-Timeout vermeiden.

Wenn du denselben Idempotency-Key, aber mit anderem Anfrageinhalt wiederverwendest, gibt es zurück:

BATCH_IMAGE_IDEMPOTENCY_CONFLICT

7. Aktuelle Batch-Grenzwerte

Die Standardgrenzwerte im Quellcode sind unten aufgeführt; die tatsächliche Bereitstellung kann vom Administrator angepasst werden:

GrenzwertStandard
Max. Eingabe-Items pro Batch200
Max. Ausgabebilder pro Batch200
Max. output_count pro Item4
Max. Zeichen pro Prompt8000
Max. Größe pro Inline-Referenzbild10 MiB
Standard-Max.-Items pro ZIP200

Das Batch-Seitenverhältnis kann noch nicht angegeben werden

aspect_ratio hat derzeit keine Wirkung

Obwohl die Batch-Request-Struktur ein aspect_ratio-Feld beibehält, schreibt die aktuelle Logik zum Erstellen von Gemini-Batch- und Vertex-Batch-Requests es noch nicht in die Upstream-generationConfig.imageConfig.

Daher wird das Seitenverhältnis einer Batch-Aufgabe derzeit durch das Standardverhalten des Upstreams bestimmt. Lass aspect_ratio in deinem Request weg und verlasse dich nicht darauf als stabile API-Fähigkeit.

Wenn du präzise Kontrolle über Seitenverhältnisse wie 1:1, 16:9 oder 21:9 benötigst, nutze die Echtzeit-Gemini Image API.

Nur 1K wird unterstützt

Die Batch-API unterstützt noch kein 2K / 4K

Die image_size der Batch-API akzeptiert derzeit nur:

{
  "image_size": "1K"
}

Das Einreichen von 2K oder 4K gibt BATCH_IMAGE_INVALID_ITEMS zurück.

Wenn du 2K / 4K benötigst, nutze die Echtzeit-Gemini Image API und verwalte die Nebenläufigkeit mehrerer Anfragen auf der Client-Seite.

Wie sich output_count in Aufgaben aufteilt

Wenn ein Item Folgendes setzt:

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

teilt der Server es in separate Aufgaben-IDs auf, zum Beispiel:

poster_01
poster_02
poster_03

Die Gesamtzahl der Bilder nach der Aufteilung darf die maximale Ausgabezahl des Batch nicht überschreiten.


8. Batch-Bild-zu-Bild

Jedes Item kann reference_images enthalten:

{
  "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"
        }
      ]
    }
  ]
}

Referenzbild-Felder

FeldTypErforderlichBeschreibung
idstringNeinReferenzbild-ID
typestringNeinEin Tag für den Zweck des Referenzbilds
mime_typestringJaimage/png, image/jpeg oder image/webp
datastringEins von zweiDer Base64-Inhalt des Bilds

Für die Integration öffentlicher APIs empfehlen wir, Base64-Referenzbilder über data zu übergeben. Andere Speicher-Referenzmethoden sind eine kontrollierte erweiterte Funktion — kontaktiere den Administrator, falls du sie benötigst.

Die Anzahl der Referenzbilder hängt vom Modell ab. Der Dienst wendet derzeit die folgenden Standardgrenzwerte basierend auf dem Modellnamen an:

  • Namen, die flash-image enthalten: bis zu 3 Referenzbilder pro Aufgabe;
  • Namen, die pro-image enthalten: bis zu 14 Referenzbilder pro Aufgabe.

Die tatsächlich nutzbare Anzahl kann auch von den Upstream-Modellfähigkeiten und der Bereitstellungskonfiguration beeinflusst werden.


9. Antwort bei der Aufgabenerstellung

Eine erfolgreiche Erstellung gibt HTTP 200 und das Batch-Objekt zurück:

{
  "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
}

Schlüsselfelder

FeldBeschreibung
idDie Batch-ID, die für spätere Abfragen und Downloads verwendet wird
statusDer dem Nutzer angezeigte Aufgabenstatus
item_countGesamtzahl der Aufgaben-Items nach der Aufteilung
success_countAnzahl der erfolgreichen Aufgaben
fail_countAnzahl der fehlgeschlagenen Aufgaben
estimated_costGeschätzte Kosten zum Zeitpunkt der Einreichung
hold_amountDie Rückstellung, die bei der Aufgabenerstellung vorgenommen wird
actual_costDie tatsächlichen Kosten nach der Abrechnung; null solange unvollständig

Eine erfolgreiche Einreichung bedeutet nicht, dass die Bilder fertig sind

Ein 200 vom Erstellungs-Endpunkt bedeutet nur, dass der Batch angenommen und an die asynchrone Verarbeitungs-Pipeline übergeben wurde. Der Client muss den Aufgabenstatus weiter abfragen, bis er completed, failed oder cancelled erreicht.


10. Aufgabenstatus abfragen

GET /v1/images/batches/{id}

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

Nutzerseitige Status

StatusBeschreibungTerminal
queuedErstellt, hochgeladen oder eingereicht; wartet auf Upstream-VerarbeitungNein
runningUpstream erzeugt BilderNein
processing_resultsHerunterladen und Indizieren der Upstream-ErgebnisseNein
settlingAbrechnung der tatsächlichen KostenNein
completedVerarbeitung abgeschlossen; Ergebnisse können abgefragt und heruntergeladen werdenJa
failedDer Batch ist fehlgeschlagenJa
cancelledAbgebrochenJa
output_deletedAusgabedateien gelöscht, aber der Aufgabendatensatz bleibt bestehenJa

Empfohlene Abfrageintervalle:

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

Frage nicht jede Sekunde ab.

Abschluss-Webhooks werden noch nicht unterstützt

Die Batch-API hat derzeit keine callback_url-, webhook_url- oder Abschluss-Callback-Konfiguration. Sie benachrichtigt den Server des Aufrufers nicht proaktiv, wenn eine Aufgabe abgeschlossen ist.

Der Aufrufer muss GET /v1/images/batches/{id} abfragen, das Abfragen beenden, sobald der Status completed, failed, cancelled oder output_deleted erreicht, und dann die Details abfragen oder die Ergebnisse herunterladen.


11. Aufgaben auflisten

GET /v1/images/batches

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

Abfrageparameter

ParameterTypBeschreibung
statusstringqueued, running, processing_results, settling, completed, failed, cancelled, output_deleted
task_namestringUnscharfe Suche nach Aufgabenname
downloadedstringtrue / false, filtern nach Download-Status
fromstringBeginn des Erstellungszeit-Bereichs
tostringEnde des Erstellungszeit-Bereichs
limitintegerStandard 20, max. 100
cursorstringPaginierungs-Cursor

Antwort:

{
  "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. Details der Aufgaben-Items abfragen

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'

Unterstützte status-Werte:

all
pending
success
failed

Eine typische Antwort (Auszug):

{
  "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
}

Aufgaben-Items sind standardmäßig 100 pro Seite, mit einem Maximum von 500.


13. Bilder herunterladen

Ein einzelnes Aufgaben-Item herunterladen

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

Wenn ein Aufgaben-Item mehrere Bilder hat, kannst du angeben:

?image_index=0
?image_index=1

image_index beginnt bei 0.

Den gesamten Batch als ZIP herunterladen

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

Optionale Parameter:

?status=success
?max_items=100

Das ZIP enthält die Bilder und ein Ergebnismanifest. Nach einem erfolgreichen Download zeichnet die Aufgabe ein downloaded_at auf.


14. Abbrechen und löschen

Eine Aufgabe abbrechen

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

Eine Aufgabe, die bereits einen Terminalzustand erreicht hat, wird nicht erneut abgebrochen. Ob Upstream-Kosten noch verhindert werden können, hängt vom aktuellen Zustand der Upstream-Batch-Aufgabe ab.

Ausgabedateien löschen

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

Nachdem die Ausgabe gelöscht wurde, wird der Status als output_deleted angezeigt und die Bilder können nicht mehr heruntergeladen werden.

Den Aufgabendatensatz löschen

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

Nur Aufgaben in einem Terminalzustand können ihren Datensatz löschen lassen. Ein Erfolg gibt HTTP 204 zurück.

Den Datensatz löschen und die Bilder löschen sind zwei verschiedene Dinge

  • Ausgabe löschen: bereinigt die Bilddateien, aber der Aufgabendatensatz bleibt bestehen;
  • Datensatz löschen: blendet die Aufgabe aus der Aufgabenliste des aktuellen Nutzers aus;
  • Produktionssysteme sollten bestätigen, dass die Ergebnisse heruntergeladen und archiviert wurden, bevor sie löschen.

15. Vollständiger Node.js-Workflow

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. Vollständiger Python-Workflow

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. Abrechnung und Guthabenrückstellungen

Batch-Aufgaben folgen einem Ablauf „schätzen, zurückstellen, dann bei Abschluss abrechnen":

  1. Der Server schätzt die Kosten basierend auf dem Modell, der Aufgabenzahl, dem Gruppenmultiplikator und dem Batch-Rabatt;
  2. Er nimmt eine hold_amount-Rückstellung vor, wenn die Aufgabe erstellt wird;
  3. Nachdem die Upstream-Verarbeitung abgeschlossen ist, berechnet er actual_cost basierend auf der Anzahl erfolgreicher Bilder;
  4. Nach der Abrechnung gibt er überschüssige Rückstellungen frei;
  5. Wenn die Aufgabe vor der Einreichung fehlschlägt oder abgebrochen wird, versucht das System, die Rückstellung entsprechend dem Aufgabenstatus freizugeben.

Die Antwortfelder:

estimated_cost
hold_amount
actual_cost

stehen jeweils für den geschätzten Betrag, den zurückgestellten Betrag und den endgültigen tatsächlichen Betrag.

Die Preisgestaltung folgt der aktuellen Gruppenkonfiguration

Der Batch-Rabatt, der Gruppenmultiplikator, der Kontomultiplikator und der Preis pro Bild können alle vom Administrator konfiguriert werden. Die Dokumentation verspricht keine festen Preise; die endgültige Belastung wird durch die Nutzungsdetails in der Konsole und den actual_cost des Batch bestimmt.


18. Fehlerformat

Die Batch-API verwendet die folgende Fehlerstruktur:

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

Zeichne außerdem die Request-ID aus den Response-Headern auf. In der Konsole wird die Fehlermeldung angezeigt als:

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

Häufige Fehlercodes

FehlercodeHTTPBedeutungWas zu tun ist
BATCH_IMAGE_DISABLED404Globale Batch-Bilderzeugung ist nicht aktiviertGib dem Administrator den Fehlercode und die Request-ID an
BATCH_IMAGE_GROUP_DISABLED403Die Gruppe des aktuellen Schlüssels erlaubt keine Batch-Bilderzeugung oder ist keine Gemini-GruppeSchlüssel wechseln oder Administrator kontaktieren, um die Gruppenberechtigung zu aktivieren
BATCH_IMAGE_NO_ACCOUNT_AVAILABLE502Derzeit sind keine Batch-Ausführungsressourcen verfügbarSpeichere die Request-ID und kontaktiere den Administrator
BATCH_IMAGE_SETTLEMENT_PRICING_MISSING400Das Batch-Modell hat keinen AbrechnungspreisKontaktiere den Administrator, um den Modellpreis zu konfigurieren
BATCH_IMAGE_INVALID_MODEL400Es wurde kein Modell angegebenVerwende ein Modell aus der Batch-Modellliste
BATCH_IMAGE_INVALID_ITEMS400Die Items, die Auflösung oder die Request-Felder sind ungültigPrüfe den Request-Body; derzeit wird nur 1K unterstützt
BATCH_IMAGE_DUPLICATE_CUSTOM_ID400Doppelte custom_idStelle sicher, dass sie innerhalb desselben Batch eindeutig ist
BATCH_IMAGE_PROMPT_TOO_LONG400Der Prompt ist zu langKürze den Prompt
BATCH_IMAGE_TOO_MANY_OUTPUT_IMAGES400Die Anzahl der Bilder nach der Aufteilung überschreitet den GrenzwertReduziere Items oder output_count
BATCH_IMAGE_INVALID_REFERENCE_IMAGE400Das Format, die Größe oder die URI des Referenzbilds ist ungültigPrüfe den MIME-Typ, Base64 und file_uri
BATCH_IMAGE_INSUFFICIENT_BALANCE402Das Guthaben reicht nicht aus, um die Rückstellung vorzunehmenGuthaben aufladen oder das Aufgabenvolumen reduzieren
BATCH_IMAGE_IDEMPOTENCY_CONFLICT409Derselbe Idempotenzschlüssel verweist auf einen anderen Request-BodyVerwende einen neuen Idempotency-Key
BATCH_IMAGE_PROVIDER_SUBMIT_FAILED502Erstellung der Upstream-Batch-Aufgabe fehlgeschlagenSpeichere die Request-ID, versuche es eine begrenzte Anzahl von Malen erneut oder kontaktiere den Administrator
BATCH_IMAGE_QUEUE_FAILED502Der asynchrone Aufgabendienst ist vorübergehend nicht verfügbarSpeichere die Request-ID und kontaktiere den Administrator
BATCH_IMAGE_NOT_READY409Du hast versucht herunterzuladen, bevor die Aufgabe abgeschlossen warWarte, bis der Status completed wird
BATCH_IMAGE_OUTPUT_DELETED410Die Ausgabe wurde bereits bereinigtSie kann nicht erneut heruntergeladen werden; du musst die Aufgabe neu erstellen
BATCH_IMAGE_ITEM_FAILED409Das angegebene Aufgaben-Item hat kein erfolgreiches BildPrüfe item.error
BATCH_IMAGE_DOWNLOAD_LIMITED429Zu viele gleichzeitige DownloadsVersuche es später erneut

19. Batch-API vs. Echtzeit-API

AspektEchtzeit-Gemini-BildAsynchrones Batch-Bild
Endpunkt/v1beta/models/{model}:generateContent/v1/images/batches
RückgabemethodeGibt ein Base64-Bild in derselben HTTP-Anfrage zurückGibt eine Batch-ID zurück; anschließend abfragen und herunterladen
Auflösung1K / 2K / 4KAkzeptiert derzeit nur 1K, und der Upstream verwendet seine Standard-Bildkonfiguration
SeitenverhältnisGesteuert durch das Verhältnis-Enum, das das Modell tatsächlich unterstütztKann derzeit nicht angegeben werden; verwendet das Upstream-Standard-Seitenverhältnis
Mehrere PromptsDer Client stellt mehrere AnfragenEin Batch enthält mehrere Items
Mehrere Bilder pro ItemMehrere separate Anfragenoutput_count, standardmäßig bis zu 4
ZustandsverwaltungDer Aufrufer verfolgt es selbstEingebauter Aufgabenstatus, Details, Abbruch und Löschung
Download-MethodeBase64-DekodierungEinzelbild-Download oder ZIP
KostenPro Echtzeit-Anfrage abgerechnetSchätzen, Guthaben zurückstellen, bei Abschluss abrechnen
Am besten fürOnline-Interaktion, Qualitätstests, Performance-StresstestsGroße Offline-Produktion

20. Integrations-Checkliste

  • /v1/images/batches/models gibt mindestens ein Modell zurück;
  • der von dir verwendete API-Schlüssel gehört zu einer Gemini-Gruppe, die Batch-Bilderzeugung erlaubt;
  • die Aufgabenerstellung enthält einen eindeutigen Idempotency-Key;
  • image_size verwendet 1K;
  • alle custom_id-Werte sind eindeutig;
  • du kannst abfragen, bis completed oder ein definitiver Terminalzustand erreicht ist;
  • du kannst Erfolgs-/Fehlerdetails abfragen;
  • du kannst ein einzelnes Bild herunterladen;
  • du kannst das ZIP herunterladen und das Ergebnismanifest lesen;
  • du kannst fehlgeschlagene Items identifizieren und ein erneutes Einreichen des gesamten Batch vermeiden;
  • du hast estimated_cost, hold_amount und actual_cost verifiziert;
  • Logs zeichnen den Fehlercode und die Request-ID auf, aber nicht den vollständigen API-Schlüssel.

Nächste Schritte

Zuletzt aktualisiert:

Auf dieser Seite