Der einfachste Weg, die Bildgenerierung in großem Maßstab zu automatisieren, ohne mehrere verschiedene APIs zu verwalten, besteht darin, den Workflow vom Modellanbieter zu trennen. Legen Sie jede Bildanfrage in eine einzige Warteschlange, leiten Sie jeden Job an eine aktuelle Modell-ID weiter und senden Sie kompatible Anfragen über einen CometAPI-Schlüssel und die OpenAI-kompatible Basis-URL https://api.cometapi.com/v1.
Dieses Tutorial baut diese Pipeline in Python. Es nimmt Produkt-, Anzeigen- und Content-Jobs aus einer JSON-Lines-Warteschlange entgegen, wählt ein Modell aus, begrenzt die Parallelität, wiederholt vorübergehend fehlgeschlagene Versuche, speichert Ergebnisse entweder als URL oder Base64 und protokolliert pro Job die Nutzung sowie die geschätzten Kosten. Das Beispiel hält diese produktionsrelevanten Essentials in einem kompakten Block zusammen, damit Sie den Workflow testen können, ohne den Artikel in eine reine Codereferenz zu verwandeln.
Wie eine einheitliche Image-API die Batch-Generierung vereinfacht
Am Ende sieht der Workflow so aus:
jobs.jsonl → bounded worker pool → CometAPI /v1/images/generations → object storage → manifest.jsonl
Die Warteschlange und die Speicherschicht verbleiben bei Ihnen. Beim Wechseln der Bildmodelle ändert sich der Wert von model, nicht das Authentifizierungssystem oder die Hauptanfragestrecke. Das ist der praktische Vorteil einer einheitlichen Image-API: Die Modellauswahl wird zu einer Routing-Entscheidung innerhalb einer Pipeline statt zu einer separaten Provider-Integration.
Was brauchen Sie, um die Bildgenerierung zu automatisieren?
Sie benötigen Python 3.10 oder neuer, das Paket requests, einen CometAPI-Schlüssel, einen beschreibbaren Ausgabespeicherort und mindestens eine aktuelle Bildmodell-ID.
Installieren Sie die einzige Abhängigkeit:
pip install requests
Setzen Sie Ihren Schlüssel auf dem Server, niemals im Browser-Code oder in einem Repository:
export COMETAPI_KEY="your-key"
Die Basis-URL ist https://api.cometapi.com/v1, und kompatible Text-zu-Bild-Jobs verwenden POST /images/generations. Prüfen Sie vor einer Bereitstellung jedes Modell im Live-Modellkatalog; der Katalog liefert die aktuelle ID, den unterstützten Endpunkt, Funktions- und Preismetadata, ohne dass ein Authorization-Header erforderlich ist.
Stand: 20. August 2026, listete der Live-Katalog diese zwei nützlichen Routen:
| Workload | Model ID | Warum es passt |
|---|---|---|
| Produktbilder mit kontrollierbaren Ausgabe-Settings | gpt-image-2 | Gibt Nutzungsdaten und Base64-Bildinhalt über die dokumentierte OpenAI-kompatible Route zurück |
| Hochvolumige Anzeigen- und Content-Konzepte | doubao-seedream-4-5-251128 | Verwendet dieselbe Generierungsroute und ist mit Preis pro Anfrage gelistet |
Die Tabelle ist ein Ausgangspunkt, nicht die Aussage, dass die Modelle identische Fähigkeiten besitzen. Größe, Qualität, Format, Referenzbild-Unterstützung und das Antwortverhalten bleiben modellspezifisch. Prüfen Sie den Modelleintag und die verlinkte Dokumentation, bevor Sie optionale Parameter übergeben.
Wie Sie einen Batch-Workflow für Bildgenerierung in Python aufbauen
1. Geben Sie jedem Job eine dauerhafte ID
Verwenden Sie ein JSON-Objekt pro Zeile, damit eine Warteschlange, ein Datenbankexport oder ein Tabellenjob denselben Worker speisen kann:
{"id":"sku-1001","kind":"product","prompt":"Studio product photo of a ceramic coffee dripper on a warm neutral background"}
{"id":"campaign-204","kind":"ad","prompt":"Editorial summer travel image, vivid natural light, wide composition, no text"}
{"id":"blog-088","kind":"content","prompt":"Minimal illustration of a developer automating a creative workflow, no text"}
Die ID wird zum Ausgabedateinamen und zum Manifest-Schlüssel. In der Produktion nutzen Sie sie als Idempotency-Key und überspringen IDs, die bereits als erfolgreich markiert sind, bevor Sie eine Warteschlange erneut verarbeiten.
2. Routen Sie nach Jobtyp und validieren Sie anschließend gegen den Live-Katalog
Das Beispiel ordnet Produktarbeit gpt-image-2 zu und Anzeigen- oder Content-Arbeit doubao-seedream-4-5-251128 zu. Ein Job kann diese Auswahl mit seinem eigenen Feld model überschreiben. Beim Start lädt der Worker den öffentlichen Katalog herunter und verwirft eine ID, die nicht mehr gelistet ist.
Das ist sicherer, als einen anbieterspezifischen SDK überall in der Anwendung hart zu kodieren. Sie können eine Route in einer Zuordnung ändern, nachdem Sie Qualität, Latenz und Preis für Ihre eigenen Prompts bewertet haben.
3. Begrenzen Sie die Parallelität statt den gesamten Batch zu starten
Der Worker beginnt mit vier gleichzeitigen Anfragen. Diese Zahl ist eine konservative Anwendungseinstellung, kein universelles Servicelimit. Messen Sie Latenz und 429-Antworten für Ihr Konto und erhöhen oder verringern Sie MAX_WORKERS gezielt.
Nur 408, 429 und 5xx-Antworten werden mit exponentiellem Backoff und Jitter wiederholt. Authentifizierungsfehler, ungültige Modell-IDs und nicht unterstützte Parameter schlagen sofort fehl, da das Wiederholen derselben fehlerhaften Anfrage nur Verzögerungen hinzufügt.
4. Normalisieren Sie das Ergebnis vor der Speicherung
Bildmodelle liefern nicht immer dasselbe Containerformat. Die dokumentierte GPT Image-Antwort enthält data[0].b64_json; andere kompatible Modelle liefern möglicherweise data[0].url. Der Worker unterstützt beides, schreibt das Bild zunächst in eine temporäre Datei und benennt sie erst um, nachdem der Download oder das Decodieren erfolgreich war.
Ersetzen Sie in der Produktion das lokale Verzeichnis output/ durch S3, R2, GCS oder einen anderen Objektspeicher. Behandeln Sie eine providergehostete URL nicht als dauerhafte Speicherung, sofern deren Aufbewahrungsrichtlinie dies nicht ausdrücklich zusichert.
5. Protokollieren Sie Nutzung, Versuche und geschätzte Kosten
Jedes Ergebnis wird zu einer kompakten Manifestzeile mit Job-ID, Modell, gespeichertem Pfad, Status und geschätzten Kosten in USD, sofern der Live-Katalog genügend Preisdaten liefert. Fehlgeschlagene Jobs behalten den Fehler statt aus dem Batch zu verschwinden.
Vollständiges Python-Skript für Batch-Bildgenerierung
Speichern Sie Folgendes als batch_image_pipeline.py, legen Sie die Warteschlange daneben als jobs.jsonl ab und führen Sie python3 batch_image_pipeline.py aus.
import base64, json, os, random, time
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
import requests
BASE_URL = "https://api.cometapi.com/v1"
KEY = os.environ["COMETAPI_KEY"]
WORKERS = int(os.getenv("MAX_WORKERS", "4"))
OUT = Path("output")
ROUTES = {
"product": "gpt-image-2",
"ad": "doubao-seedream-4-5-251128",
"content": "doubao-seedream-4-5-251128",
}
catalog = requests.get("https://api.cometapi.com/api/models", timeout=30)
catalog.raise_for_status()
CATALOG = {model["id"]: model for model in catalog.json()["data"]}
def generate(job):
model = job.get("model", ROUTES[job["kind"]])
if model not in CATALOG:
raise ValueError(f"Unknown model: {model}")
payload = {"model": model, "prompt": job["prompt"], "n": 1}
if model == "gpt-image-2":
payload.update(quality="low", size="1024x1024", output_format="jpeg")
for attempt in range(4):
response = requests.post(
f"{BASE_URL}/images/generations",
headers={"Authorization": f"Bearer {KEY}"},
json=payload,
timeout=180,
)
if response.status_code not in {408, 429} and response.status_code < 500:
break
time.sleep(2**attempt + random.random())
response.raise_for_status()
body = response.json()
item = body["data"][0]
if item.get("b64_json"):
data = base64.b64decode(item["b64_json"])
extension = body.get("output_format", "png")
else:
download = requests.get(item["url"], timeout=120)
download.raise_for_status()
data = download.content
extension = {"image/png": "png", "image/webp": "webp"}.get(
download.headers.get("content-type"), "jpg"
)
path = OUT / f"{job['id']}.{extension}"
path.write_bytes(data)
price, usage = CATALOG[model].get("pricing") or {}, body.get("usage", {})
cost = price.get("per_request")
if cost is None and price.get("input") is not None:
cost = (usage.get("input_tokens", 0) * price["input"] +
usage.get("output_tokens", 0) * price["output"]) / 1_000_000
return {"id": job["id"], "model": model, "path": str(path),
"estimated_usd": cost * price.get("ratio", 1) if cost is not None else None}
def safe_generate(job):
try:
return {"status": "success", **generate(job)}
except Exception as error:
return {"id": job["id"], "status": "failed", "error": str(error)}
OUT.mkdir(exist_ok=True)
jobs = [json.loads(line) for line in Path("jobs.jsonl").read_text().splitlines() if line]
with ThreadPoolExecutor(max_workers=WORKERS) as pool:
results = list(pool.map(safe_generate, jobs))
with (OUT / "manifest.jsonl").open("w") as manifest:
manifest.writelines(json.dumps(result) + "\n" for result in results)
Das Skript verwendet zur Laufzeit den aktuellen Katalog, während die zwei Fallback-Zuordnungen Beispiele sind, die am 20. August 2026 verifiziert wurden. Prüfen Sie sie erneut, bevor Sie den Code an einem anderen Datum veröffentlichen oder bereitstellen.
Wie Sie den Batch-Workflow zur Bildgenerierung testen
Beginnen Sie mit einem Job und einem Worker:
MAX_WORKERS=1 python3 batch_image_pipeline.py
Eine erfolgreiche GPT Image-Antwort hat diese Struktur:
{
"created": 1776841943,
"output_format": "jpeg",
"quality": "low",
"size": "1024x1024",
"usage": {
"input_tokens": 16,
"output_tokens": 208,
"total_tokens": 224
},
"data": [{"b64_json": "<base64-image-data>"}]
}
Der Worker decodiert das Bild, schreibt output/<job-id>.jpeg und fügt output/manifest.jsonl eine Erfolgszeile hinzu. Gibt ein Modell stattdessen eine URL zurück, lädt der Worker sie herunter und speichert den lokalen Pfad im gleichen Manifestformat.
Der Code wurde lokal auf Syntax geprüft. Für einen Live-Generierungsaufruf ist weiterhin Ihr CometAPI-Schlüssel erforderlich. Führen Sie daher den Smoke-Test mit einem Job aus, bevor Sie die Parallelität erhöhen.
Wie viel kostet die Batch-Bildgenerierung?
Preise müssen mit Zeitstempel versehen sein, da sich Modelltarife ändern. Stand: 20. August 2026, lieferte der Live-CometAPI-Modellkatalog die folgenden Basispreisfelder und ein Abrechnungsverhältnis von 0.8:
gpt-image-2: 5 $ pro 1 Mio. Input-Tokens und 30 $ pro 1 Mio. Output-Tokens; mit dem gelisteten Verhältnis ergeben sich effektive Sätze von 4 $ bzw. 24 $ pro 1 Mio. Tokens.doubao-seedream-4-5-251128: 0,04 $ pro Anfrage; mit dem gelisteten Verhältnis ergeben sich 0,032 $ pro Anfrage.
Der CometAPI-Preisleitfaden erläutert die tokenbasierte Abrechnung für Modelle mit offizieller Preisstellung und die aufrufbasierte Abrechnung für Modelle mit Preis pro Anfrage. Das Skript liest den Katalog zur Laufzeit und verwendet dieselbe Regel:
token cost = ratio × (input tokens × input rate + output tokens × output rate) / 1,000,000
request cost = ratio × per-request price
Beispielsweise meldet die oben dokumentierte GPT Image-Antwort 16 Input-Tokens und 208 Output-Tokens. Mit den Katalogwerten vom 20. August ergibt dieses illustrative Ergebnis eine Schätzung von etwa 0,005056 $. Der tatsächliche Gesamtbetrag hängt von Modell, Qualität, Größe, Prompt, Retries und der gemeldeten Nutzung ab. Betrachten Sie die API-Antwort und das Nutzungs-Dashboard Ihres Kontos als Abrechnungsnachweis, nicht eine feste Pro-Bild-Annahme.
Planen Sie auch erfolglose Arbeit ein. Ein Retry nach einem unbestätigten Timeout kann ein zweites kostenpflichtiges Ergebnis erzeugen, und ein technisch erfolgreiches Bild, das die Prüfung nicht besteht, verbraucht trotzdem Budget. Verfolgen Sie sowohl API-Kosten als auch die Annahmequote:
effective cost per accepted image = total batch spend / approved images
Häufige Fehler bei Image-Generation-APIs und wie man sie behebt
| Symptom | Wahrscheinliche Ursache | Lösung |
|---|---|---|
| 401 | Fehlender oder ungültiger Schlüssel | Serverseitigen COMETAPI_KEY prüfen |
| 400 | Ungültiges Modell oder nicht unterstützte Option | Live-Katalog erneut prüfen und modellspezifische Felder entfernen |
| 429 | Zu hohe Parallelität | MAX_WORKERS verringern und exponentielles Backoff beibehalten |
| Wiederholte 5xx | Vorübergehender Upstream-Fehler | Mit Limit erneut versuchen, dann Job in eine Dead-Letter-Queue verschieben |
| Kein gespeichertes Bild | Antwort verwendete einen anderen Container | data[0] inspizieren und entweder b64_json oder url unterstützen |
| Doppelte Kosten | Job wurde nach partiellem Fehler erneut abgespielt | Dauerhafte IDs verwenden und erst nach erfolgreicher Speicherung bestätigen |
Versuchen Sie nicht, jeden Fehler zu wiederholen. Eine permanente 400-Anfrage bleibt ungültig, während eine unbegrenzte 429-Retry-Schleife einen Traffic-Spike in einen Rückstau verwandeln kann.
Best Practices für Bildgenerierung in der Produktion im großen Maßstab
Wechseln Sie von JSON Lines zu einer dauerhaften Warteschlange, wenn mehrere Worker beteiligt sind. Setzen Sie ein Visibility-Timeout, das länger als die maximale Generierungszeit ist, bestätigen Sie einen Job erst, nachdem Bild und Manifest gespeichert sind, und senden Sie erschöpfte Jobs zur Prüfung in eine Dead-Letter-Queue.
Halten Sie optionale Steuerungen in modellspezifischer Konfiguration. Eine gemeinsame Payload sollte nur gemeinsame Felder wie model, prompt und n: 1 enthalten; fügen Sie quality, size oder output_format erst hinzu, nachdem die Dokumentation des ausgewählten Modells diese bestätigt. Wenn Sie Fallback-Routing hinzufügen, wählen Sie ein Modell, das dieselbe Aufgabe unterstützt, und bauen Sie die Payload für dieses Modell neu, statt anbieterspezifische Optionen blind zu wiederholen.
Speichern Sie den API-Schlüssel in einem Secret Manager, beschränken Sie die Prompt-Eingabe, scannen Sie generierte Assets gemäß Ihrer Richtlinie und halten Sie Provider-URLs aus langfristigen Produktdatensätzen heraus. Protokollieren Sie Job-ID, Modell-ID, Latenz, Versuche, Nutzung, Speicherpfad, Prüfergebnis und das Datum des Katalog-Snapshots. Diese Felder ermöglichen den Vergleich von Modellen anhand der Kosten pro akzeptiertem Bild statt nur des Preises pro Aufruf.
Setzen Sie schließlich Budget-Leitplanken: eine maximale Batchgröße, ein Retry-Limit pro Job, eine tägliche Ausgabenwarnung und eine Stop-Bedingung, wenn die Freigaberate sinkt. Ein schlechtes Prompt schneller zu skalieren, ist keine Optimierung.
FAQs zur Automatisierung der Bildgenerierung im großen Maßstab
Was ist der einfachste Weg, Bildgenerierung im großen Maßstab zu automatisieren, ohne mehrere APIs zu verwalten?
Verwenden Sie eine einzige Warteschlangen- und Speicher-Workflow, und senden Sie dann kompatible Bildanfragen über einen CometAPI-Schlüssel und https://api.cometapi.com/v1/images/generations. Ändern Sie die Modell-ID in Ihrer Routing-Schicht, statt separate Authentifizierungen und Provider-SDKs zu pflegen.
Kann ich eine Anfrage senden und mehrere Bildmodelle gleichzeitig generieren lassen?
Das Beispiel sendet ein Modell pro Job. Fan-out ist ein Anwendungs-Workflow: Duplizieren Sie einen Job mit unterschiedlichen IDs und Modellwerten und vergleichen Sie dann die gespeicherten Ausgaben. So bleiben Kosten und Prüfstatus jedem Modell zuordenbar.
Welche Parallelität sollte ich verwenden?
Es gibt keine universelle Zahl für jedes Konto und jedes Modell. Beginnen Sie mit einem kleinen begrenzten Pool wie vier Workern, überwachen Sie Latenz und 429-Antworten und optimieren Sie evidenzbasiert.
Sollte ich die zurückgegebene URL oder das Bild selbst speichern?
Speichern Sie das Bild in Ihrem eigenen Objektspeicher. Eine zurückgegebene URL kann temporär sein, während GPT Image-Modelle möglicherweise Base64-Inhalt statt einer URL zurückgeben.
Wie wähle ich das günstigste Modell?
Berechnen Sie die Kosten pro akzeptiertem Bild, nicht nur den Preis pro Aufruf. Berücksichtigen Sie Token- oder Anfragegebühren, Retries, fehlgeschlagene Downloads, abgelehnte Assets, Nachbearbeitung und manuelle Prüfung. Prüfen Sie den Live-Modellkatalog an dem Tag, an dem Sie veröffentlichen oder bereitstellen.
Wo sollte ich Endpunkt und Antwortformat verifizieren?
Verwenden Sie den CometAPI-Quickstart, die Modellkatalog-Dokumentation, die Image-Generierungsreferenz und den Preisleitfaden.