Nano Banana Pro (Gemini 3 Pro Image)
Bilder mit Nano Banana Pro erzeugen und bearbeiten – über einen asynchronen Endpunkt mit Googles generateContent-Body: integriertes Thinking, 4K, 14 Referenzen.
Nano Banana Pro ist Googles Modell Gemini 3 Pro Image, gebaut für professionelle Assets und komplexe Anweisungen. Es denkt nach, bevor es zeichnet, daher melden Antworten Reasoning-Token. Sende Googles generateContent-Request-Body mit einem zusätzlichen model-Feld, behalte die zurückgegebene Aufgaben-ID und frag diese Aufgabe nach dem fertigen Bild ab. Referenzbilder gehören als fileData-URLs in contents.
Modell-IDs
| Modell-ID | Kanal | Abrechnung |
|---|---|---|
gemini-3-pro-image | Standard | Ein fester Preis pro geliefertem Bild |
gemini-3-pro-image-official | Official | Token-Preise für Eingabe, Text-/Thinking-Ausgabe und Bildausgabe |
Beide IDs akzeptieren dieselben Parameter. Aktuelle Preise findest du auf der Modellseite.
Kurzbeispiel
curl https://api.seedrouter.ai/v1/images/generations \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3-pro-image",
"contents": [{"parts": [{"text": "A ceramic teapot on a linen tablecloth, soft window light"}]}],
"generationConfig": {
"responseModalities": ["IMAGE"],
"imageConfig": {"aspectRatio": "16:9", "imageSize": "2K"}
}
}'Endpunkt
POST https://api.seedrouter.ai/v1/images/generations| Header | Wert |
|---|---|
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/json |
Der Body ist Googles generateContent-Request mit einer Ergänzung: model, weil dieser Endpunkt kein Modell im Pfad trägt. Die Antwort enthält eine Aufgaben-ID, nicht das fertige Bild. Bewahre API-Keys im serverseitigen Code auf. Ein direkter Aufruf von /v1beta/models/...:generateContent wird nicht unterstützt; nutze diesen Endpunkt.
Parameter
| Name | Typ | Pflicht | Standardwert | Hinweise |
|---|---|---|---|---|
model | string | Ja | — | Eine der beiden Modell-IDs oben. |
contents | Content[] | Ja | — | 1–32 Turns. Jeder hat parts und optional eine role (user oder model); der letzte Turn ist user. |
contents[].parts[].text | string | — | — | Ein Text-Part. Mindestens ein Text-Part ist erforderlich. |
contents[].parts[].fileData | object | Nein | — | {"mimeType": "...", "fileUri": "https://..."}; ein Referenzbild. Insgesamt bis zu 14. |
systemInstruction | object | Nein | — | {"parts": [{"text": "..."}]}. |
safetySettings | object[] | Nein | — | Paare aus {"category", "threshold"}; siehe unten. |
generationConfig.responseModalities | enum[] | Nein | Text und Bild | ["IMAGE"] nur für Bilder oder ["TEXT", "IMAGE"]. |
generationConfig.imageConfig.aspectRatio | enum | Nein | Seitenverhältnis des Eingabebilds, sonst 1:1 | 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9. |
generationConfig.imageConfig.imageSize | enum | Nein | 1K | 1K, 2K, 4K. Großes K. |
generationConfig.candidateCount | integer | Nein | 1 | Nur 1. Eine Anfrage liefert ein Bild. |
generationConfig.temperature | number | Nein | Modellstandard | 0–2. |
generationConfig.topP | number | Nein | Modellstandard | 0–1. |
generationConfig.topK | integer | Nein | Modellstandard | 1 oder mehr. |
generationConfig.seed | integer | Nein | — | 32-Bit-Ganzzahl. |
generationConfig.maxOutputTokens | integer | Nein | Modellstandard | 1–32.768. |
generationConfig.stopSequences | string[] | Nein | — | Bis zu 5. |
generationConfig.mediaResolution | enum | Nein | Modellstandard | MEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH. Legt fest, wie viele Token Eingabemedien verbrauchen. |
generationConfig.thinkingConfig.includeThoughts | boolean | Nein | false | Gibt die Gedankenzusammenfassungen des Modells als output.thoughts zurück. |
generationConfig.responseFormat.image | object | Nein | — | mimeType: IMAGE_JPEG; delivery: INLINE; aspectRatio und imageSize als Enum-Werte von Google, z. B. ASPECT_RATIO_SIXTEEN_BY_NINE und IMAGE_SIZE_TWO_K, mit denselben Seitenverhältnissen und Größen wie imageConfig. Von gemini-3-pro-image-official nicht akzeptiert. |
Sicherheitskategorien: HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_DANGEROUS_CONTENT. Schwellenwerte: BLOCK_NONE, BLOCK_ONLY_HIGH, BLOCK_MEDIUM_AND_ABOVE, BLOCK_LOW_AND_ABOVE, OFF.
Unbekannte Felder werden abgelehnt. Noch nicht verfügbar: Google Search Grounding (tools) und Cached Content; thinkingLevel ist für dieses Modell nicht dokumentiert. inlineData wird nicht akzeptiert; übergib Medien als fileData-URLs. responseFormat.image.delivery akzeptiert nur INLINE: Fertige Bilder werden immer als gehostete URLs zurückgegeben.
Ausgabegröße
imageSize | Ausgabe bei 1:1 | Bild-Token |
|---|---|---|
1K | 1024×1024 | 1.120 |
2K | 2048×2048 | 1.120 |
4K | 4096×4096 | 2.000 |
Andere Seitenverhältnisse behalten dieselbe Tokenzahl; 16:9 bei 1K ergibt zum Beispiel 1376×768.
Modi
Es gibt keinen separaten Modus-Parameter und keinen eigenen Bearbeitungs-Endpunkt.
| Vorgang | Parameter |
|---|---|
| Text zu Bild | ein Text-Part |
| Bearbeiten oder kombinieren | Text-Part + ein oder mehrere fileData-Parts |
| Bearbeitung über mehrere Turns | frühere user- und model-Turns, dann ein neuer user-Turn (siehe Hinweis unten) |
Um eine Unterhaltung fortzusetzen, baue den model-Turn aus den output.parts der vorherigen Aufgabe in derselben Reihenfolge nach: Ein Text-Part wird zu {"text": ..., "thoughtSignature": ...}, ein Bild-Part zu {"fileData": {"mimeType": "image/<output_format>", "fileUri": <data[image].url>}, "thoughtSignature": ...}. Übernimm jede thoughtSignature genau so, wie sie zurückgegeben wurde: Sie ist die URL der Signatur, die wir für dich gespeichert haben (die Signatur eines 4K-Bildes ist mehrere Megabyte groß), und wir stellen sie wieder her, bevor die Anfrage das Modell erreicht. Akzeptiert werden nur Signaturen aus deinen eigenen Aufgabenergebnissen.
Mit einem Referenzbild bearbeiten
curl https://api.seedrouter.ai/v1/images/generations \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3-pro-image",
"contents": [{
"role": "user",
"parts": [
{"text": "Turn this photo into a watercolor painting. Keep the composition."},
{"fileData": {"mimeType": "image/jpeg", "fileUri": "https://example.com/photo.jpg"}}
]
}]
}'Ersetze die Beispiel-URL durch ein eigenes, erreichbares Bild.
Medieneingaben
Diese API akzeptiert nur URL-Referenzen. Base64-inlineData, data:-URLs und Multipart-Uploads werden nicht akzeptiert. Der Playground lädt ausgewählte Dateien in einen Speicher hoch, bevor er ihre URLs übermittelt.
Referenzbilder müssen öffentliche HTTP(S)-URLs zu PNG-, JPEG-, WebP-, HEIC- oder HEIF-Dateien sein, jede kleiner als 50 MB und insgesamt höchstens 100 MB. mimeType muss zur Datei passen. URLs werden während der Verarbeitung abgerufen; ein nicht erreichbares Bild lässt die Aufgabe fehlschlagen, und eine fehlgeschlagene Aufgabe wird nicht berechnet.
Kostenfaktoren
Aktuelle Preise findest du im Preisabschnitt des Modells. gemini-3-pro-image berechnet einen festen Preis pro geliefertem Bild, unabhängig von Größe oder Prompt. gemini-3-pro-image-official rechnet nach Verbrauch ab: Eingabe-Token (Text und Referenzbilder), Text- und Thinking-Ausgabe-Token sowie Bildausgabe-Token, jeweils zu einem eigenen Preis. Die Bildgröße ist der wichtigste Faktor; siehe Tabelle oben.
Die endgültigen Beträge siehst du im Nutzungsverlauf deines Kontos. Fehlgeschlagene Aufgaben werden nicht berechnet.
Ausgabeschema
Die Übermittlung liefert eine Aufgabenreferenz:
{
"id": "task_...",
"model": "gemini-3-pro-image",
"status": "processing",
"created_at": 1790310979
}Aufgabe abfragen
curl https://api.seedrouter.ai/v1/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"Frag alle paar Sekunden ab, bis status den Wert completed oder failed hat. Ein Netzwerk-Timeout beim Abfragen bedeutet nicht, dass die Generierung fehlgeschlagen ist: Behalte die Aufgaben-ID und setze die Abfrage fort. Erstelle keine weitere Aufgabe, um den Fortschritt zu prüfen.
Vollständiges Abfragebeispiel
Führe dies nach dem Python-Übermittlungsbeispiel oben aus.
import time
deadline = time.monotonic() + 600
while time.monotonic() < deadline:
result = requests.get(
f"https://api.seedrouter.ai/v1/tasks/{task_id}",
headers={"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"},
timeout=30,
)
result.raise_for_status()
task = result.json()
if task["status"] == "completed":
for image in task["output"]["data"]:
print(image["url"])
break
if task["status"] == "failed":
raise RuntimeError(task["error"]["message"])
time.sleep(3)
else:
raise TimeoutError(f"Still waiting. Resume polling task {task_id}.")Abgeschlossene Aufgabe
{
"id": "task_...",
"model": "gemini-3-pro-image",
"status": "completed",
"created_at": 1790310979,
"finished_at": 1790311001,
"output": {
"created": 1790310999,
"data": [{"url": "https://static.seedrouter.ai/media/tasks/task_example/0.jpg"}],
"output_format": "jpeg",
"usage": {
"input_tokens": 27,
"output_tokens": 1366,
"total_tokens": 1393,
"output_tokens_details": {"image_tokens": 1120, "text_tokens": 95, "reasoning_tokens": 151}
}
}
}| Feld | Bedeutung |
|---|---|
id | Behalte diese ID für spätere Abfragen. |
status | processing, completed oder failed. |
created_at, finished_at | Unix-Zeitstempel in Sekunden. |
output.data[].url | Die URL des erzeugten Bildes. |
output.text | Text, den das Modell zusätzlich zum Bild zurückgibt, wenn responseModalities den Wert TEXT enthält. Gedanken sind nicht enthalten. |
output.thoughts | Die Gedankenzusammenfassungen des Modells, wenn includeThoughts auf true steht. Zwischenbilder, die das Modell beim Nachdenken zeichnet, werden nicht geliefert. |
output.output_format | Tatsächliches Bildformat. |
output.parts | Die finalen Antwort-Parts in Reihenfolge, für die Bearbeitung über mehrere Turns: {"text", "thoughtSignature"} oder {"image": <index into data>, "thoughtSignature"}. thoughtSignature ist eine URL; sende sie unverändert zurück. |
output.usage | Token-Verbrauch. output_tokens zählt Text-, Thinking- und Bildausgabe; output_tokens_details.image_tokens ist der Bildanteil. |
error | Strukturierter Fehler bei einer fehlgeschlagenen Aufgabe. |
Streaming (streamGenerateContent) wird nicht unterstützt; Ergebnisse werden über die Aufgabe geliefert.
Fehler
Anfragen, die abgelehnt werden, bevor eine Aufgabe entsteht, liefern einen HTTP-Fehler mit einem error-Objekt. Eine Aufgabe, die nach der Annahme fehlschlägt, liefert bei der Abfrage HTTP 200 mit status: "failed" und einem error-Objekt. Ein Bild, das die Sicherheitsfilter des Modells zurückhalten, schlägt mit content_policy_violation fehl; eine Antwort ohne Bild schlägt mit no_output fehl.
Codes, HTTP-Status und Hinweise zu Wiederholungen findest du im gemeinsamen Fehlerkatalog.
{
"id": "task_...",
"status": "failed",
"error": {
"code": 60001,
"message": "The request was rejected by the content policy. Please revise the prompt or input images."
}
}Läuft schon die Übermittlung in einen Timeout, prüfe deinen Aufgabenverlauf, bevor du erneut sendest: Die erste Anfrage wurde möglicherweise bereits angenommen.
Tipps
- Beschreibe Motiv, Umgebung, Licht und Stil in ganzen Sätzen.
- Sag bei einer Bearbeitung, was sich ändern soll und was gleich bleiben muss.
2Kkostet dieselben Bild-Token wie1K; nutze4Kfür Assets in Druckgröße.- Speichere zurückgegebene Bilder in deinem eigenen Speicher, wenn du eine dauerhafte Kopie brauchst.
