Nano Banana Pro (Gemini 3 Pro Image)
Gere e edite imagens com o Nano Banana Pro por um único endpoint assíncrono usando o corpo generateContent do Google: raciocínio integrado, saída 4K e 14 referências.
O Nano Banana Pro é o modelo Gemini 3 Pro Image do Google, feito para imagens profissionais e instruções complexas. Ele raciocina antes de desenhar, por isso as respostas informam tokens de raciocínio. Envie o corpo de requisição generateContent do Google com um campo model, guarde o identificador de tarefa retornado e consulte essa tarefa para obter a imagem pronta. As imagens de referência vão em contents como URLs fileData.
IDs de modelo
| ID de modelo | Canal | Cobrança |
|---|---|---|
gemini-3-pro-image | Standard | Um preço fixo por imagem entregue |
gemini-3-pro-image-official | Official | Tarifas por token para entrada, saída de texto/raciocínio e saída de imagem |
Os dois IDs aceitam os mesmos parâmetros. Veja os preços atuais na página do modelo.
Exemplo rápido
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"}
}
}'Endpoint
POST https://api.seedrouter.ai/v1/images/generations| Cabeçalho | Valor |
|---|---|
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/json |
O corpo é a requisição generateContent do Google com um acréscimo: model, porque este endpoint não traz o modelo no caminho. A resposta contém um identificador de tarefa, não a imagem pronta. Mantenha as chaves de API em código do servidor. Chamar /v1beta/models/...:generateContent diretamente não é suportado; use este endpoint.
Parâmetros
| Nome | Tipo | Obrigatório | Padrão | Observações |
|---|---|---|---|---|
model | string | Sim | — | Um dos dois IDs de modelo acima. |
contents | Content[] | Sim | — | De 1 a 32 turnos. Cada um tem parts e um role opcional (user ou model); o último turno é user. |
contents[].parts[].text | string | — | — | Uma parte de texto. É obrigatória pelo menos uma parte de texto. |
contents[].parts[].fileData | object | Não | — | {"mimeType": "...", "fileUri": "https://..."}; uma imagem de referência. Até 14 no total. |
systemInstruction | object | Não | — | {"parts": [{"text": "..."}]}. |
safetySettings | object[] | Não | — | Pares {"category", "threshold"}; veja abaixo. |
generationConfig.responseModalities | enum[] | Não | texto e imagem | ["IMAGE"] para só imagens, ou ["TEXT", "IMAGE"]. |
generationConfig.imageConfig.aspectRatio | enum | Não | Proporção da imagem de entrada, senão 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 | Não | 1K | 1K, 2K, 4K. K maiúsculo. |
generationConfig.candidateCount | integer | Não | 1 | Só 1. Uma requisição retorna uma imagem. |
generationConfig.temperature | number | Não | Padrão do modelo | De 0 a 2. |
generationConfig.topP | number | Não | Padrão do modelo | De 0 a 1. |
generationConfig.topK | integer | Não | Padrão do modelo | 1 ou mais. |
generationConfig.seed | integer | Não | — | Inteiro de 32 bits. |
generationConfig.maxOutputTokens | integer | Não | Padrão do modelo | De 1 a 32.768. |
generationConfig.stopSequences | string[] | Não | — | Até 5. |
generationConfig.mediaResolution | enum | Não | Padrão do modelo | MEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH. Define quantos tokens a mídia de entrada usa. |
generationConfig.thinkingConfig.includeThoughts | boolean | Não | false | Retorna os resumos de raciocínio do modelo como output.thoughts. |
generationConfig.responseFormat.image | object | Não | — | mimeType: IMAGE_JPEG; delivery: INLINE; aspectRatio e imageSize como enums do Google, por exemplo ASPECT_RATIO_SIXTEEN_BY_NINE e IMAGE_SIZE_TWO_K, com as mesmas proporções e tamanhos de imageConfig. Não aceito por gemini-3-pro-image-official. |
Categorias de segurança: HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_DANGEROUS_CONTENT. Limiares: BLOCK_NONE, BLOCK_ONLY_HIGH, BLOCK_MEDIUM_AND_ABOVE, BLOCK_LOW_AND_ABOVE, OFF.
Campos desconhecidos são recusados. Ainda não disponíveis: grounding com a Pesquisa Google (tools) e conteúdo em cache; thinkingLevel não é documentado para este modelo. inlineData não é aceito; envie a mídia como URLs fileData. responseFormat.image.delivery aceita apenas INLINE: as imagens prontas sempre são retornadas como URLs hospedadas.
Tamanho de saída
imageSize | Saída 1:1 | Tokens de imagem |
|---|---|---|
1K | 1024×1024 | 1.120 |
2K | 2048×2048 | 1.120 |
4K | 4096×4096 | 2.000 |
As outras proporções mantêm a mesma contagem de tokens; por exemplo, 16:9 em 1K dá 1376×768.
Modos
Não há parâmetro de modo separado nem endpoint de edição.
| Operação | Parâmetros |
|---|---|
| Texto para imagem | uma parte de texto |
| Editar ou compor | parte de texto + uma ou mais partes fileData |
| Edição em vários turnos | turnos anteriores de user e model, depois um novo turno user (veja a nota abaixo) |
Para continuar uma conversa, reconstrua o turno model a partir das output.parts da tarefa anterior, na mesma ordem: uma parte de texto vira {"text": ..., "thoughtSignature": ...} e uma parte de imagem vira {"fileData": {"mimeType": "image/<output_format>", "fileUri": <data[image].url>}, "thoughtSignature": ...}. Mantenha cada thoughtSignature exatamente como foi retornada: ela é a URL da assinatura que armazenamos para você (a assinatura de uma imagem 4K tem vários megabytes), e nós a restauramos antes que a requisição chegue ao modelo. Só são aceitas assinaturas dos resultados das suas próprias tarefas.
Editar com uma imagem de referência
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"}}
]
}]
}'Substitua a URL de exemplo por uma imagem sua acessível.
Entradas de mídia
Esta API aceita apenas referências por URL. inlineData em base64, URLs data: e envios multipart não são aceitos. O Playground envia os arquivos selecionados para o armazenamento antes de submeter as URLs deles.
As imagens de referência precisam ser URLs HTTP(S) públicas apontando para arquivos PNG, JPEG, WebP, HEIC ou HEIF, com menos de 50 MB cada e 100 MB no total. mimeType precisa corresponder ao arquivo. As URLs são baixadas durante o processamento; uma imagem inacessível faz a tarefa falhar, e tarefas que falham não são cobradas.
Fatores de custo
Consulte a seção de preços do modelo para as tarifas atuais. O gemini-3-pro-image cobra um preço fixo por imagem entregue, qualquer que seja o tamanho ou o prompt. O gemini-3-pro-image-official cobra pelo uso: tokens de entrada (texto e imagens de referência), tokens de saída de texto e raciocínio e tokens de saída de imagem, cada um com sua própria tarifa. O tamanho da imagem é o fator principal; veja a tabela acima.
Consulte as cobranças finais no histórico de uso da sua conta. Tarefas que falham não são cobradas.
Esquema de saída
O envio retorna uma referência de tarefa:
{
"id": "task_...",
"model": "gemini-3-pro-image",
"status": "processing",
"created_at": 1790310979
}Consultar a tarefa
curl https://api.seedrouter.ai/v1/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"Consulte a cada poucos segundos até que status seja completed ou failed. Um tempo limite de rede durante a consulta não significa que a geração falhou: guarde o identificador da tarefa e retome a verificação. Não crie outra tarefa para acompanhar o progresso.
Exemplo completo de consulta
Execute isto após o exemplo de envio em Python acima.
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}.")Tarefa concluída
{
"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}
}
}
}| Campo | Significado |
|---|---|
id | Guarde este identificador para consultas posteriores. |
status | processing, completed ou failed. |
created_at, finished_at | Marcas de tempo Unix em segundos. |
output.data[].url | A URL da imagem gerada. |
output.text | Texto que o modelo retornou junto com a imagem, quando responseModalities inclui TEXT. Não inclui o raciocínio. |
output.thoughts | Os resumos de raciocínio do modelo, quando includeThoughts é true. Imagens intermediárias que o modelo desenha enquanto raciocina não são entregues. |
output.output_format | Formato real da imagem. |
output.parts | As partes finais da resposta, em ordem, para a edição em vários turnos: {"text", "thoughtSignature"} ou {"image": <index into data>, "thoughtSignature"}. thoughtSignature é uma URL; envie-a de volta sem alterações. |
output.usage | Uso de tokens. output_tokens conta a saída de texto, raciocínio e imagem; output_tokens_details.image_tokens é a parte da imagem. |
error | Erro estruturado em uma tarefa que falhou. |
Streaming (streamGenerateContent) não é suportado; os resultados são entregues pela tarefa.
Erros
Requisições recusadas antes de a tarefa ser criada retornam um erro HTTP com um objeto error. Uma tarefa que falha após ser aceita retorna HTTP 200 na consulta, com status: "failed" e um objeto error. Uma imagem retida pelos filtros de segurança do modelo falha com content_policy_violation; uma resposta sem imagem falha com no_output.
Veja o catálogo de erros compartilhado para códigos, status HTTP e orientações de nova tentativa.
{
"id": "task_...",
"status": "failed",
"error": {
"code": 60001,
"message": "The request was rejected by the content policy. Please revise the prompt or input images."
}
}Se o próprio envio atingir o tempo limite, verifique seu histórico de tarefas antes de enviar de novo: a primeira requisição pode ter sido aceita.
Dicas
- Descreva o tema, o cenário, a iluminação e o estilo em frases completas.
- Em uma edição, diga o que deve mudar e o que precisa ficar igual.
2Kcusta os mesmos tokens de imagem que1K; use4Kpara imagens em tamanho de impressão.- Salve as imagens retornadas no seu próprio armazenamento quando precisar de uma cópia duradoura.
