Nano Banana 2 (Gemini 3.1 Flash Image)
Genera e modifica immagini con Nano Banana 2 tramite un unico endpoint asincrono con il corpo di richiesta generateContent di Google: output fino a 4K e 14 immagini di riferimento.
Nano Banana 2 è il modello Gemini 3.1 Flash Image di Google. Invia il corpo di richiesta generateContent di Google con un campo model, conserva l'identificativo dell'attività restituito e interroga quell'attività per ottenere l'immagine finita. Le immagini di riferimento vanno in contents come URL fileData.
ID modello
| ID modello | Canale | Fatturazione |
|---|---|---|
gemini-3.1-flash-image | Standard | Un prezzo fisso per immagine consegnata |
gemini-3.1-flash-image-official | Official | Tariffe per token distinte per input, output di testo/ragionamento e output di immagine |
Entrambi gli ID accettano gli stessi parametri. Consulta la pagina del modello per i prezzi attuali.
Esempio rapido
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"}
}
}'Endpoint
POST https://api.seedrouter.ai/v1/images/generations| Header | Valore |
|---|---|
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/json |
Il corpo è la richiesta generateContent di Google con una sola aggiunta: model, perché questo endpoint non indica il modello nel percorso. La risposta contiene un identificativo di attività, non l'immagine finita. Tieni le chiavi API nel codice lato server. Chiamare direttamente /v1beta/models/...:generateContent non è supportato; usa questo endpoint.
Parametri
| Nome | Tipo | Obbligatorio | Predefinito | Note |
|---|---|---|---|---|
model | string | Sì | — | Uno dei due ID modello indicati sopra. |
contents | Content[] | Sì | — | Da 1 a 32 turni. Ognuno ha parts e un role facoltativo (user o model); l'ultimo turno è user. |
contents[].parts[].text | string | — | — | Una parte di testo. È obbligatoria almeno una parte di testo. |
contents[].parts[].fileData | object | No | — | {"mimeType": "...", "fileUri": "https://..."}; un riferimento a immagine, video o PDF. Fino a 14 in totale. |
systemInstruction | object | No | — | {"parts": [{"text": "..."}]}. |
safetySettings | object[] | No | — | Coppie {"category", "threshold"}; vedi sotto. |
generationConfig.responseModalities | enum[] | No | testo e immagine | ["IMAGE"] per sole immagini, oppure ["TEXT", "IMAGE"]. |
generationConfig.imageConfig.aspectRatio | enum | No | Proporzioni dell'immagine di input, altrimenti 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 | No | 1K | 512, 1K, 2K, 4K. K maiuscola. |
generationConfig.candidateCount | integer | No | 1 | Solo 1. Una richiesta restituisce un'immagine. |
generationConfig.temperature | number | No | Predefinito del modello | 0–2. |
generationConfig.topP | number | No | Predefinito del modello | 0–1. |
generationConfig.topK | integer | No | Predefinito del modello | 1 o più. |
generationConfig.seed | integer | No | — | Intero a 32 bit. |
generationConfig.maxOutputTokens | integer | No | Predefinito del modello | 1–32.768. |
generationConfig.stopSequences | string[] | No | — | Fino a 5. |
generationConfig.mediaResolution | enum | No | Predefinito del modello | MEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH. Determina quanti token usano i media in input. |
generationConfig.thinkingConfig.includeThoughts | boolean | No | false | Restituisce i riepiloghi del ragionamento del modello come output.thoughts. |
generationConfig.responseFormat.image | object | No | — | mimeType: IMAGE_JPEG; delivery: INLINE; aspectRatio e imageSize come enum di Google, ad es. ASPECT_RATIO_SIXTEEN_BY_NINE e IMAGE_SIZE_TWO_K, con gli stessi rapporti e le stesse dimensioni di imageConfig. |
Categorie di sicurezza: HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_DANGEROUS_CONTENT. Soglie: BLOCK_NONE, BLOCK_ONLY_HIGH, BLOCK_MEDIUM_AND_ABOVE, BLOCK_LOW_AND_ABOVE, OFF.
I campi sconosciuti vengono rifiutati. Non ancora disponibili: grounding con Google Search (tools) e contenuti in cache; thinkingLevel non è documentato per questo modello. inlineData non è accettato; passa i media come URL fileData. responseFormat.image.delivery accetta solo INLINE: le immagini finite vengono sempre restituite come URL ospitati.
Dimensioni di output
imageSize | Output 1:1 | Token immagine |
|---|---|---|
512 | 512×512 | 747 |
1K | 1024×1024 | 1.120 |
2K | 2048×2048 | 1.680 |
4K | 4096×4096 | 2.520 |
Le altre proporzioni mantengono lo stesso numero di token; ad esempio 16:9 a 1K dà 1376×768.
Modalità
Non esiste un parametro di modalità separato né un endpoint di modifica.
| Operazione | Parametri |
|---|---|
| Da testo a immagine | una parte di testo |
| Modifica o composizione | parte di testo + una o più parti fileData |
| Modifica multi-turno | turni user e model precedenti, poi un nuovo turno user (vedi la nota qui sotto) |
Per continuare una conversazione, ricostruisci il turno model a partire dalle output.parts dell'attività precedente, nello stesso ordine: una parte di testo diventa {"text": ..., "thoughtSignature": ...} e una parte immagine diventa {"fileData": {"mimeType": "image/<output_format>", "fileUri": <data[image].url>}, "thoughtSignature": ...}. Conserva ogni thoughtSignature esattamente come è stata restituita: è l'URL della firma che abbiamo salvato per te (la firma di un'immagine 4K occupa diversi megabyte), e la ripristiniamo prima che la richiesta raggiunga il modello. Sono accettate solo le firme provenienti dai risultati delle tue attività.
Modificare con un'immagine di riferimento
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"}}
]
}]
}'Sostituisci l'URL di esempio con una tua immagine accessibile.
Input multimediali
Questa API accetta solo riferimenti tramite URL. Non sono accettati inlineData in base64, URL data: e caricamenti multipart. Il Playground carica i file selezionati nello storage prima di inviarne gli URL.
I riferimenti devono essere URL HTTP(S) pubblici, di meno di 50 MB ciascuno e 100 MB in totale: immagini (image/png, image/jpeg, image/webp, image/heic, image/heif), video (video/mp4, video/mpeg, video/mov, video/avi, video/x-flv, video/mpg, video/webm, video/wmv, video/3gpp) o documenti PDF (application/pdf). mimeType deve corrispondere al file. Gli URL vengono scaricati durante l'elaborazione; un'immagine non raggiungibile fa fallire l'attività, e un'attività fallita non viene addebitata.
Fattori di costo
Consulta la sezione prezzi del modello per le tariffe correnti. gemini-3.1-flash-image addebita un prezzo fisso per immagine consegnata, indipendentemente da dimensione e prompt. gemini-3.1-flash-image-official addebita in base al consumo: token di input (testo e immagini di riferimento), token di output di testo e ragionamento e token di output di immagine, ciascuno con la propria tariffa. La dimensione dell'immagine è il fattore principale; vedi la tabella sopra.
Gli addebiti definitivi sono nello storico di utilizzo del tuo account. Le attività fallite non vengono addebitate.
Schema di output
L'invio restituisce un riferimento all'attività:
{
"id": "task_...",
"model": "gemini-3.1-flash-image",
"status": "processing",
"created_at": 1790310979
}Interrogare l'attività
curl https://api.seedrouter.ai/v1/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"Interroga ogni pochi secondi finché status non diventa completed o failed. Un timeout di rete durante il polling non significa che la generazione sia fallita: conserva l'identificativo dell'attività e riprendi il controllo. Non creare un'altra attività per verificare l'avanzamento.
Esempio di polling completo
Esegui questo dopo l'esempio di invio in Python qui sopra.
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}.")Attività completata
{
"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}
}
}
}| Campo | Significato |
|---|---|
id | Conserva questo identificativo per le interrogazioni successive. |
status | processing, completed o failed. |
created_at, finished_at | Timestamp Unix in secondi. |
output.data[].url | URL dell'immagine generata. |
output.text | Testo restituito dal modello insieme all'immagine, quando responseModalities include TEXT. Il ragionamento non è incluso. |
output.thoughts | I riepiloghi del ragionamento del modello, quando includeThoughts è true. Le immagini intermedie che il modello disegna mentre ragiona non vengono consegnate. |
output.output_format | Formato immagine effettivo. |
output.parts | Le parti finali della risposta, in ordine, per la modifica multi-turno: {"text", "thoughtSignature"} oppure {"image": <index into data>, "thoughtSignature"}. thoughtSignature è un URL; rimandalo senza modifiche. |
output.usage | Utilizzo di token. output_tokens conta l'output di testo, ragionamento e immagine; output_tokens_details.image_tokens è la parte relativa all'immagine. |
error | Errore strutturato per un'attività fallita. |
Lo streaming (streamGenerateContent) non è supportato; i risultati vengono consegnati tramite l'attività.
Errori
Le richieste rifiutate prima della creazione di un'attività restituiscono un errore HTTP con un oggetto error. Un'attività che fallisce dopo l'accettazione restituisce HTTP 200 all'interrogazione, con status: "failed" e un oggetto error. Un'immagine bloccata dai filtri di sicurezza del modello fallisce con content_policy_violation; una risposta senza immagine fallisce con no_output.
Vedi il catalogo errori comune per codici, stati HTTP e indicazioni sui tentativi.
{
"id": "task_...",
"status": "failed",
"error": {
"code": 60001,
"message": "The request was rejected by the content policy. Please revise the prompt or input images."
}
}Se è l'invio stesso ad andare in timeout, controlla lo storico delle attività prima di inviare di nuovo: la prima richiesta potrebbe essere già stata accettata.
Suggerimenti
- Descrivi soggetto, ambientazione, illuminazione e stile con frasi complete.
- Per una modifica, indica cosa deve cambiare e cosa deve restare invariato.
- Usa
512o1Kper le bozze e2Ko4Kper le immagini definitive. - Salva le immagini restituite nel tuo storage se ti serve una copia duratura.
