Preise+7% Bonus

Mehrere Bilder gleichzeitig in ChatGPT generieren

Erfahren Sie, wie Sie mit der GPT Image 2 API mithilfe von Python, CSV-Dateien, sicherer Parallelverarbeitung, erneuten Versuchen, Base64-Decodierung und Kostenkontrollen Produktbilder in großen Mengen generieren.

Mehrere Bilder gleichzeitig in ChatGPT generieren

Stellen Sie sich vor, Sie haben eine Tabelle mit 100 Produkten. Jede Zeile enthält einen Produktnamen, eine Farbe, ein Material und den bevorzugten Kamerawinkel. Statt diese Angaben 100-mal in ChatGPT zu kopieren, können Sie ein Python-Skript die Tabelle auslesen und für jede Zeile ein Produktbild anfordern lassen.

Genau das bedeutet „Massenhafte Produktbildgenerierung“ in diesem Leitfaden. Es ist etwas anderes, als zehn Varianten eines einzelnen Bildes anzufordern. Für jedes Produkt gibt es einen eigenen Prompt, eine Aufgaben-ID, eine Ausgabedatei und einen Statuseintrag.

Sie erstellen diesen Workflow mit Python und der GPT Image 2 API von GPTProto. Sie benötigen keine Vorkenntnisse mit Bild-APIs. Das fertige Skript liest einen CSV-Katalog ein, prüft die Bildgröße, verarbeitet jeweils einige Produkte, lädt die Ergebnisse herunter und merkt sich bereits abgeschlossene Aufgaben. So werden bei einem Neustart nicht erneut Bilder für dieselben Produkte erstellt.

Kurz gesagt:

  1. Verwenden Sie für jeden individuellen Produkt-Prompt n=1.

  2. Reichen Sie mehrere unterschiedliche SKU-Aufträge über einen kleinen Worker-Pool ein.

  3. Speichern Sie die zurückgegebene Vorhersage-ID, bevor Sie auf das Bild warten.

  4. Laden Sie temporäre Ausgabe-URLs herunter, sobald ein Auftrag abgeschlossen ist.

  5. Setzen Sie die Verarbeitung anhand des Manifests fort, statt erfolgreiche Produkte erneut einzureichen.

Machen Sie sich keine Sorgen, wenn Ihnen Begriffe wie „Vorhersage-ID“, „Polling“ oder „Manifest“ unbekannt sind. Sie werden weiter unten erklärt, bevor das vollständige Skript vorgestellt wird.

Inhaltsverzeichnis

Das haben Sie am Ende

Sie beginnen mit zwei Dateien:

  • products.csv: eine tabellenähnliche Liste der Produkte, die Sie verarbeiten möchten.

  • bulk_product_images.py: das Python-Skript aus dieser Anleitung.

Beim Ausführen des Skripts werden automatisch zwei weitere Elemente erstellt:

  • generated/: ein Ordner mit Dateien wie MUG-001-01.png.

  • manifest.json: ein Protokoll, das zeigt, welche Produkte verarbeitet wurden, fehlgeschlagen sind oder noch überprüft werden müssen.

Der Ablauf ist einfach:

products.csv → Python-Skript → GPT Image 2 API → heruntergeladene Bilder
                         ↘ manifest.json

Beginnen Sie mit den drei Beispielprodukten in dieser Anleitung. Sobald alles funktioniert, ersetzen Sie die Beispielzeilen durch Ihren echten Produktkatalog.

Begriffe für Einsteiger in dieser Anleitung

Begriff Einfache Erklärung
API Eine Möglichkeit für Ihr Skript, Anweisungen an GPT Image 2 zu senden, ohne ein Chatfenster zu verwenden.
API-Schlüssel Ein privates Passwort, das Ihr GPT Proto-Konto identifiziert und die API-Nutzung autorisiert.
SKU Ihr eigener eindeutiger Code für ein Produkt, etwa MUG-001. Er wird auch im Namen der Ausgabedatei verwendet.
Anfrage Eine einzelne Nachricht, die das Skript an die API sendet. In diesem Workflow löst ein Produkt normalerweise eine Generierungsanfrage aus.
Aufgaben- oder Prediction-ID Die Empfangsnummer, die nach der Annahme einer Generierungsanfrage zurückgegeben wird. Das Skript verwendet sie, um das Ergebnis abzufragen.
Abfragen (Polling) Alle paar Sekunden beim Ergebnis-Endpunkt nachfragen, ob eine Aufgabe abgeschlossen ist.
Parallelität Die Anzahl der Produkte, die gleichzeitig verarbeitet werden. Drei Worker bedeuten bis zu drei aktive Aufträge.
Manifest Ein lokales Protokoll mit jeder SKU, Aufgaben-ID, jedem Ergebnis und Fehler. Damit kann ein angehaltenes Skript sicher fortgesetzt werden.
Base64 Bilddaten, die als lange Textzeichenfolge dargestellt werden. Sie müssen dekodiert werden, bevor daraus eine normale Bilddatei wird.

Der API-Ablauf ähnelt dem Abholen einer Restaurantbestellung. Mit der ersten Anfrage geben Sie die Bestellung auf. Die zurückgegebene Aufgaben-ID ist Ihre Abholnummer. Durch Abfragen prüfen Sie, ob die Bestellung fertig ist. Unter der Ausgabe-URL können Sie das fertige Produkt abrufen. Das Manifest ist Ihr Quittungsbuch.

Kann ChatGPT mehrere Produktbilder auf einmal generieren?

ChatGPT kann im Laufe eines Gesprächs mehrere Bilder erstellen und eignet sich daher gut, um Ideen visuell auszuloten und eine kleine Anzahl manueller Variationen zu erstellen. Als zuverlässige Pipeline für einen Produktkatalog ist es jedoch nicht geeignet: Es gibt keine CSV-Warteschlange, keine stabile Zuordnung von SKUs zu Dateien, keine Parallelitätssteuerung und kein Wiederholungsmanifest.

Die API ist besser geeignet, wenn Sie wissen möchten: „Wie erstelle ich mehrere Produktbilder und erkenne, welche Datei zu welchem Produkt gehört?“

Anforderung ChatGPT-Oberfläche GPT Image 2 API-Workflow
Ein Konzept erkunden Gut geeignet Möglich, aber mit mehr Einrichtungsaufwand
Einen CSV-Katalog verarbeiten Manuell Automatisiert
Pro SKU einen anderen Prompt verwenden Wiederholungsaufwand Aus jeder Zeile wird eine Anfrage
Dateinamen und Ordner steuern Manueller Download Eindeutige Benennung
Fehlgeschlagene Aufgaben fortsetzen Manuelle Prüfung Auf Manifestbasis
Mit einem DAM, PIM oder Shop integrieren Eingeschränkt Für die Integration per Code ausgelegt

Suchanfragen wie „ChatGPT generate multiple images at once“ vermischen oft zwei unterschiedliche Ziele: mehrere Variationen eines Prompts und viele Bilder für verschiedene Produkte. Diese Unterscheidung ist wichtig, sobald Kosten, Dateizuordnung und erneute Durchläufe ins Spiel kommen.

Was mit „GPT Image 2 API Batch“ gemeint sein kann

Mit „Batch“ sind meist drei unterschiedliche Abläufe gemeint:

1. Mehrere Variationen aus einem Prompt

Legen Sie n auf einen Wert zwischen 1 und 10 fest. Das ist nützlich, wenn ein Designer mehrere Optionen für dasselbe Produkt und dieselbe Komposition haben möchte. Dadurch werden jedoch keine produktspezifischen Prompts für zehn SKUs erstellt.

2. Mehrere unabhängige Anfragen gleichzeitig

Lesen Sie mehrere Produkte aus einer Datei ein und senden Sie pro Zeile eine Anfrage. Ein kleiner ThreadPoolExecutor ermöglicht kontrollierte Parallelität. Diesen Ablauf verwenden wir in dieser Anleitung, da jedes Produkt einen eigenen Namen, eine eigene Farbe, ein eigenes Material sowie einen eigenen Winkel und Hintergrund haben kann.

3. Die asynchrone Batch API von OpenAI

Die direkte Batch API von OpenAI akzeptiert JSONL-Anfragedateien, verwendet einen separaten Ratenbegrenzungs-Pool, bietet 50 % Rabatt und wird innerhalb eines Zeitfensters von 24 Stunden abgeschlossen. Im Leitfaden zur OpenAI Batch API werden /v1/images/generations und /v1/images/edits als unterstützte Endpunkte aufgeführt.

Das ist eine separate OpenAI-Funktion. Gehen Sie nicht davon aus, dass es denselben JSONL-Batch-Endpunkt auch bei GPT Proto gibt. Der folgende GPT Proto-Workflow verwendet den dokumentierten Bild-Endpunkt und die Route für den Vorhersagestatus.

Was Sie benötigen

Sie benötigen einen Computer, Python 3, einen GPT Proto-API-Schlüssel und einen Texteditor. Visual Studio Code ist praktisch, aber jeder Editor, der reine Textdateien speichern kann, ist geeignet.

1. Prüfen, ob Python installiert ist

Öffnen Sie unter macOS oder Linux das Terminal oder unter Windows PowerShell und führen Sie Folgendes aus:

python --version

Wenn Windows meldet, dass python nicht erkannt wird, versuchen Sie Folgendes:

py --version

Ein Ergebnis wie Python 3.11.8 bedeutet, dass Python einsatzbereit ist. Wenn keiner der Befehle funktioniert, installieren Sie eine aktuelle Python-3-Version und aktivieren Sie die Option, Python zum Systempfad hinzuzufügen.

2. Projektordner erstellen

Erstellen Sie einen Ordner mit dem Namen gpt-image-bulk. Erstellen Sie darin diese zwei leeren Dateien:

  • bulk_product_images.py

  • products.csv

Fügen Sie das vollständige Python-Skript aus dieser Anleitung in die erste Datei ein. Fügen Sie die unten gezeigte Beispiel-CSV in die zweite Datei ein. Beide Dateien müssen sich im selben Ordner befinden, sofern Sie die Pfade im Skript nicht ändern.

3. API-Schlüssel erstellen und speichern

Erstellen Sie ein Konto bei GPT Proto, laden Sie Guthaben auf und generieren Sie einen API-Schlüssel. Behandeln Sie den API-Schlüssel wie ein Passwort. Veröffentlichen Sie ihn nicht in einem Artikel, laden Sie ihn nicht auf GitHub hoch und fügen Sie ihn nicht direkt in die Python-Datei ein.

Speichern Sie den Schlüssel vorübergehend in einer Umgebungsvariablen. Führen Sie unter macOS oder Linux Folgendes aus:

export GPTPROTO_API_KEY="your-key-here"

Führen Sie in der Windows-PowerShell Folgendes aus:

$env:GPTPROTO_API_KEY="your-key-here"

Die Variable bleibt normalerweise bis zum Schließen des aktuellen Terminalfensters bestehen. Wenn Sie das Fenster schließen und ein neues öffnen, müssen Sie sie vor dem Ausführen des Skripts erneut festlegen.

4. Das einzige benötigte Python-Paket installieren

Das Skript verwendet requests, um mit der API zu kommunizieren und Bilder herunterzuladen. Installieren Sie das Paket mit:

python -m pip install requests

Windows-Nutzer, die den Befehl py benötigen, sollten stattdessen py -m pip install requests ausführen.

5. Produkte zur CSV-Datei hinzufügen

CSV bedeutet „Comma-Separated Values“ (durch Kommas getrennte Werte). Es handelt sich um ein einfaches Tabellenformat, das Excel, Google Sheets und die meisten Katalogtools exportieren können. Fügen Sie pro Zeile ein Produkt hinzu:

Erstellen Sie products.csv mit einer Zeile pro Produkt:

sku,name,color,material,angle,background,avoid
MUG-001,Stackable coffee mug,matte navy,stoneware,three-quarter,soft warm gray,steam or hands
BAG-014,Compact crossbody bag,forest green,pebbled leather,front three-quarter,light beige,props or a model
LAMP-207,Portable table lamp,cream,powder-coated aluminum,front,clean white,visible cable or extra objects

Jede Spalte hat eine Aufgabe:

Spalte Eintrag Beispiel
sku Ein eindeutiger Produktcode MUG-001
name Ein kurzer Produktname Stackable coffee mug
color Die genaue sichtbare Farbe oder Oberfläche matte navy
material Das hauptsächlich sichtbare Material stoneware
angle Die gewünschte Kameraperspektive three-quarter
background Der Kataloghintergrund soft warm gray
avoid Objekte oder Fehler, die im Bild nicht vorkommen sollen steam or hands

Behalten Sie die Kopfzeile genau wie gezeigt bei, da das Python-Skript nach diesen Spaltennamen sucht. Jede SKU muss eindeutig sein. Wenn ein Produktname oder ein Feld ein Komma enthält, exportieren Sie die Datei aus einem Tabellenprogramm, damit der Wert korrekt in Anführungszeichen gesetzt wird.

Verwenden Sie kurze, sachliche Angaben, statt in jeder Zeile einen anderen langen Prompt zu verfassen. Das Skript kombiniert die Felder mit denselben Fotoregeln, sodass der Katalog ein einheitliches Erscheinungsbild erhält.

Schritt 1: Einen wiederverwendbaren Produkt-Prompt erstellen

Ein Produkt-Prompt sollte veränderliche Angaben zur SKU von Regeln trennen, die für den gesamten Katalog gelten. So lassen sich Änderungen am Prompt zuverlässig bewerten: Ändern Sie die gemeinsame Vorlage einmal, erstellen Sie einen kleinen Testsatz neu und vergleichen Sie ihn mit der vorherigen Version.

def build_prompt(row):
    return f"""Create one catalog product photograph.
Product: {row['name']}
Color: {row['color']}
Material: {row['material']}
View: {row['angle']}
Background: {row['background']}

Keep the product centered with realistic proportions and material texture.
Use soft studio lighting, a natural contact shadow, and generous crop-safe space.
No text, logos, labels, people, or extra objects.
Also avoid: {row.get('avoid', 'none')}.
Return a single product image, not a collage or contact sheet."""

Sie müssen diese Funktion nicht für jedes Produkt bearbeiten. Wenn das Skript die Tassenzeile einliest, wird aus {row['name']} der Wert Stackable coffee mug; beim Einlesen der Taschenzeile wird derselbe Platzhalter zu Compact crossbody bag. Das nennt man eine Vorlage: Die Struktur bleibt gleich, während sich die Produktdaten ändern.

Die Anweisung „ein einzelnes Produktbild“ hilft zu verhindern, dass ein Modell aus einer Anfrage eine Collage macht. Die gemeinsamen Vorgaben zu Kameraperspektive, Bildausschnitt, Beleuchtung, Schatten und Hintergrund sorgen dafür, dass die Produkte wie ein einheitlicher Katalog und nicht wie zusammenhanglose Bilder wirken.

Wenn die ersten Ergebnisse uneinheitlich sind, bearbeiten Sie zuerst die gemeinsamen Regeln. Ersetzen Sie beispielsweise „großzügiger, für den Bildzuschnitt geeigneter Freiraum“ durch „das Produkt sollte etwa 75 % der quadratischen Bildfläche ausfüllen“. Testen Sie diese Änderung mit drei unterschiedlichen Produkttypen, bevor Sie sie auf die gesamte Datei anwenden.

Bei echten Markenprodukten eignet sich Text-zu-Bild am besten für Konzeptaufnahmen oder allgemeine Waren. Wenn exakte Geometrie, Verpackung oder Etikettenposition wichtig sind, verwenden Sie die Bildbearbeitung mit freigegebenen Produktreferenzen. Dieser Ablauf wird später beschrieben.

Schritt 2: Ein Produkt testen, bevor Sie die Warteschlange starten

Beginnen Sie mit einem Produkt, n=1, quality="low" und einer gängigen Größe wie 1024x1024. Eine niedrige Qualität eignet sich, um die Komposition zu prüfen, bevor Sie für Generierungen in endgültiger Qualität bezahlen.

Der folgende cURL-Befehl ist ein kleiner API-Test. cURL ist ein Befehlszeilentool, das eine Webanfrage sendet. Dieser genaue Befehl verwendet Bash-Syntax. Fügen Sie ihn nach dem Festlegen Ihres API-Schlüssels in das Terminal unter macOS oder Linux ein. Einsteiger unter Windows können den manuellen cURL-Test überspringen und später in dieser Anleitung das plattformübergreifende Python-Skript verwenden.

curl --request POST \
  --url "https://gptproto.com/api/v3/openai/gpt-image-2/text-to-image" \
  --header "Authorization: Bearer $GPTPROTO_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
    "prompt": "A centered matte navy stoneware coffee mug, three-quarter catalog view, soft studio light, warm gray background, natural contact shadow, no text or props",
    "n": 1,
    "quality": "low",
    "size": "1024x1024",
    "enable_sync_mode": false,
    "response_format": "url"
  }'

Hier erfahren Sie, was die wichtigsten Zeilen bedeuten:

Feld Bedeutung
Authorization Sendet Ihren privaten API-Schlüssel, damit GPT Proto erkennt, welches Konto die Anfrage stellt.
prompt Beschreibt das gewünschte Produktbild.
n: 1 Fordert ein Ergebnis für diesen Prompt an.
quality: low Verwendet für den ersten Test die kostengünstigere Entwurfseinstellung.
size: 1024x1024 Fordert ein quadratisches Bild an.
enable_sync_mode: false Gibt zuerst eine Aufgabenbestätigung zurück, statt die Anfrage offenzuhalten, bis die Generierung abgeschlossen ist.
response_format: url Gibt einen Download-Link zurück, sobald das Bild fertig ist.

Eine erfolgreiche erste Antwort ist ein JSON-Objekt mit einer Prediction-ID in data.id. JSON ist ein strukturiertes Textformat, das von APIs verwendet wird. Es kann etwa so aussehen:

{
  "data": {
    "id": "abc123",
    "status": "created",
    "urls": {
      "get": "https://gptproto.com/api/v3/predictions/abc123/result"
    }
  }
}

Diese Antwort ist nicht das Bild. Sie bestätigt, dass der Auftrag angenommen wurde. Kopieren Sie die tatsächlich zurückgegebene ID und fragen Sie das Ergebnis ab:

curl --request GET \
  --url "https://gptproto.com/api/v3/predictions/abc123/result" \
  --header "Authorization: Bearer $GPTPROTO_API_KEY"

Ersetzen Sie abc123 durch Ihre Aufgaben-ID. Wenn data.status noch created oder processing lautet, warten Sie einige Sekunden und führen Sie den GET-Befehl erneut aus. Sobald der Status completed lautet, enthält data.outputs die generierte Ausgabe. Das vollständige Python-Skript führt diese Prüfungen automatisch aus. Sie müssen diesen manuellen Ablauf also nicht für jedes Produkt wiederholen.

Die aktuellen Anfrage- und Antwortfelder finden Sie in der GPT Proto-Referenz für GPT Image 2 Text-zu-Bild.

Starten Sie die Generierung für den gesamten Katalog erst, wenn ein Produkt diese Prüfungen besteht:

  • Der Bildausschnitt lässt genügend Platz für alle Verwendungszwecke im Shop.

  • Farbe und Material stimmen für den vorgesehenen Verwendungszweck ausreichend genau.

  • Hintergrund und Kontaktschatten passen zum Katalogstil.

  • Es erscheinen keine erfundenen Logos, Etiketten, Requisiten oder doppelten Produkte.

  • Die Ergebnisroute und der Download-Code funktionieren beide in Ihrer Umgebung.

Wenn der Test 401 Unauthorized zurückgibt, prüfen Sie zuerst den API-Schlüssel und den Authorization-Header. Bei einer Antwort mit 403 prüfen Sie den Modellzugriff und das Kontoguthaben. Fahren Sie erst mit dem gesamten Katalog fort, wenn dieser Test mit einem einzelnen Produkt erfolgreich war.

Schritt 3: Fehler „Size Must Be a Multiple of 16“ vermeiden

GPT Image 2 unterstützt gängige Voreinstellungen und gültige benutzerdefinierte Abmessungen. Bei benutzerdefinierten Größen müssen beide Kanten durch 16 teilbar sein, die längste Kante darf 3.840 Pixel nicht überschreiten, das Seitenverhältnis darf höchstens 3:1 betragen und das Bild muss zwischen 655.360 und 8.294.400 Pixel enthalten. Ausgaben mit einer Gesamtauflösung über 2560×1440 sind in der API-Dokumentation als experimentell gekennzeichnet.

„Beide Kanten müssen durch 16 teilbar sein“ bedeutet, dass sowohl Breite als auch Höhe ohne Rest durch 16 teilbar sein müssen. Zahlen wie 1024, 1200, 1536 und 2048 erfüllen diese Bedingung. 1000 dagegen nicht. Die Regel gilt sowohl für die Breite als auch für die Höhe, nicht nur für die längste Seite.

Validieren Sie die Größe, bevor Sie eine kostenpflichtige Anfrage senden:

def validate_size(size):
    if size == "auto":
        return

    width, height = map(int, size.lower().split("x"))
    pixels = width * height

    if width % 16 or height % 16:
        raise ValueError("GPT Image 2 width and height must be multiples of 16")
    if max(width, height) > 3840:
        raise ValueError("The longest edge cannot exceed 3840 pixels")
    if max(width, height) / min(width, height) > 3:
        raise ValueError("Aspect ratio cannot exceed 3:1")
    if not 655_360 <= pixels <= 8_294_400:
        raise ValueError("Total pixels are outside the supported range")

1200x1200 ist gültig, da beide Seiten durch 16 teilbar sind. 1000x1000 ist es nicht. Wenn Ihr Shop am Ende 1000x1000 benötigt, generieren Sie das Bild mit 1024x1024 und ändern Sie die Größe nach der Freigabe.

Zu den unterstützten Voreinstellungen zählen 1024x1024, 1536x1024, 1024x1536, 2048x2048, 2048x1152, 3840x2160 und 2160x3840.

Schritt 4: Kontrollierte Parallelität statt einer unbegrenzten Schleife verwenden

Parallelität bezeichnet die Anzahl der Produkte, an denen das Skript gleichzeitig arbeitet. Stellen Sie sich die Worker wie Kassen vor: Ein Worker verarbeitet jeweils ein aktives Produkt, drei Worker können bis zu drei Produkte gleichzeitig durch das System schleusen.

Eine Schleife, die Hunderte Worker startet, kann Ratenbegrenzungen auslösen, Speicher verbrauchen und die Fehlerbehebung erschweren. Beginnen Sie mit zwei oder drei. Erhöhen Sie den Wert erst, nachdem Sie das Verhalten des Kontos und die Bearbeitungszeiten geprüft haben.

from concurrent.futures import ThreadPoolExecutor, as_completed

with ThreadPoolExecutor(max_workers=3) as pool:
    futures = [pool.submit(process_product, row) for row in products]
    for future in as_completed(futures):
        print(future.result())

Sie müssen Python-Threads nicht verstehen, um dieses Beispiel zu verwenden. max_workers=3 ist die wichtige Einstellung. Wenn wiederholt 429-Fehler auftreten, reduzieren Sie den Wert auf 2 oder 1. Wenn ein längerer Test ohne Ratenbegrenzungsfehler läuft, können Sie vorsichtig einen höheren Wert ausprobieren.

Die veröffentlichten Ratenbegrenzungen des Modellanbieters entsprechen nicht automatisch denen eines Kontos bei einer vermittelnden API. Behandeln Sie 429 Too Many Requests und den zugehörigen Header Retry-After als maßgeblich für den aktiven GPT Proto-Schlüssel. Halten Sie die Parallelität konfigurierbar, statt einen aggressiven Wert fest im Code zu verankern.

OpenAI veröffentlicht außerdem nach Tarifen gestaffelte Limits für den direkten Modellzugriff. Diese Angaben bieten einen nützlichen Vergleich, sollten aber nicht als Ratenbegrenzungen von GPT Proto dargestellt werden.

Schritt 5: URL- und Base64-Ergebnisse korrekt speichern

GPT Proto unterstützt für diesen Endpunkt response_format="url" und response_format="b64_json".

Einsteiger sollten zunächst url verwenden. Die API gibt einen normalen Bildlink zurück und das Skript lädt die Datei in den Ordner generated herunter. Laden Sie das Bild sofort herunter, da es sich bei der Ergebnis-URL um einen Übertragungslink und nicht um einen dauerhaften Speicherort für Assets handelt. Speichern Sie freigegebene Dateien in Ihrem eigenen Medienordner für Produkte, DAM oder Objektspeicher.

Base64 ist eine weitere Möglichkeit, dasselbe Bild bereitzustellen: Die Antwort enthält eine sehr lange Textzeichenfolge statt einer URL. Das ist nützlich, wenn alle Daten in JSON bleiben müssen. Der Text muss jedoch wieder in binäre Bilddaten umgewandelt werden, bevor die Datei geöffnet werden kann. Für die erste Version dieses Workflows benötigen Sie kein Base64.

Dekodieren Sie bei einer Base64-Ausgabe die Zeichenfolge in Bytes:

import base64
from pathlib import Path

def save_base64_image(value, destination):
    # Also accepts a data URI such as data:image/png;base64,...
    encoded = value.split(",", 1)[1] if value.startswith("data:") else value
    Path(destination).write_bytes(base64.b64decode(encoded, validate=True))

Ein häufiger Fehler beim Dekodieren von GPT Image 2 Base64 ist, den kodierten Text direkt in eine Datei mit der Endung .png zu schreiben. Eine gültige Bilddatei enthält dekodierte Binärdaten und nicht die von der API zurückgegebene JSON-Zeichenfolge.

Wenn Sie OpenAI direkt statt GPT Proto verwenden, beachten Sie, dass GPT-Bildmodelle b64_json zurückgeben. Laut dem Leitfaden zur Bildgenerierung von OpenAI wird das URL-Antwortformat für GPT-Bildmodelle nicht unterstützt. Dieser Unterschied zwischen Anbietern ist der Grund, warum die Verarbeitung der Antwort zum tatsächlich aufgerufenen Endpunkt passen sollte.

Schritt 6: Erneute Versuche ohne doppelte Bilder

Eine API-Anfrage kann fehlschlagen, weil das Konto zu schnell Aufträge sendet, die Netzwerkverbindung unterbrochen wird oder die Generierung selbst abgelehnt wird. Es ist verlockend, jeden fehlgeschlagenen Befehl erneut auszuführen, doch dabei können doppelte Bilder entstehen.

Wiederholungen sind nicht für jede Anfrage gleichermaßen sicher. POST erstellt eine neue Aufgabe; GET fragt lediglich eine bestehende Aufgabe ab.

  • Eine Statusabfrage per GET kann sicher wiederholt werden, da sie kein weiteres Bild erstellt.

  • Bei einer POST-Anfrage, die eindeutig mit 429 abgelehnt wird, können Sie bis zum in Retry-After angegebenen Zeitpunkt warten und es erneut versuchen.

  • Bei einem Verbindungs-Timeout während einer POST-Anfrage ist der Status unklar. Der Server hat den Auftrag möglicherweise angenommen, obwohl der Client keine Antwort erhalten hat. Eine blinde Wiederholung kann einen kostenpflichtigen Doppelauftrag erzeugen.

  • Ein abgeschlossener, fehlgeschlagener oder durch Moderation blockierter Auftrag sollte nicht automatisch erneut gesendet werden.

Das Skript unten schreibt die Aufgaben-ID unmittelbar nach dem Absenden in manifest.json. Beim nächsten Durchlauf fragt es die bestehende Aufgabe ab, statt dieselbe SKU erneut zu senden. Endet die Anfrage mit einem unbekannten Netzwerkstatus und ohne Aufgaben-ID, wird der Eintrag als manual_check markiert. Prüfen Sie den Kontoverlauf, bevor Sie es erneut versuchen.

Verwenden Sie für sichere Wiederholungen exponentielles Backoff mit Jitter. Berücksichtigen Sie Retry-After, wenn die API den Header sendet, begrenzen Sie die Wartezeit und die Anzahl der Versuche. Wiederholte Fehler sollten im Manifest erfasst werden und nicht in einer Endlosschleife landen.

Schritt 7: image_generation_user_error behandeln

image_generation_user_error ist eine Kategorie und keine vollständige Diagnose. Sie bedeutet, dass die Anfrage aufgrund eines Problems mit der Eingabe oder Anfrage nicht generiert werden konnte. Lesen Sie den inneren Fehlercode und die Fehlermeldung, bevor Sie entscheiden, was geändert werden soll.

Typische Maßnahmen sind:

Fehlerhinweis Wahrscheinliche Maßnahme
moderation_blocked oder Richtlinienhinweis Prompt und Referenzbild prüfen; unverändert nicht erneut versuchen
Ungültige Größe Größe lokal validieren und Abmessungen korrigieren
Ungültiger Parameter oder nicht unterstütztes Format Payload mit der aktuellen Dokumentation des Endpunkts vergleichen
Authentifizierungsfehler (401) Schlüsselwert und Authorization-Header prüfen
Berechtigungs- oder Guthabenfehler (403) Modellzugriff und Guthaben prüfen; kein automatisches Backoff verwenden
Ratenbegrenzung (429) Retry-After berücksichtigen, Parallelität verringern und mit begrenzter Anzahl erneut versuchen
Serverfehler (500) Anfrage protokollieren und nur erneut versuchen, wenn das Risiko eines Duplikats geklärt ist

Versuchen Sie nicht, Moderationsfehler zu „beheben“, indem Sie Wörter entfernen, bis die Anfrage durchgeht. Vergewissern Sie sich, dass das Produkt, der vorgesehene Verwendungszweck, die Referenzmaterialien und der Prompt den Richtlinien des Anbieters entsprechen.

Wenn eine Aufgabe fehlschlägt, gehen Einsteiger am besten folgendermaßen vor:

  1. SKU in manifest.json suchen.

  2. Das Feld error lesen, statt das Produkt sofort erneut zu senden.

  3. Wenn in der Meldung eine Größe oder ein Parameter genannt wird, diesen Wert korrigieren.

  4. Bei einem 429 den Wert von IMAGE_WORKERS verringern und vor der Fortsetzung warten.

  5. Bei Richtlinien- oder Moderationsfehlern Produkt und Prompt manuell prüfen.

  6. Bei Status manual_check den Aufgabenverlauf prüfen, bevor der Eintrag gelöscht wird. Die ursprüngliche Anfrage könnte bereits angelegt worden sein.

Schritt 8: Ein teamfreundliches Generierungsmanifest führen

Das Manifest ist keine API-Funktion, die Sie konfigurieren müssen. Es ist eine JSON-Datei, die das Skript auf Ihrem Computer erstellt. Betrachten Sie sie als Generierungsprotokoll.

Für ein Team oder Unternehmen reicht der Bilderordner allein nicht aus. Ein Manifest verknüpft jedes Asset mit SKU, Prompt, Einstellungen, Aufgaben-ID, Status, Ausgabepfad und Fehler.

Beispieleintrag:

{
  "MUG-001": {
    "sku": "MUG-001",
    "status": "completed",
    "task_id": "prediction-id",
    "quality": "low",
    "size": "1024x1024",
    "prompt": "Create one catalog product photograph...",
    "files": ["generated/MUG-001-01.png"],
    "error": null
  }
}

In diesem Eintrag bedeutet completed, dass das Bild generiert und heruntergeladen wurde. task_id ist die Empfangsnummer der API. files gibt an, wo das Bild gespeichert wurde. Wenn die Generierung fehlschlägt, enthält error die Informationen, anhand derer entschieden werden kann, ob die SKU korrigiert, erneut versucht oder überprüft werden soll.

So erhält die prüfende Person eine verlässliche Übergabe. Außerdem lassen sich nur abgelehnte Elemente neu generieren, Prompt-Versionen vergleichen und Assets bis zu ihrer ursprünglichen Anfrage zurückverfolgen. Bei größeren Teams können dieselben Felder in einer Datenbank gespeichert und um prüfende Person, Freigabestatus, Prompt-Version, Kampagne und Rechtehinweise ergänzt werden.

Vollständiges Python-Skript für die Produktgenerierung in großen Mengen

Das folgende Skript vereint den Workflow. Es verwendet den aktuellen GPT Proto-v3-Endpunkt für Text-zu-Bild und die Route für Vorhersageergebnisse, sendet pro SKU n=1 und verwendet standardmäßig drei Worker. Bekannte Aufgaben werden anhand von manifest.json fortgesetzt.

Der Code ist länger als ein einfaches API-Beispiel, da er mehrere Sicherheitsaufgaben für Sie übernimmt:

  • Prüft die Bildabmessungen, bevor eine Anfrage gesendet wird.

  • Speichert die Aufgaben-ID, sobald die API ein Produkt annimmt.

  • Wartet auf jedes Bild, ohne dass Sie GET-Befehle manuell ausführen müssen.

  • Lädt URL-Ergebnisse herunter und dekodiert Base64-Ergebnisse.

  • Begrenzt die Anzahl der gleichzeitig verarbeiteten Produkte.

  • Protokolliert Fehler und setzt bekannte Aufgaben nach einem Neustart fort.

Kopieren Sie das Skript bei der ersten Ausführung, ohne seine Funktionen zu ändern. Sie müssen nur products.csv und den API-Schlüssel bereitstellen. Die Einstellungen im oberen Bereich – SIZE, QUALITY, WORKERS und POLL_TIMEOUT – können später angepasst werden.

import base64
import csv
import json
import os
import random
import re
import threading
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from pathlib import Path
from urllib.parse import urlparse

import requests

API_ROOT = "https://gptproto.com/api/v3"
SUBMIT_URL = f"{API_ROOT}/openai/gpt-image-2/text-to-image"
RESULT_URL = f"{API_ROOT}/predictions/{{task_id}}/result"

CSV_PATH = Path(os.getenv("PRODUCTS_CSV", "products.csv"))
OUTPUT_DIR = Path(os.getenv("IMAGE_OUTPUT_DIR", "generated"))
MANIFEST_PATH = Path(os.getenv("IMAGE_MANIFEST", "manifest.json"))

SIZE = os.getenv("IMAGE_SIZE", "1024x1024")
QUALITY = os.getenv("IMAGE_QUALITY", "low")
WORKERS = int(os.getenv("IMAGE_WORKERS", "3"))
POLL_TIMEOUT = int(os.getenv("IMAGE_POLL_TIMEOUT", "900"))

API_KEY = os.environ["GPTPROTO_API_KEY"]
HEADERS = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}

manifest_lock = threading.Lock()


class SubmissionStateUnknown(RuntimeError):
    """The POST may have reached the server, but no task ID was received."""


def validate_size(size):
    if size == "auto":
        return
    if not re.fullmatch(r"\d+x\d+", size.lower()):
        raise ValueError("Size must look like 1024x1024 or be 'auto'")

    width, height = map(int, size.lower().split("x"))
    pixels = width * height
    if width % 16 or height % 16:
        raise ValueError("GPT Image 2 width and height must be multiples of 16")
    if max(width, height) > 3840:
        raise ValueError("The longest edge cannot exceed 3840 pixels")
    if max(width, height) / min(width, height) > 3:
        raise ValueError("Aspect ratio cannot exceed 3:1")
    if not 655_360 <= pixels <= 8_294_400:
        raise ValueError("Total pixels are outside the supported range")


def build_prompt(row):
    return f"""Create one catalog product photograph.
Product: {row['name']}
Color: {row['color']}
Material: {row['material']}
View: {row['angle']}
Background: {row['background']}

Keep the product centered with realistic proportions and material texture.
Use soft studio lighting, a natural contact shadow, and generous crop-safe space.
No text, logos, labels, people, or extra objects.
Also avoid: {row.get('avoid', 'none')}.
Return a single product image, not a collage or contact sheet."""


def load_manifest():
    if not MANIFEST_PATH.exists():
        return {}
    return json.loads(MANIFEST_PATH.read_text(encoding="utf-8"))


manifest = load_manifest()


def save_record(sku, **changes):
    with manifest_lock:
        record = manifest.setdefault(sku, {"sku": sku})
        record.update(changes)
        temporary = MANIFEST_PATH.with_suffix(".json.tmp")
        temporary.write_text(
            json.dumps(manifest, indent=2, ensure_ascii=False),
            encoding="utf-8",
        )
        temporary.replace(MANIFEST_PATH)


def parse_json(response):
    try:
        return response.json()
    except ValueError:
        return {"raw_response": response.text[:1000]}


def api_error(response):
    payload = parse_json(response)
    return RuntimeError(
        f"HTTP {response.status_code}: {json.dumps(payload, ensure_ascii=False)}"
    )


def submit(prompt):
    payload = {
        "prompt": prompt,
        "n": 1,
        "quality": QUALITY,
        "size": SIZE,
        "enable_sync_mode": False,
        "response_format": "url",
    }

    # Retry only a definite 429 rejection. A connection failure is ambiguous:
    # the job may exist even though this client did not receive its ID.
    for attempt in range(5):
        try:
            response = requests.post(
                SUBMIT_URL,
                headers=HEADERS,
                json=payload,
                timeout=(10, 180),
            )
        except requests.RequestException as exc:
            raise SubmissionStateUnknown(str(exc)) from exc

        if response.status_code != 429:
            if response.status_code >= 400:
                raise api_error(response)
            body = parse_json(response)
            data = body.get("data", body)
            task_id = data.get("id")
            if not task_id:
                raise RuntimeError(f"Submission returned no data.id: {body}")
            return task_id

        if attempt == 4:
            raise api_error(response)
        retry_after = response.headers.get("Retry-After")
        delay = float(retry_after) if retry_after and retry_after.isdigit() else 2**attempt
        time.sleep(min(30, delay) + random.random())

    raise RuntimeError("Submission retry loop ended unexpectedly")


def get_result(task_id):
    deadline = time.monotonic() + POLL_TIMEOUT
    delay = 2.0

    while time.monotonic() < deadline:
        try:
            response = requests.get(
                RESULT_URL.format(task_id=task_id),
                headers=HEADERS,
                timeout=(10, 60),
            )
        except requests.RequestException:
            time.sleep(delay + random.random())
            delay = min(10, delay * 1.5)
            continue

        if response.status_code == 429 or response.status_code >= 500:
            retry_after = response.headers.get("Retry-After")
            wait = float(retry_after) if retry_after and retry_after.isdigit() else delay
            time.sleep(min(30, wait) + random.random())
            delay = min(10, delay * 1.5)
            continue
        if response.status_code >= 400:
            raise api_error(response)

        body = parse_json(response)
        data = body.get("data", body)
        status = str(data.get("status", "")).lower()

        if status in {"completed", "succeeded"}:
            outputs = data.get("outputs") or []
            if not outputs:
                raise RuntimeError(f"Completed task returned no outputs: {body}")
            return outputs
        if status in {"failed", "canceled", "cancelled"}:
            raise RuntimeError(json.dumps(data.get("error") or body, ensure_ascii=False))

        time.sleep(delay)
        delay = min(10, delay * 1.25)

    raise TimeoutError(f"Task {task_id} exceeded {POLL_TIMEOUT} seconds")


def filename_part(value):
    cleaned = re.sub(r"[^A-Za-z0-9._-]+", "-", value.strip())
    return cleaned.strip("-._") or "product"


def extension_from_response(response, url):
    content_type = response.headers.get("Content-Type", "").split(";", 1)[0]
    by_type = {"image/png": ".png", "image/jpeg": ".jpg", "image/webp": ".webp"}
    if content_type in by_type:
        return by_type[content_type]
    suffix = Path(urlparse(url).path).suffix.lower()
    return suffix if suffix in {".png", ".jpg", ".jpeg", ".webp"} else ".png"


def save_output(output, sku, index):
    OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
    stem = f"{filename_part(sku)}-{index:02d}"

    if isinstance(output, dict):
        output = output.get("url") or output.get("b64_json") or output.get("data")
    if not isinstance(output, str):
        raise TypeError(f"Unsupported output value: {output!r}")

    if output.startswith(("http://", "https://")):
        response = requests.get(output, timeout=(10, 180))
        response.raise_for_status()
        destination = OUTPUT_DIR / f"{stem}{extension_from_response(response, output)}"
        destination.write_bytes(response.content)
        return str(destination)

    encoded = output.split(",", 1)[1] if output.startswith("data:") else output
    destination = OUTPUT_DIR / f"{stem}.png"
    destination.write_bytes(base64.b64decode(encoded, validate=True))
    return str(destination)


def process_product(row):
    sku = row["sku"].strip()
    prompt = build_prompt(row)
    previous = manifest.get(sku, {})

    if previous.get("status") == "completed":
        return sku, "skipped: already completed"
    if previous.get("status") == "manual_check" and not previous.get("task_id"):
        return sku, "skipped: verify task history before resubmitting"
    if previous.get("status") == "failed":
        return sku, "skipped: review the recorded error before retrying"

    task_id = previous.get("task_id")

    try:
        if not task_id:
            task_id = submit(prompt)
            save_record(
                sku,
                status="submitted",
                task_id=task_id,
                quality=QUALITY,
                size=SIZE,
                prompt=prompt,
                files=[],
                error=None,
            )

        save_record(sku, status="processing")
        outputs = get_result(task_id)
        files = [save_output(value, sku, i) for i, value in enumerate(outputs, 1)]
        save_record(sku, status="completed", files=files, error=None)
        return sku, f"completed: {', '.join(files)}"

    except SubmissionStateUnknown as exc:
        save_record(
            sku,
            status="manual_check",
            task_id=None,
            quality=QUALITY,
            size=SIZE,
            prompt=prompt,
            files=[],
            error=f"Submission state unknown: {exc}",
        )
        return sku, "manual check required"
    except TimeoutError as exc:
        # Keep the task ID. The next run will poll this job instead of submitting
        # the SKU again, so a slow generation does not become a duplicate.
        save_record(sku, status="poll_timeout", task_id=task_id, error=str(exc))
        return sku, f"poll timed out; resume task {task_id} on the next run"
    except Exception as exc:
        save_record(sku, status="failed", task_id=task_id, error=str(exc))
        return sku, f"failed: {exc}"


def main():
    validate_size(SIZE)
    if WORKERS < 1:
        raise ValueError("IMAGE_WORKERS must be at least 1")

    with CSV_PATH.open(newline="", encoding="utf-8-sig") as handle:
        products = list(csv.DictReader(handle))

    required = {"sku", "name", "color", "material", "angle", "background"}
    missing = required - set(products[0]) if products else required
    if missing:
        raise ValueError(f"CSV is missing columns: {sorted(missing)}")

    skus = [row["sku"].strip() for row in products]
    if not all(skus):
        raise ValueError("Every CSV row must have a non-empty SKU")
    if len(skus) != len(set(skus)):
        raise ValueError("CSV contains duplicate SKUs; make each SKU unique before running")

    with ThreadPoolExecutor(max_workers=WORKERS) as pool:
        futures = [pool.submit(process_product, row) for row in products]
        for future in as_completed(futures):
            sku, message = future.result()
            print(f"[{sku}] {message}")


if __name__ == "__main__":
    main()

Skript ausführen: Eine Anleitung für Einsteiger

1. Die beiden Eingabedateien überprüfen

Öffnen Sie Ihren Ordner gpt-image-bulk und vergewissern Sie sich, dass er Folgendes enthält:

  • bulk_product_images.py, mit dem vollständigen Python-Code.

  • products.csv, mit der Kopfzeile und mindestens einer Produktzeile.

Speichern Sie das Skript nicht als bulk_product_images.py.txt. Wenn Ihr Editor Dateierweiterungen ausblendet, prüfen Sie vor dem Fortfahren den Dateityp.

2. Terminal in diesem Ordner öffnen

Das Terminal muss sich im selben Ordner wie die beiden Dateien befinden. Sie können cd gefolgt vom Ordnerpfad verwenden, zum Beispiel:

cd path/to/gpt-image-bulk

Den aktuellen Ordner können Sie unter macOS/Linux mit pwd oder in PowerShell mit Get-Location überprüfen.

3. API-Schlüssel festlegen und requests installieren

Legen Sie GPTPROTO_API_KEY mit dem im Einrichtungsabschnitt gezeigten Befehl fest. Installieren Sie anschließend requests, falls noch nicht geschehen:

python -m pip install requests

4. Datei ausführen

Unter macOS, Linux und den meisten Python-Installationen:

python bulk_product_images.py

Verwenden Sie unter Windows den folgenden Befehl, wenn Ihr Python-Befehl py lautet:

py bulk_product_images.py

Die Verarbeitung des ersten Produkts kann eine Weile dauern. Das Terminal ist während der Generierung durch die API nicht unbedingt eingefroren. Nach Abschluss der Aufgaben sollten ähnliche Zeilen angezeigt werden:

[MUG-001] completed: generated/MUG-001-01.png
[BAG-014] completed: generated/BAG-014-01.png
[LAMP-207] completed: generated/LAMP-207-01.png

Der Ordner enthält nun generated/ und manifest.json. Öffnen Sie die generierten Bilder und vergleichen Sie jedes mit der zugehörigen CSV-Zeile. Öffnen Sie anschließend manifest.json in einem Texteditor und vergewissern Sie sich, dass bei jeder erfolgreich verarbeiteten SKU "status": "completed" steht.

5. Verstehen, was bei einer erneuten Ausführung passiert

Das Skript liest manifest.json, bevor es neue Anfragen sendet. Abgeschlossene SKUs werden übersprungen. Bei einer Aufgabe, die zuvor während der Statusabfrage unterbrochen wurde, bleibt die Aufgaben-ID erhalten und wird erneut geprüft. Ein als manual_check oder failed markierter Eintrag wird nicht automatisch erneut gesendet.

Das ist Absicht. So wird verhindert, dass „Befehl erneut ausführen“ bedeutet: „Für jedes erfolgreiche Bild erneut bezahlen“. Wenn ein fehlgeschlagener Eintrag gefahrlos erneut versucht werden kann, löschen Sie nach Prüfung des Fehlers nur den Eintrag dieser SKU aus manifest.json. Löschen Sie nicht das gesamte Manifest, es sei denn, Sie möchten den ganzen Katalog bewusst erneut einreichen.

6. Von Entwürfen zu finalen Bildern wechseln

Verwenden Sie für den ersten Durchlauf IMAGE_QUALITY=low und IMAGE_WORKERS=2 oder 3. Prüfen Sie die Entwürfe und kopieren Sie nur freigegebene Produktzeilen in eine neue Datei namens products-final.csv.

Verwenden Sie für einen separaten finalen Durchlauf unter macOS oder Linux neue Namen für Ausgabe und Manifest, damit die Entwurfsdateien unverändert bleiben:

PRODUCTS_CSV=products-final.csv \
IMAGE_OUTPUT_DIR=generated-final \
IMAGE_MANIFEST=manifest-final.json \
IMAGE_QUALITY=high \
python bulk_product_images.py

Legen Sie in Windows PowerShell zunächst dieselben Werte fest und führen Sie anschließend das Skript aus:

$env:PRODUCTS_CSV="products-final.csv"
$env:IMAGE_OUTPUT_DIR="generated-final"
$env:IMAGE_MANIFEST="manifest-final.json"
$env:IMAGE_QUALITY="high"
py bulk_product_images.py

Die finalen Bilder werden im Ordner generated-final/ gespeichert. Die Entwurfsbilder und das Entwurfsmanifest bleiben dabei zum Vergleich erhalten.

Preise für GPT Image 2 bei umfangreichen Aufträgen

Die Preise für GPT Image 2 basieren auf Tokens. Deshalb gibt es keinen allgemeingültigen, verlässlichen „Preis pro Produktbild“. Texteingabe, Eingabe von Referenzbildern, Ausgabegröße, Qualität und Anzahl der Ergebnisse wirken sich auf die Gesamtkosten aus.

Für Einsteiger ist „pro eine Million Tokens“ eine Abrechnungseinheit und weder ein monatliches Abonnement noch die Pflicht, im Voraus eine Million Tokens zu kaufen. Ihr Prompt wird als Texteingabe-Tokens abgerechnet. Ein für die Bildbearbeitung verwendetes Produkt-Referenzfoto wird als Bild-Eingabe-Tokens abgerechnet. Das generierte Bild wird als Bild-Ausgabe-Tokens abgerechnet. Bei einer Text-zu-Bild-Anfrage fallen keine Kosten für die Eingabe eines Referenzbilds an, da kein Ausgangsbild hochgeladen wurde.

Zum Zeitpunkt der Veröffentlichung sind auf der GPT Proto-Modellseite folgende Preise pro eine Million Tokens angegeben:

Tokenkategorie Angegebener Preis bei GPT Proto OpenAI-Standardpreis
Texteingabe $4.00 $5.00
Bildeingabe $6.40 $8.00
Zwischengespeicherte Bildeingabe $1.60 $2.00
Bildausgabe $24.00 $30.00

Das liegt 20 % unter den angegebenen OpenAI-Standardpreisen pro Token. Preise können sich ändern. Prüfen Sie daher die aktuelle GPT Image 2-Modellseite, bevor Sie einen Preis veröffentlichen oder einen umfangreichen Durchlauf starten.

Die Preisübersicht von OpenAI enthält außerdem hilfreiche Beispiele für die reinen Ausgabekosten bei gängigen Größen. Für ein Bild mit 1024x1024 werden bei niedriger Qualität etwa 0,006 $, bei mittlerer 0,053 $ und bei hoher Qualität 0,211 $ angegeben. Ein Bild mit 1536x1024 oder 1024x1536 kostet etwa 0,005 $, 0,041 $ beziehungsweise 0,165 $. Eingabe-Tokens kommen hinzu. Maßgeblich ist die aktuelle OpenAI-API-Preisseite; behandeln Sie diese Werte nicht als dauerhaft.

Für eine Kostenschätzung des Katalogs sollten Sie einen Pilotlauf mit 20 Artikeln durchführen, der die tatsächliche Produktmischung widerspiegelt. Erfassen Sie die tatsächlichen Ausgaben, den Anteil freigegebener Bilder und die Regenerierungsrate. Berechnen Sie anschließend:

geschätzte Katalogkosten =
  durchschnittliche API-Kosten pro Versuch
  × durchschnittliche Anzahl Versuche pro freigegebenem Bild
  × Anzahl der Produkte

Die Regenerierungsrate wird leicht übersehen. Ein günstiger Entwurf, für den vier Versuche nötig sind, kann mehr kosten als ein besser kontrollierter Auftrag mit mittlerer Qualität, der beim ersten oder zweiten Versuch freigegeben wird.

Wann Sie Referenzbilder statt Text-zu-Bild verwenden sollten

Reines Text-zu-Bild eignet sich, wenn das Produkt allgemein gehalten ist, das Bild konzeptionell sein soll oder die genaue Verpackung nicht einem verkäuflichen Artikel entsprechen muss. Für die exakte Darstellung einer SKU sollte es nicht die Standardeinstellung sein.

Verwenden Sie den Bildbearbeitungs-Endpunkt von GPT Image 2, wenn Form, Farben, Verpackung oder Designsprache eines bestehenden Produkts erhalten bleiben müssen. GPT Image 2 akzeptiert laut Dokumentation im offiziellen Format bis zu 16 PNG-, WebP- oder JPEG-Referenzbilder mit jeweils weniger als 50 MB und verwendet automatisch eine hohe Eingabetreue. Der Endpunkt im Anbieterformat von GPT Proto akzeptiert Bild-URLs oder Base64-Daten-URIs. Siehe die GPT Image 2-Referenz zur Bildbearbeitung.

Geeignete Referenzsammlungen enthalten:

  • Ein sauberes Produktfoto von vorn oder aus einer Dreiviertelperspektive.

  • Eine zweite Perspektive, wenn die Form nicht eindeutig ist.

  • Eine Nahaufnahme wichtiger Materialstrukturen oder Bedienelemente.

  • Eine separate Stilreferenz für Beleuchtung und Hintergrund, die im Prompt eindeutig gekennzeichnet ist.

Referenzbilder verbessern die Kontrolle, garantieren jedoch keine pixelgenauen Etiketten, kleinen Texte oder Produktabmessungen. Vor der Veröffentlichung sollte eine Person die generierten Assets mit dem Originalprodukt vergleichen.

Produktions-Checkliste für Unternehmen und Teams

Bevor Sie von einem Pilotlauf zur Massengenerierung übergehen:

  • Eine Prompt-Version festlegen und im Manifest speichern.

  • Eine unveränderliche SKU als primären Asset-Schlüssel verwenden.

  • Entwürfe mit niedriger Qualität generieren und nur freigegebene Kompositionen mit der endgültigen Einstellung rendern.

  • Die Anzahl der Worker konfigurierbar halten und nach wiederholten 429-Antworten reduzieren.

  • Aufgaben-IDs vor dem Abfragen speichern.

  • Jede temporäre Ergebnis-URL sofort herunterladen.

  • Die Statuswerte failed, manual_check und completed getrennt behandeln.

  • Moderations-, Berechtigungs- oder Guthabenfehler niemals unverändert erneut versuchen.

  • Beispielergebnisse auf Geometrie, Farbe, Etiketten, Schatten, Bildausschnitt und doppelte Objekte prüfen.

  • Rechte an Quell- und Referenzmaterialien sichern und die Prüfungsfreigabe dokumentieren.

  • API-Schlüssel in einem Secret-Manager oder einer Umgebungsvariablen speichern, nicht in einer CSV-Datei oder einem Repository.

Zur Entwicklung von Prompts, bevor Sie den Katalog automatisieren, können die GPT Image 2-Promptbeispiele dabei helfen, eine visuelle Richtung festzulegen. Überführen Sie diese Richtung in strukturierte Felder, bevor Sie den Ablauf auf große Mengen ausweiten.

Mit einem kleinen Katalogausschnitt beginnen

Der API-Aufruf ist der einfache Teil. Zuverlässige Massengenerierung entsteht dadurch, dass einzelne Produkte von einzelnen Variationen getrennt, Parallelität begrenzt, Eingaben validiert, Prediction-IDs gespeichert und alle Durchläufe fortsetzbar gemacht werden.

Beginnen Sie mit 10 bis 20 repräsentativen SKUs und niedriger Qualität. Messen Sie Freigabe- und Regenerierungsraten, korrigieren Sie den gemeinsamen Prompt und erweitern Sie erst danach die Warteschlange. Die aktuellen Parameter und Preise finden Sie auf der GPT Image 2-Modellseite. Wenn Sie das Skript ausführen möchten, können Sie über die GPT Proto-Startseite ein Konto erstellen.

Häufig gestellte Fragen

Wie erstelle ich mit der GPT Image 2 API mehrere Produktbilder?

Verwenden Sie eine Anfrage pro Produktzeile, normalerweise mit n=1, und verarbeiten Sie diese Anfragen über einen kontrollierten Worker-Pool. Speichern Sie jede zurückgegebene Task-ID und ordnen Sie die heruntergeladene Ausgabe der Quell-SKU zu. Verwenden Sie n>1 nur, wenn Sie mehrere Varianten desselben Prompts wünschen.

Kann ich ChatGPT bitten, mehrere Bilder auf einmal zu generieren?

Sie können ChatGPT während einer Unterhaltung um mehrere Bilder oder Varianten bitten, aber die Benutzeroberfläche eignet sich am besten für die manuelle kreative Arbeit. Für CSV-Eingaben, stabile Dateinamen, erneute Versuche, Freigabestatus und die Integration in einen Store verwenden Sie die API.

Wie hoch ist das GPT Image 2 Rate-Limit?

Das hängt vom Anbieter, Konto und den aktuellen Limits ab. OpenAI veröffentlicht Limits nach Tarifstufe für den direkten Zugriff, aber diese Werte sollten nicht auf ein GPTProto-Konto übertragen werden. Beginnen Sie mit zwei oder drei Workern, beachten Sie 429-Antworten und Retry-After und passen Sie die Anzahl anhand des beobachteten Verhaltens an.

Warum meldet GPT Image 2, dass die Größe ein Vielfaches von 16 sein muss?

Benutzerdefinierte Breite und Höhe müssen jeweils ohne Rest durch 16 teilbar sein. Außerdem muss die Größe innerhalb der Limits für Kantenlänge, Seitenverhältnis und Gesamtpixelzahl liegen. Validieren Sie die Werte lokal, bevor Sie die Anfrage senden. Generieren Sie das Bild mit einer nahegelegenen gültigen Größe und ändern Sie anschließend die Größe, wenn ein Store ungültige Abmessungen erfordert.

Wie dekodiere ich ein Base64-Ergebnis von GPT Image 2?

Entfernen Sie gegebenenfalls das Data-URI-Präfix, übergeben Sie die verbleibende Zeichenfolge an base64.b64decode und schreiben Sie die resultierenden Bytes in eine Bilddatei. Speichern Sie die codierte JSON-Zeichenfolge nicht direkt mit einer Bilddateiendung.

Eignet sich die Massengenerierung über die GPT Image 2 API für ein Team?

Ja, wenn die Pipeline mehr als nur die Generierung umfasst. Teams benötigen ein Manifest, eine unveränderliche SKU-Zuordnung, Prompt-Versionen, einen Prüfstatus, eine Kostenverfolgung und eine Regel für mehrdeutige Einreichungen. Diese Kontrollmechanismen erleichtern die Übergabe und teilweise erneute Ausführungen.

Sollte ich die OpenAI Batch API für Produktbilder verwenden?

Verwenden Sie sie für direkte OpenAI-Workloads, die bis zu 24 Stunden warten können und in den JSONL-Prozess passen. Sie bietet einen separaten Rate-Pool und vergünstigte Preise. Verwenden Sie für den in diesem Leitfaden beschriebenen GPTProto-Endpunkt den dokumentierten Prediction-Workflow, sofern GPTProto die Unterstützung der Batch API nicht ausdrücklich dokumentiert.

Verwandte Artikel

Weitere Blogbeiträge
Die 6 günstigsten KI-Bildgeneratoren 2026: Die tatsächlichen Kosten pro Bild

Die 6 günstigsten KI-Bildgeneratoren 2026: Die tatsächlichen Kosten pro Bild

Der günstigste KI-Bildgenerator hängt davon ab, was du kaufen möchtest. Wenn du drei oder vier Bilder für den persönlichen Gebrauch willst, ist ein kostenloses Browser-Tool günstiger als jede kostenpflichtige API. Wenn du jedoch Hunderte von Bildern in einer App benötigst, sind wechselnde Gratislimits und manuelle Downloads kein praktikables Kostenmodell. Für die Bildgenerierung per API bietet GPT Image 1 Mini in diesem Vergleich den niedrigsten Einstiegspreis: etwa 0,0035 $ für ein 1024×1024-Bild in niedriger Qualität , zuzüglich einer kleinen Gebühr für die Texteingabe. Die Kosten ändern sich je nach Qualität, Abmessungen und Tokenverbrauch. Nano Banana 2 Lite ist die günstigste, planbare Option zum Festpreis: 0,0202 $ pro 1K-Bild. Dieser Unterschied ist wichtig. Das eine bietet den niedrigstmöglichen Einstiegspreis, das andere lässt sich leichter in ein Startup-Budget einplanen. Alle Preise wurden am 3. September 2026 überprüft. Alle sechs Modelle sind über GPTProtos KI-Bildgenerator verfügbar. Jetzt ein Bild generieren

Schuyler Stacy | 2026-09-03

5 beste Midjourney-API-Alternativen im Jahr 2026: echte Modell-APIs statt Discord-Wrapper

5 beste Midjourney-API-Alternativen im Jahr 2026: echte Modell-APIs statt Discord-Wrapper

Midjourney kann aus einem groben kreativen Briefing ein hervorragendes Bild erstellen. Deutlich weniger praktisch ist es, wenn dieses Bild in eine Anwendung, ein automatisiertes Kampagnensystem, einen Produktkatalog oder einen kundenorientierten Workflow eingebunden werden soll. Der Grund ist einfach: Midjourney bietet keine standardmäßige öffentliche API für die allgemeine Nutzung durch Entwickler. Die aktuellen Community-Richtlinien untersagen außerdem die nicht autorisierte Automatisierung des Dienstes. Midjourney auf GPTProto ausprobieren Damit bleiben Entwicklern zwei verschiedene Möglichkeiten: Einen Drittanbieterdienst nutzen, der in Ihrem Auftrag Aufträge an Midjourney übermittelt. Midjourney durch ein anderes Bildmodell mit dokumentierter API ersetzen. Dieser Leitfaden behandelt die zweite Möglichkeit. Die fünf Optionen unten sind alternative Bildmodelle – keine Discord-Bots, Browser-Automatisierungstools oder inoffiziellen Midjourney-Wrapper. Die Kurzfassung: Seedream 5.0 Pro ist die beste Midjourney-API-Alternative insgesamt für ausgefeilte visuelle Konzepte. Nano Banana Pro ist die sicherere Wahl für komplexe kommerzielle Grafiken, GPT Image 2 eignet sich besser für präzise Anweisungen und Text, FLUX.1 Kontext Max ist für iterative Bearbeitungen eine Überlegung wert, und Qwen Image Plus ist die günstige Option für Entwürfe in großen Mengen. Wenn Sie Midjourney selbst statt eines anderen Modells benötigen, vergleichen Sie die aktuellen Drittanbieter für Midjourney-APIs oder öffnen Sie die Midjourney-API-Seite auf GPTProto .

Tiffany Layne | 2026-09-01

Welches KI-Bildmodell ist 2026 am besten für den E-Commerce? 6 Modelle im Test mit Produktfotos

Welches KI-Bildmodell ist 2026 am besten für den E-Commerce? 6 Modelle im Test mit Produktfotos

Ein einziges überzeugendes Beispiel sagt kaum etwas darüber aus, ob ein KI-Bildmodell für den E-Commerce sicher ist. Ein schönes Produktfoto kann trotzdem den falschen Flaschenverschluss, eine neu gestaltete Verpackung, ein erfundenes Merkmal oder – noch schlimmer – den falschen Preis enthalten. Wir haben sechs Bildmodelle mit denselben drei E-Commerce-Aufgaben getestet: ein Foto von Nagellack bei der Anwendung, eine Stehlampe in einem Wohnzimmer und eine Anzeige für kabellose Ohrhörer mit fest vorgegebenem Text. Wir erfassten die Anzahl der Wiederholungsversuche, Produktänderungen, physische Fehler, Textgenauigkeit und ob das Ergebnis ohne Nachbearbeitung veröffentlicht werden konnte. Die kurze Antwort: Nano Banana Pro war insgesamt das beste KI-Bildmodell für den E-Commerce. Es gehörte als einziges Modell bei allen drei Tests zur Spitzengruppe. GPT Image 2 war am besten für Anzeigen mit exakt vorgegebenem Text , während Qwen Image Plus die kostengünstigste Option für Entwürfe in großen Mengen war . Midjourney erzeugte das überzeugendste Lifestyle-Bild, war jedoch am wenigsten zuverlässig, wenn Produkt und Werbetext exakt gleich bleiben mussten. Wenn Sie nur allgemeine Empfehlungen zur Bildbearbeitung benötigen, lesen Sie unseren separaten Leitfaden zu den besten KI-Modellen zur Bildbearbeitung . Dieser Vergleich konzentriert sich speziell auf die E-Commerce-Produktion und die Kosten, die entstehen, wenn ein Bild tatsächlich veröffentlichungsreif sein soll. Nano Banana Pro jetzt testen

2026-08-27

Die 7 besten Drittanbieter für Midjourney-APIs im Jahr 2026: Preise, Risiken und geprüfte Optionen

Die 7 besten Drittanbieter für Midjourney-APIs im Jahr 2026: Preise, Risiken und geprüfte Optionen

Midjourney dokumentiert weiterhin keine öffentliche Self-Service-API für den allgemeinen Entwicklerzugriff. Das hat einen Markt von Drittanbietern für Midjourney-APIs jedoch nicht davon abgehalten, gehostete Endpunkte, Wrapper für Discord-Konten und hybride Setups anzubieten. Das Problem ist nicht, eine Liste zu finden. Es ist, eine aktuelle Liste zu finden. In mehreren Suchergebnissen werden weiterhin Produkte empfohlen, die Midjourney nicht mehr anbieten, keine überprüfbare Produktseite mehr haben oder sich nicht sicher überprüfen lassen. Andere Vergleiche stellen eine gehostete Anfrage einem Wrapper gegenüber, bei dem man sein eigenes Konto mitbringt, als wären sie gleichwertig. Das sind sie nicht. Midjourney auf GPTProto ausprobieren Mein Ranking ist einfach: GPTProto ist die beste Wahl insgesamt für einen Workflow mit mehreren Modellen. Es bietet eine Midjourney-Route ohne Versionsangabe neben mehr als 200 weiteren Text-, Bild-, Video- und Audiomodellen – mit einem einzigen Schlüssel und gemeinsamem Guthaben. Mit etwa $0.06 pro Ausführung ist es allerdings nicht der günstigste hier aufgeführte Anbieter. APIFrame ist die stärkste Option für einen dedizierten Midjourney-Workflow. Die veröffentlichten Preise liegen zwischen $0.02–$0.10 pro Auftrag , bei vier Ausgaben pro Auftrag. Der Basic-Tarif beginnt jedoch bei $39 pro Monat . TTAPI ist die günstigste Wahl. Die aufgeführten Imagine-Preise beginnen bei etwa $0.03 im Relax-Modus , steigen auf $0.05 im Fast-Modus und $0.07 im Turbo-Modus . Eine Warnung ist wichtiger als jedes Ranking. Midjourneys Nutzungsbedingungen , die seit dem 27. Mai 2026 gelten, verbieten automatisierte Tools, die auf den Dienst zugreifen oder Inhalte über ihn generieren, sowie den Weiterverkauf oder die Weitergabe des Zugangs. Jeder Anbieter auf dieser Liste ist inoffiziell. Ein heute funktionierender Endpunkt beseitigt nicht das Risiko für Konten, Richtlinien oder die Dienstkontinuität von morgen.

Schuyler Stacy | 2026-08-25