Nano Banana Pro (Gemini 3 Pro Image)
Generuj i edytuj obrazy w Nano Banana Pro przez jeden asynchroniczny punkt końcowy z treścią generateContent od Google: wbudowane myślenie, wyjście 4K, 14 referencji.
Nano Banana Pro to model Gemini 3 Pro Image od Google, stworzony do profesjonalnych materiałów i złożonych instrukcji. Zanim zacznie rysować, myśli, dlatego odpowiedzi raportują tokeny rozumowania. 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-pro-image | Standard | Stała cena za każdy dostarczony obraz |
gemini-3-pro-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-pro-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://..."}; obraz referencyjny. Łą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, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9. |
generationConfig.imageConfig.imageSize | enum | Nie | 1K | 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. Niedostępne dla gemini-3-pro-image-official. |
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 |
|---|---|---|
1K | 1024×1024 | 1120 |
2K | 2048×2048 | 1120 |
4K | 4096×4096 | 2000 |
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-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"}}
]
}]
}'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.
Obrazy referencyjne muszą być publicznymi adresami URL HTTP(S) do plików PNG, JPEG, WebP, HEIC lub HEIF, każdy mniejszy niż 50 MB i łącznie do 100 MB. 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-pro-image nalicza jedną stałą cenę za każdy dostarczony obraz, niezależnie od rozmiaru i promptu. gemini-3-pro-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-pro-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-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}
}
}
}| 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.
2Kkosztuje tyle samo tokenów obrazu co1K;4Kużywaj do materiałów w rozmiarze do druku.- Zapisz zwrócone obrazy we własnym magazynie, jeśli potrzebujesz trwałej kopii.
