Claude Opus 5.5 já está disponível no SeedRouter
SeedRouter Docs

Nano Banana 2 (Gemini 3.1 Flash Image)

Gere e edite imagens com o Nano Banana 2 por um único endpoint assíncrono usando o corpo de requisição generateContent do Google: saída de até 4K e 14 imagens de referência.

View Markdown

O Nano Banana 2 é o modelo Gemini 3.1 Flash Image do Google. 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 modeloCanalCobrança
gemini-3.1-flash-imageStandardUm preço fixo por imagem entregue
gemini-3.1-flash-image-officialOfficialTarifas 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.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
CabeçalhoValor
AuthorizationBearer YOUR_API_KEY
Content-Typeapplication/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

NomeTipoObrigatórioPadrãoObservações
modelstringSim—Um dos dois IDs de modelo acima.
contentsContent[]Sim—De 1 a 32 turnos. Cada um tem parts e um role opcional (user ou model); o último turno é user.
contents[].parts[].textstring——Uma parte de texto. É obrigatória pelo menos uma parte de texto.
contents[].parts[].fileDataobjectNão—{"mimeType": "...", "fileUri": "https://..."}; uma referência de imagem, vídeo ou PDF. Até 14 no total.
systemInstructionobjectNão—{"parts": [{"text": "..."}]}.
safetySettingsobject[]Não—Pares {"category", "threshold"}; veja abaixo.
generationConfig.responseModalitiesenum[]Nãotexto e imagem["IMAGE"] para só imagens, ou ["TEXT", "IMAGE"].
generationConfig.imageConfig.aspectRatioenumNãoProporção da imagem de entrada, senão 1:11: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.imageSizeenumNão1K512, 1K, 2K, 4K. K maiúsculo.
generationConfig.candidateCountintegerNão1Só 1. Uma requisição retorna uma imagem.
generationConfig.temperaturenumberNãoPadrão do modeloDe 0 a 2.
generationConfig.topPnumberNãoPadrão do modeloDe 0 a 1.
generationConfig.topKintegerNãoPadrão do modelo1 ou mais.
generationConfig.seedintegerNão—Inteiro de 32 bits.
generationConfig.maxOutputTokensintegerNãoPadrão do modeloDe 1 a 32.768.
generationConfig.stopSequencesstring[]Não—Até 5.
generationConfig.mediaResolutionenumNãoPadrão do modeloMEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH. Define quantos tokens a mídia de entrada usa.
generationConfig.thinkingConfig.includeThoughtsbooleanNãofalseRetorna os resumos de raciocínio do modelo como output.thoughts.
generationConfig.responseFormat.imageobjectNã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.

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

imageSizeSaída 1:1Tokens de imagem
512512×512747
1K1024×10241.120
2K2048×20481.680
4K4096×40962.520

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çãoParâmetros
Texto para imagemuma parte de texto
Editar ou comporparte de texto + uma ou mais partes fileData
Edição em vários turnosturnos 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.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"}}
      ]
    }]
  }'

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 referências precisam ser URLs HTTP(S) públicas, com menos de 50 MB cada e 100 MB no total: imagens (image/png, image/jpeg, image/webp, image/heic, image/heif), vídeos (video/mp4, video/mpeg, video/mov, video/avi, video/x-flv, video/mpg, video/webm, video/wmv, video/3gpp) ou documentos PDF (application/pdf). 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.1-flash-image cobra um preço fixo por imagem entregue, qualquer que seja o tamanho ou o prompt. O gemini-3.1-flash-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.1-flash-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.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}
    }
  }
}
CampoSignificado
idGuarde este identificador para consultas posteriores.
statusprocessing, completed ou failed.
created_at, finished_atMarcas de tempo Unix em segundos.
output.data[].urlA URL da imagem gerada.
output.textTexto que o modelo retornou junto com a imagem, quando responseModalities inclui TEXT. Não inclui o raciocínio.
output.thoughtsOs 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_formatFormato real da imagem.
output.partsAs 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.usageUso de tokens. output_tokens conta a saída de texto, raciocínio e imagem; output_tokens_details.image_tokens é a parte da imagem.
errorErro 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.
  • Use 512 ou 1K para rascunhos e 2K ou 4K para as imagens finais.
  • Salve as imagens retornadas no seu próprio armazenamento quando precisar de uma cópia duradoura.

Relacionados