Image
Nano Banana 2.1 (Gemini Nano Banana 2.1)
Twórz i edytuj obrazy z Nano Banana 2.1 przez asynchroniczny endpoint z treścią generateContent od Google: 1K–4K, poziomy rozumowania, 14 referencji.
Nano Banana 2.1 to model obrazowy gemini-nano-banana-2.1 od Google, aktualizacja Nano Banana 2. 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 | Rozliczanie |
|---|---|
gemini-nano-banana-2.1 | Stała cena za każdy dostarczony obraz, w każdym rozmiarze |
Aktualną cenę 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-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"}
}
}'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 | — | gemini-nano-banana-2.1. |
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. |
tools | object[] | Nie | — | [{"googleSearch": {}}] dla wyszukiwania w sieci albo {"googleSearch": {"searchTypes": {"webSearch": {}, "imageSearch": {}}}} z jednym lub oboma typami. Opiera obraz na aktualnych wynikach wyszukiwania; cena za obraz się nie zmienia. |
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 | 1K, 2K, 4K. Wielka litera K. 512 nie jest dostępny dla tego modelu. |
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.thinkingLevel | enum | Nie | MEDIUM | MINIMAL, MEDIUM, HIGH. Jak długo model rozumuje przed rysowaniem; wyższe poziomy trwają dłużej. |
generationConfig.thinkingConfig.includeThoughts | boolean | Nie | false | Zwraca podsumowania myśli modelu jako output.thoughts. |
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: zawartość z pamięci podręcznej i responseFormat; proporcje i rozmiar ustawiasz w imageConfig. inlineData nie jest akceptowane; przekazuj multimedia jako adresy URL fileData.
Rozmiar wyjściowy
imageSize | Wyjście 1:1 | Tokeny obrazu |
|---|---|---|
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, a 21:9 przy 4K daje 6336×2688.
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-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"}}
]
}]
}'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
Aktualną cenę sprawdzisz w sekcji cen modelu. gemini-nano-banana-2.1 nalicza jedną stałą cenę za każdy dostarczony obraz, niezależnie od rozmiaru, poziomu rozumowania i promptu.
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-nano-banana-2.1",
"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-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
}
}
}| 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.grounding_metadata | Z wyszukiwarką Google: webSearchQueries, imageSearchQueries, searchEntryPoint.renderedContent (HTML Search Suggestions, który musisz wyświetlić) i groundingChunks (źródła) — tak, jak zwraca je Google. |
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, rozumowanie i wyjście obrazowe. |
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.
- Cena jest taka sama w każdym rozmiarze, więc zamawiaj rozmiar, którego potrzebujesz:
1Kdo szkiców,2Klub4Kdo finalnych materiałów. - Ujmij w cudzysłów dokładny tekst, który ma się pojawić na obrazie, i pisz go krótko.
- Używaj rozumowania
MINIMALdo szybszych szkiców, aHIGHdo gęstych układów, takich jak infografiki. - Zapisz zwrócone obrazy we własnym magazynie, jeśli potrzebujesz trwałej kopii.
