Image
Nano Banana 2.1 (Gemini Nano Banana 2.1)
Bilder mit Nano Banana 2.1 erzeugen und bearbeiten – asynchroner Endpunkt mit Googles generateContent-Body: 1K bis 4K, Thinking-Stufen, 14 Referenzbilder.
Nano Banana 2.1 ist Googles Bildmodell gemini-nano-banana-2.1, das Update von Nano Banana 2. 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 | Abrechnung |
|---|---|
gemini-nano-banana-2.1 | Ein fester Preis pro geliefertem Bild, bei jeder Größe |
Den aktuellen Preis 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-nano-banana-2.1",
"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 | — | gemini-nano-banana-2.1. |
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://..."}; eine Bild-, Video- oder PDF-Referenz. Insgesamt bis zu 14. |
systemInstruction | object | Nein | — | {"parts": [{"text": "..."}]}. |
safetySettings | object[] | Nein | — | Paare aus {"category", "threshold"}; siehe unten. |
tools | object[] | Nein | — | [{"googleSearch": {}}] für die Websuche oder {"googleSearch": {"searchTypes": {"webSearch": {}, "imageSearch": {}}}} mit einem oder beiden Typen. Stützt das Bild auf aktuelle Suchergebnisse; der Preis pro Bild bleibt gleich. |
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, 1:4, 4:1, 1:8, 8: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. 512 ist für dieses Modell nicht verfügbar. |
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.thinkingLevel | enum | Nein | MEDIUM | MINIMAL, MEDIUM, HIGH. Wie viel das Modell vor dem Zeichnen nachdenkt; höhere Stufen dauern länger. |
generationConfig.thinkingConfig.includeThoughts | boolean | Nein | false | Gibt die Gedankenzusammenfassungen des Modells als output.thoughts zurück. |
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: Cached Content und responseFormat; Seitenverhältnis und Größe legst du mit imageConfig fest. inlineData wird nicht akzeptiert; übergib Medien als fileData-URLs.
Ausgabegröße
imageSize | Ausgabe bei 1:1 | Bild-Token |
|---|---|---|
1K | 1024×1024 | 1.120 |
2K | 2048×2048 | 1.680 |
4K | 4096×4096 | 2.520 |
Andere Seitenverhältnisse behalten dieselbe Tokenzahl; 16:9 bei 1K ergibt zum Beispiel 1376×768 und 21:9 bei 4K 6336×2688.
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-nano-banana-2.1",
"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.
Referenzen müssen öffentliche HTTP(S)-URLs sein, jede kleiner als 50 MB und insgesamt höchstens 100 MB: Bilder (image/png, image/jpeg, image/webp, image/heic, image/heif), Videos (video/mp4, video/mpeg, video/mov, video/avi, video/x-flv, video/mpg, video/webm, video/wmv, video/3gpp) oder PDF-Dokumente (application/pdf). 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
Den aktuellen Preis findest du im Preisabschnitt des Modells. gemini-nano-banana-2.1 berechnet einen festen Preis pro geliefertem Bild, unabhängig von Größe, Thinking-Stufe oder Prompt.
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-nano-banana-2.1",
"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-nano-banana-2.1",
"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": 22,
"output_tokens": 2297,
"total_tokens": 2319
}
}
}| 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.grounding_metadata | Mit Google Search: webSearchQueries, imageSearchQueries, searchEntryPoint.renderedContent (das Search-Suggestions-HTML, das du anzeigen musst) und groundingChunks (Quellen), so wie Google sie liefert. |
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. |
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.
- Der Preis ist bei jeder Größe gleich, also fordere die Größe an, die du brauchst:
1Kfür Entwürfe,2Koder4Kfür finale Assets. - Setze den genauen Text, der im Bild erscheinen soll, in Anführungszeichen und halte ihn kurz.
- Nutze die Thinking-Stufe
MINIMALfür schnellere Entwürfe undHIGHfür dichte Layouts wie Infografiken. - Speichere zurückgegebene Bilder in deinem eigenen Speicher, wenn du eine dauerhafte Kopie brauchst.
