Nano Banana Pro (Gemini 3 Pro Image)
Genera y edita imágenes con Nano Banana Pro a través de un único endpoint asíncrono con el cuerpo generateContent de Google: razonamiento integrado, salida 4K y 14 referencias.
Nano Banana Pro es el modelo Gemini 3 Pro Image de Google, pensado para recursos profesionales e instrucciones complejas. Razona antes de dibujar, por lo que las respuestas informan tokens de razonamiento. 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 modelo | Canal | Facturación |
|---|---|---|
gemini-3-pro-image | Standard | Un precio fijo por imagen entregada |
gemini-3-pro-image-official | Official | Tarifas 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-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| Cabecera | Valor |
|---|---|
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/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
| Nombre | Tipo | Obligatorio | Predeterminado | Notas |
|---|---|---|---|---|
model | string | Sí | — | Uno de los dos ID de modelo anteriores. |
contents | Content[] | Sí | — | De 1 a 32 turnos. Cada uno tiene parts y un role opcional (user o model); el último turno es user. |
contents[].parts[].text | string | — | — | Una parte de texto. Se requiere al menos una parte de texto. |
contents[].parts[].fileData | object | No | — | {"mimeType": "...", "fileUri": "https://..."}; una imagen de referencia. Hasta 14 en total. |
systemInstruction | object | No | — | {"parts": [{"text": "..."}]}. |
safetySettings | object[] | No | — | Pares {"category", "threshold"}; consulta más abajo. |
generationConfig.responseModalities | enum[] | No | texto e imagen | ["IMAGE"] solo para imágenes, o ["TEXT", "IMAGE"]. |
generationConfig.imageConfig.aspectRatio | enum | No | Relación de la imagen de entrada; si no, 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 | No | 1K | 1K, 2K, 4K. K en mayúscula. |
generationConfig.candidateCount | integer | No | 1 | Solo 1. Una solicitud devuelve una imagen. |
generationConfig.temperature | number | No | Valor predeterminado del modelo | 0–2. |
generationConfig.topP | number | No | Valor predeterminado del modelo | 0–1. |
generationConfig.topK | integer | No | Valor predeterminado del modelo | 1 o más. |
generationConfig.seed | integer | No | — | Entero de 32 bits. |
generationConfig.maxOutputTokens | integer | No | Valor predeterminado del modelo | 1–32.768. |
generationConfig.stopSequences | string[] | No | — | Hasta 5. |
generationConfig.mediaResolution | enum | No | Valor predeterminado del modelo | MEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH. Define cuántos tokens usan los medios de entrada. |
generationConfig.thinkingConfig.includeThoughts | boolean | No | false | Devuelve los resúmenes de razonamiento del modelo como output.thoughts. |
generationConfig.responseFormat.image | object | No | — | 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. gemini-3-pro-image-official no lo acepta. |
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
imageSize | Salida 1:1 | Tokens de imagen |
|---|---|---|
1K | 1024×1024 | 1.120 |
2K | 2048×2048 | 1.120 |
4K | 4096×4096 | 2.000 |
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ón | Parámetros |
|---|---|
| Texto a imagen | una parte de texto |
| Editar o componer | parte de texto + una o más partes fileData |
| Edición en varios turnos | turnos 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-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"}}
]
}]
}'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 imágenes de referencia deben ser URL HTTP(S) públicas que apunten a archivos PNG, JPEG, WebP, HEIC o HEIF, de menos de 50 MB cada una y 100 MB en total. 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-pro-image cobra un precio fijo por imagen entregada, sin importar el tamaño ni el prompt. gemini-3-pro-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-pro-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-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 | Conserva este identificador para consultas posteriores. |
status | processing, completed o failed. |
created_at, finished_at | Marcas de tiempo Unix en segundos. |
output.data[].url | URL de la imagen generada. |
output.text | Texto que el modelo devolvió junto con la imagen, cuando responseModalities incluye TEXT. No incluye los razonamientos. |
output.thoughts | Los 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_format | Formato de imagen real. |
output.parts | Las 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.usage | Uso de tokens. output_tokens cuenta la salida de texto, razonamiento e imagen; output_tokens_details.image_tokens es la parte de imagen. |
error | Error 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.
2Kcuesta los mismos tokens de imagen que1K; usa4Kpara recursos de tamaño de impresión.- Guarda las imágenes devueltas en tu propio almacenamiento si necesitas una copia duradera.
