Claude Opus 5.5 ya está disponible en SeedRouter
SeedRouter Docs

Nano Banana 2 (Gemini 3.1 Flash Image)

Genera y edita imágenes con Nano Banana 2 a través de un único endpoint asíncrono con el cuerpo de solicitud generateContent de Google: salida hasta 4K y 14 imágenes de referencia.

View Markdown

Nano Banana 2 es el modelo Gemini 3.1 Flash Image de Google. Envía el cuerpo de solicitud generateContent de Google con un campo model, conserva el identificador de tarea devuelto y consulta esa tarea para obtener la imagen terminada. Las imágenes de referencia van en contents como URL fileData.

ID de modelo

ID de modeloCanalFacturación
gemini-3.1-flash-imageStandardUn precio fijo por imagen entregada
gemini-3.1-flash-image-officialOfficialTarifas por token para la entrada, la salida de texto/razonamiento y la salida de imagen

Ambos ID aceptan los mismos parámetros. Consulta la página del modelo para ver los precios actuales.

Ejemplo 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
CabeceraValor
AuthorizationBearer YOUR_API_KEY
Content-Typeapplication/json

El cuerpo es la solicitud generateContent de Google con un único añadido: model, porque este endpoint no lleva el modelo en su ruta. La respuesta contiene un identificador de tarea, no la imagen terminada. Guarda las claves de API en código del lado del servidor. No se admite llamar directamente a /v1beta/models/...:generateContent; usa este endpoint.

Parámetros

NombreTipoObligatorioPredeterminadoNotas
modelstringSí—Uno de los dos ID de modelo anteriores.
contentsContent[]Sí—De 1 a 32 turnos. Cada uno tiene parts y un role opcional (user o model); el último turno es user.
contents[].parts[].textstring——Una parte de texto. Se requiere al menos una parte de texto.
contents[].parts[].fileDataobjectNo—{"mimeType": "...", "fileUri": "https://..."}; una referencia de imagen, vídeo o PDF. Hasta 14 en total.
systemInstructionobjectNo—{"parts": [{"text": "..."}]}.
safetySettingsobject[]No—Pares {"category", "threshold"}; consulta más abajo.
generationConfig.responseModalitiesenum[]Notexto e imagen["IMAGE"] solo para imágenes, o ["TEXT", "IMAGE"].
generationConfig.imageConfig.aspectRatioenumNoRelación de la imagen de entrada; si no, 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.imageSizeenumNo1K512, 1K, 2K, 4K. K en mayúscula.
generationConfig.candidateCountintegerNo1Solo 1. Una solicitud devuelve una imagen.
generationConfig.temperaturenumberNoValor predeterminado del modelo0–2.
generationConfig.topPnumberNoValor predeterminado del modelo0–1.
generationConfig.topKintegerNoValor predeterminado del modelo1 o más.
generationConfig.seedintegerNo—Entero de 32 bits.
generationConfig.maxOutputTokensintegerNoValor predeterminado del modelo1–32.768.
generationConfig.stopSequencesstring[]No—Hasta 5.
generationConfig.mediaResolutionenumNoValor predeterminado del modeloMEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH. Define cuántos tokens usan los medios de entrada.
generationConfig.thinkingConfig.includeThoughtsbooleanNofalseDevuelve los resúmenes de razonamiento del modelo como output.thoughts.
generationConfig.responseFormat.imageobjectNo—mimeType: IMAGE_JPEG; delivery: INLINE; aspectRatio e imageSize como enums de Google, p. ej. ASPECT_RATIO_SIXTEEN_BY_NINE e IMAGE_SIZE_TWO_K, con las mismas relaciones de aspecto y tamaños que imageConfig.

Categorías de seguridad: HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_DANGEROUS_CONTENT. Umbrales: BLOCK_NONE, BLOCK_ONLY_HIGH, BLOCK_MEDIUM_AND_ABOVE, BLOCK_LOW_AND_ABOVE, OFF.

Los campos desconocidos se rechazan. Aún no disponible: grounding con la Búsqueda de Google (tools) y contenido en caché; thinkingLevel no está documentado para este modelo. No se acepta inlineData; pasa los medios como URL fileData. responseFormat.image.delivery solo acepta INLINE: las imágenes terminadas siempre se devuelven como URL alojadas.

Tamaño de salida

imageSizeSalida 1:1Tokens de imagen
512512×512747
1K1024×10241.120
2K2048×20481.680
4K4096×40962.520

Las demás relaciones de aspecto mantienen el mismo número de tokens; por ejemplo, 16:9 en 1K da 1376×768.

Modos

No hay un parámetro de modo ni un endpoint de edición aparte.

OperaciónParámetros
Texto a imagenuna parte de texto
Editar o componerparte de texto + una o más partes fileData
Edición en varios turnosturnos anteriores user y model, y después un nuevo turno user (consulta la nota de abajo)

Para continuar una conversación, reconstruye el turno model a partir de las output.parts de la tarea anterior, en orden: una parte de texto se convierte en {"text": ..., "thoughtSignature": ...} y una parte de imagen en {"fileData": {"mimeType": "image/<output_format>", "fileUri": <data[image].url>}, "thoughtSignature": ...}. Conserva cada thoughtSignature exactamente como se devolvió: es la URL de la firma que guardamos por ti (la firma de una imagen 4K ocupa varios megabytes), y la restauramos antes de que la solicitud llegue al modelo. Solo se aceptan firmas de los resultados de tus propias tareas.

Editar con una imagen de referencia

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"}}
      ]
    }]
  }'

Sustituye la URL de ejemplo por una imagen propia accesible.

Entradas multimedia

Esta API solo acepta referencias por URL. No se aceptan inlineData en base64, URL data: ni subidas multipart. El Playground sube los archivos seleccionados al almacenamiento antes de enviar sus URL.

Las referencias deben ser URL HTTP(S) públicas de menos de 50 MB cada una y 100 MB en total: imágenes (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) o documentos PDF (application/pdf). mimeType debe coincidir con el archivo. Las URL se descargan durante el procesamiento; una imagen inaccesible hace que la tarea falle, y una tarea fallida no se cobra.

Factores de coste

Consulta la sección de precios del modelo para ver las tarifas actuales. gemini-3.1-flash-image cobra un precio fijo por imagen entregada, sin importar el tamaño ni el prompt. gemini-3.1-flash-image-official cobra según el consumo: tokens de entrada (texto e imágenes de referencia), tokens de salida de texto y razonamiento, y tokens de salida de imagen, cada uno con su propia tarifa. El tamaño de la imagen es el factor principal; consulta la tabla anterior.

Consulta los cargos definitivos en el historial de uso de tu cuenta. Las tareas fallidas no se cobran.

Esquema de salida

El envío devuelve una referencia de tarea:

{
  "id": "task_...",
  "model": "gemini-3.1-flash-image",
  "status": "processing",
  "created_at": 1790310979
}

Sondear la tarea

curl https://api.seedrouter.ai/v1/tasks/YOUR_TASK_ID \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY"

Sondea cada pocos segundos hasta que status sea completed o failed. Que se agote el tiempo de red durante el sondeo no significa que la generación haya fallado: conserva el identificador de tarea y reanuda la comprobación. No crees otra tarea para consultar el progreso.

Ejemplo completo de sondeo

Ejecuta esto después del ejemplo de envío en Python anterior.

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}.")

Tarea completada

{
  "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
idConserva este identificador para consultas posteriores.
statusprocessing, completed o failed.
created_at, finished_atMarcas de tiempo Unix en segundos.
output.data[].urlURL de la imagen generada.
output.textTexto que el modelo devolvió junto con la imagen, cuando responseModalities incluye TEXT. No incluye los razonamientos.
output.thoughtsLos resúmenes de razonamiento del modelo, cuando includeThoughts es true. Las imágenes intermedias que el modelo dibuja mientras razona no se entregan.
output.output_formatFormato de imagen real.
output.partsLas partes finales de la respuesta, en orden, para la edición en varios turnos: {"text", "thoughtSignature"} o {"image": <index into data>, "thoughtSignature"}. thoughtSignature es una URL; devuélvela sin cambios.
output.usageUso de tokens. output_tokens cuenta la salida de texto, razonamiento e imagen; output_tokens_details.image_tokens es la parte de imagen.
errorError estructurado en una tarea fallida.

No se admite streaming (streamGenerateContent); los resultados se entregan a través de la tarea.

Errores

Las solicitudes rechazadas antes de crear una tarea devuelven un error HTTP con un objeto error. Una tarea que falla tras ser aceptada devuelve HTTP 200 al consultarla, con status: "failed" y un objeto error. Una imagen retenida por los filtros de seguridad del modelo falla con content_policy_violation; una respuesta sin imagen falla con no_output.

Consulta el catálogo de errores común para ver códigos, estados HTTP y pautas de reintento.

{
  "id": "task_...",
  "status": "failed",
  "error": {
    "code": 60001,
    "message": "The request was rejected by the content policy. Please revise the prompt or input images."
  }
}

Si el propio envío agota el tiempo de espera, revisa tu historial de tareas antes de volver a enviarlo: puede que la primera solicitud ya se haya aceptado.

Consejos

  • Describe el sujeto, el escenario, la iluminación y el estilo con frases completas.
  • En una edición, indica qué debe cambiar y qué debe permanecer igual.
  • Usa 512 o 1K para borradores, y 2K o 4K para los recursos finales.
  • Guarda las imágenes devueltas en tu propio almacenamiento si necesitas una copia duradera.

Relacionado