Nano Banana 2 (Gemini 3.1 Flash Image)
Generuj i edytuj obrazy w Nano Banana 2 przez jeden asynchroniczny punkt końcowy z treścią żądania generateContent od Google: wyjście do 4K i 14 obrazów referencyjnych.
Nano Banana 2 to model Gemini 3.1 Flash Image od Google. Wyślij treść żądania generateContent Google z polem model, zachowaj zwrócony identyfikator zadania i sprawdzaj to zadanie, aby odebrać gotowy obraz. Obrazy referencyjne umieszczasz w contents jako adresy URL fileData.
ID modeli
| ID modelu | Kanał | Rozliczanie |
|---|---|---|
gemini-3.1-flash-image | Standard | Stała cena za każdy dostarczony obraz |
gemini-3.1-flash-image-official | Official | Stawki za tokeny wejściowe, wyjście tekstowe/myślenia i wyjście obrazowe |
Oba ID przyjmują te same parametry. Aktualne ceny znajdziesz na stronie modelu.
Krótki przykład
curl https://api.seedrouter.ai/v1/images/generations \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.1-flash-image",
"contents": [{"parts": [{"text": "A ceramic teapot on a linen tablecloth, soft window light"}]}],
"generationConfig": {
"responseModalities": ["IMAGE"],
"imageConfig": {"aspectRatio": "16:9", "imageSize": "2K"}
}
}'Punkt końcowy
POST https://api.seedrouter.ai/v1/images/generations| Nagłówek | Wartość |
|---|---|
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/json |
Treść to żądanie generateContent Google z jednym dodatkiem: polem model, ponieważ ten punkt końcowy nie zawiera modelu w ścieżce. Odpowiedź zawiera identyfikator zadania, a nie gotowy obraz. Klucze API trzymaj w kodzie po stronie serwera. Bezpośrednie wywołanie /v1beta/models/...:generateContent nie jest obsługiwane; używaj tego punktu końcowego.
Parametry
| Nazwa | Typ | Wymagany | Domyślnie | Uwagi |
|---|---|---|---|---|
model | string | Tak | — | Jedno z dwóch powyższych ID modelu. |
contents | Content[] | Tak | — | Od 1 do 32 tur. Każda ma parts i opcjonalną role (user lub model); ostatnia tura to user. |
contents[].parts[].text | string | — | — | Część tekstowa. Wymagana jest co najmniej jedna część tekstowa. |
contents[].parts[].fileData | object | Nie | — | {"mimeType": "...", "fileUri": "https://..."}; referencja do obrazu, wideo lub pliku PDF. Łącznie do 14. |
systemInstruction | object | Nie | — | {"parts": [{"text": "..."}]}. |
safetySettings | object[] | Nie | — | Pary {"category", "threshold"}; zobacz poniżej. |
generationConfig.responseModalities | enum[] | Nie | tekst i obraz | ["IMAGE"] tylko dla obrazów albo ["TEXT", "IMAGE"]. |
generationConfig.imageConfig.aspectRatio | enum | Nie | Proporcje obrazu wejściowego, w przeciwnym razie 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 | Nie | 1K | 512, 1K, 2K, 4K. Wielka litera K. |
generationConfig.candidateCount | integer | Nie | 1 | Tylko 1. Jedno żądanie zwraca jeden obraz. |
generationConfig.temperature | number | Nie | Domyślna wartość modelu | Od 0 do 2. |
generationConfig.topP | number | Nie | Domyślna wartość modelu | Od 0 do 1. |
generationConfig.topK | integer | Nie | Domyślna wartość modelu | 1 lub więcej. |
generationConfig.seed | integer | Nie | — | Liczba całkowita 32-bitowa. |
generationConfig.maxOutputTokens | integer | Nie | Domyślna wartość modelu | Od 1 do 32 768. |
generationConfig.stopSequences | string[] | Nie | — | Do 5. |
generationConfig.mediaResolution | enum | Nie | Domyślna wartość modelu | MEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH. Określa, ile tokenów zużywają multimedia wejściowe. |
generationConfig.thinkingConfig.includeThoughts | boolean | Nie | false | Zwraca podsumowania myśli modelu jako output.thoughts. |
generationConfig.responseFormat.image | object | Nie | — | mimeType: IMAGE_JPEG; delivery: INLINE; aspectRatio i imageSize jako wartości wyliczeniowe Google, np. ASPECT_RATIO_SIXTEEN_BY_NINE i IMAGE_SIZE_TWO_K, z tymi samymi proporcjami i rozmiarami co w imageConfig. |
Kategorie bezpieczeństwa: HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_DANGEROUS_CONTENT. Progi: BLOCK_NONE, BLOCK_ONLY_HIGH, BLOCK_MEDIUM_AND_ABOVE, BLOCK_LOW_AND_ABOVE, OFF.
Nieznane pola są odrzucane. Jeszcze niedostępne: grounding z wyszukiwarką Google (tools) i zawartość z pamięci podręcznej; thinkingLevel nie jest udokumentowany dla tego modelu. inlineData nie jest akceptowane; przekazuj multimedia jako adresy URL fileData. responseFormat.image.delivery przyjmuje tylko INLINE: gotowe obrazy są zawsze zwracane jako hostowane adresy URL.
Rozmiar wyjściowy
imageSize | Wyjście 1:1 | Tokeny obrazu |
|---|---|---|
512 | 512×512 | 747 |
1K | 1024×1024 | 1120 |
2K | 2048×2048 | 1680 |
4K | 4096×4096 | 2520 |
Pozostałe proporcje obrazu zachowują tę samą liczbę tokenów; na przykład 16:9 przy 1K daje 1376×768.
Tryby
Nie ma osobnego parametru trybu ani punktu końcowego do edycji.
| Operacja | Parametry |
|---|---|
| Tekst na obraz | część tekstowa |
| Edycja lub kompozycja | część tekstowa + co najmniej jedna część fileData |
| Edycja wieloturowa | wcześniejsze tury user i model, a następnie nowa tura user (zobacz uwagę poniżej) |
Aby kontynuować rozmowę, odtwórz turę model z output.parts poprzedniego zadania, zachowując kolejność: część tekstowa staje się {"text": ..., "thoughtSignature": ...}, a część z obrazem staje się {"fileData": {"mimeType": "image/<output_format>", "fileUri": <data[image].url>}, "thoughtSignature": ...}. Zachowaj każdy thoughtSignature dokładnie w takiej postaci, w jakiej został zwrócony: to adres URL podpisu, który przechowujemy dla ciebie (podpis obrazu 4K zajmuje kilka megabajtów), a przed dotarciem żądania do modelu przywracamy go. Akceptowane są tylko podpisy z wyników twoich własnych zadań.
Edycja z obrazem referencyjnym
curl https://api.seedrouter.ai/v1/images/generations \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.1-flash-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"}}
]
}]
}'Zastąp przykładowy adres URL własnym, dostępnym obrazem.
Dane wejściowe multimediów
To API przyjmuje wyłącznie referencje w postaci adresów URL. Base64 inlineData, adresy data: i przesyłanie multipart nie są akceptowane. Playground przesyła wybrane pliki do magazynu, zanim wyśle ich adresy URL.
Referencje muszą być publicznymi adresami URL HTTP(S), każdy mniejszy niż 50 MB i łącznie do 100 MB: obrazy (image/png, image/jpeg, image/webp, image/heic, image/heif), wideo (video/mp4, video/mpeg, video/mov, video/avi, video/x-flv, video/mpg, video/webm, video/wmv, video/3gpp) lub dokumenty PDF (application/pdf). mimeType musi odpowiadać plikowi. Adresy URL są pobierane podczas przetwarzania; niedostępny obraz powoduje niepowodzenie zadania, a nieudane zadanie nie jest rozliczane.
Czynniki wpływające na koszt
Aktualne stawki sprawdzisz w sekcji cen modelu. gemini-3.1-flash-image nalicza jedną stałą cenę za każdy dostarczony obraz, niezależnie od rozmiaru i promptu. gemini-3.1-flash-image-official rozlicza według zużycia: tokeny wejściowe (tekst i obrazy referencyjne), tokeny wyjścia tekstowego i myślenia oraz tokeny wyjścia obrazowego, każde według własnej stawki. Głównym czynnikiem jest rozmiar obrazu; zobacz tabelę powyżej.
Ostateczne opłaty zobaczysz w historii zużycia na swoim koncie. Nieudane zadania nie są rozliczane.
Schemat odpowiedzi
Wysłanie zwraca referencję do zadania:
{
"id": "task_...",
"model": "gemini-3.1-flash-image",
"status": "processing",
"created_at": 1790310979
}Odpytywanie zadania
curl https://api.seedrouter.ai/v1/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"Odpytuj co kilka sekund, aż status będzie completed lub failed. Przekroczenie limitu czasu sieci podczas odpytywania nie oznacza, że generowanie się nie powiodło: zachowaj identyfikator zadania i wznów sprawdzanie. Nie twórz kolejnego zadania, aby sprawdzić postęp.
Pełny przykład odpytywania
Uruchom to po powyższym przykładzie wysłania w Pythonie.
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}.")Zakończone zadanie
{
"id": "task_...",
"model": "gemini-3.1-flash-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": 1525,
"total_tokens": 1552,
"output_tokens_details": {"image_tokens": 1120, "text_tokens": 405, "reasoning_tokens": 0}
}
}
}| Pole | Znaczenie |
|---|---|
id | Zachowaj ten identyfikator na potrzeby kolejnych zapytań. |
status | processing, completed lub failed. |
created_at, finished_at | Znaczniki czasu Unix w sekundach. |
output.data[].url | Adres URL wygenerowanego obrazu. |
output.text | Tekst zwrócony przez model razem z obrazem, gdy responseModalities zawiera TEXT. Myśli nie są uwzględniane. |
output.thoughts | Podsumowania myśli modelu, gdy includeThoughts ma wartość true. Obrazy pośrednie, które model rysuje podczas myślenia, nie są dostarczane. |
output.output_format | Rzeczywisty format obrazu. |
output.parts | Końcowe części odpowiedzi w kolejności, do edycji wieloturowej: {"text", "thoughtSignature"} lub {"image": <index into data>, "thoughtSignature"}. thoughtSignature to adres URL; odeślij go bez zmian. |
output.usage | Zużycie tokenów. output_tokens obejmuje wyjście tekstowe, myślenie i wyjście obrazowe; output_tokens_details.image_tokens to część obrazowa. |
error | Ustrukturyzowany błąd nieudanego zadania. |
Streaming (streamGenerateContent) nie jest obsługiwany; wyniki są dostarczane przez zadanie.
Błędy
Żądania odrzucone przed utworzeniem zadania zwracają błąd HTTP wraz z obiektem error. Zadanie, które zawiodło po przyjęciu, przy odpytaniu zwraca HTTP 200 z status: "failed" i obiektem error. Obraz zablokowany przez filtry bezpieczeństwa modelu kończy się błędem content_policy_violation; odpowiedź bez obrazu kończy się błędem no_output.
Kody, statusy HTTP i wskazówki dotyczące ponawiania znajdziesz we wspólnym katalogu błędów.
{
"id": "task_...",
"status": "failed",
"error": {
"code": 60001,
"message": "The request was rejected by the content policy. Please revise the prompt or input images."
}
}Jeśli limit czasu został przekroczony przy samym wysyłaniu, przed ponownym wysłaniem sprawdź historię zadań: pierwsze żądanie mogło już zostać przyjęte.
Wskazówki
- Opisz obiekt, otoczenie, oświetlenie i styl pełnymi zdaniami.
- Przy edycji wskaż, co ma się zmienić, a co musi pozostać bez zmian.
- Używaj
512lub1Kdo szkiców, a2Klub4Kdo finalnych materiałów. - Zapisz zwrócone obrazy we własnym magazynie, jeśli potrzebujesz trwałej kopii.
