Claude Opus 5.5 ya está disponible en SeedRouter
LogoSeedRouter

Busca modelos por nombre, p. ej. 'nano banana'

Busca modelos por nombre, p. ej. 'nano banana'

Image

Nano Banana 2.1 (Gemini Nano Banana 2.1)

View Markdown

Genera y edita imágenes con Nano Banana 2.1 en un endpoint asíncrono con el cuerpo generateContent de Google: 1K a 4K, niveles de razonamiento, 14 referencias.

Nano Banana 2.1 es el modelo de imagen gemini-nano-banana-2.1 de Google, la actualización de Nano Banana 2. 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 modeloFacturación
gemini-nano-banana-2.1Un precio fijo por imagen entregada, en cualquier tamaño

Consulta la página del modelo para ver el precio actual.

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

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í—gemini-nano-banana-2.1.
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.
toolsobject[]No—[{"googleSearch": {}}] para la búsqueda web, o {"googleSearch": {"searchTypes": {"webSearch": {}, "imageSearch": {}}}} con uno o ambos tipos. Basa la imagen en resultados de búsqueda en tiempo real; el precio por imagen no cambia.
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.imageSizeenumNo1K1K, 2K, 4K. K en mayúscula. 512 no está disponible para este modelo.
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.thinkingLevelenumNoMEDIUMMINIMAL, MEDIUM, HIGH. Cuánto razona el modelo antes de dibujar; los niveles más altos tardan más.
generationConfig.thinkingConfig.includeThoughtsbooleanNofalseDevuelve los resúmenes de razonamiento del modelo como output.thoughts.

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: contenido en caché y responseFormat; define la relación de aspecto y el tamaño con imageConfig. No se acepta inlineData; pasa los medios como URL fileData.

Tamaño de salida

imageSizeSalida 1:1Tokens de imagen
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, y 21:9 en 4K da 6336×2688.

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

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 el precio actual. gemini-nano-banana-2.1 cobra un precio fijo por imagen entregada, sin importar el tamaño, el nivel de razonamiento ni el prompt.

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-nano-banana-2.1",
  "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-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
    }
  }
}
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.grounding_metadataCon la Búsqueda de Google: webSearchQueries, imageSearchQueries, searchEntryPoint.renderedContent (el HTML de Search Suggestions que debes mostrar) y groundingChunks (fuentes), tal como los devuelve Google.
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.
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.
  • El precio es el mismo en cualquier tamaño, así que pide el que necesites: 1K para borradores, 2K o 4K para los recursos finales.
  • Pon entre comillas el texto exacto que quieres que aparezca y mantenlo corto.
  • Usa el razonamiento MINIMAL para borradores más rápidos y HIGH para diseños densos como infografías.
  • Guarda las imágenes devueltas en tu propio almacenamiento si necesitas una copia duradera.

Relacionado