Nano Banana Pro (Gemini 3 Pro Image)
Генерация и редактирование изображений в Nano Banana Pro через единую асинхронную конечную точку с телом generateContent от Google: встроенное мышление, вывод 4K, 14 референсов.
Nano Banana Pro (Нано Банана Про) — это модель Gemini 3 Pro Image от Google, созданная для профессиональных изображений и сложных инструкций. Прежде чем рисовать, она размышляет, поэтому в ответах указываются токены рассуждений. Отправьте тело запроса generateContent от Google с полем model, сохраните возвращённый идентификатор задачи и запрашивайте эту задачу, чтобы получить готовое изображение. Референсные изображения передаются в contents как URL в частях fileData.
ID моделей
| ID модели | Канал | Тарификация |
|---|---|---|
gemini-3-pro-image | Standard | Фиксированная цена за каждое доставленное изображение |
gemini-3-pro-image-official | Official | Потокенные тарифы на вход, текстовый вывод и мышление, а также на вывод изображения |
Оба ID принимают одинаковые параметры. Актуальные цены — на странице модели.
Краткий пример
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"}
}
}'Конечная точка
POST https://api.seedrouter.ai/v1/images/generations| Заголовок | Значение |
|---|---|
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/json |
Тело запроса — это запрос generateContent от Google с одним дополнением: полем model, поскольку путь этой конечной точки не содержит модели. В ответе приходит идентификатор задачи, а не готовое изображение. Храните API-ключи в серверном коде. Прямые вызовы /v1beta/models/...:generateContent не поддерживаются; используйте эту конечную точку.
Параметры
| Имя | Тип | Обязательный | По умолчанию | Примечания |
|---|---|---|---|---|
model | string | Да | — | Один из двух ID моделей, указанных выше. |
contents | Content[] | Да | — | От 1 до 32 реплик. У каждой есть parts и необязательная role (user или model); последняя реплика — user. |
contents[].parts[].text | string | — | — | Текстовая часть. Требуется хотя бы одна текстовая часть. |
contents[].parts[].fileData | object | Нет | — | {"mimeType": "...", "fileUri": "https://..."}; референсное изображение. Всего до 14. |
systemInstruction | object | Нет | — | {"parts": [{"text": "..."}]}. |
safetySettings | object[] | Нет | — | Пары {"category", "threshold"}; см. ниже. |
generationConfig.responseModalities | enum[] | Нет | текст и изображение | ["IMAGE"] — только изображения, или ["TEXT", "IMAGE"]. |
generationConfig.imageConfig.aspectRatio | enum | Нет | Соотношение сторон входного изображения, иначе 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 | Нет | 1K | 1K, 2K, 4K. K — заглавная. |
generationConfig.candidateCount | integer | Нет | 1 | Только 1. Один запрос возвращает одно изображение. |
generationConfig.temperature | number | Нет | По умолчанию модели | 0–2. |
generationConfig.topP | number | Нет | По умолчанию модели | 0–1. |
generationConfig.topK | integer | Нет | По умолчанию модели | 1 или больше. |
generationConfig.seed | integer | Нет | — | 32-битное целое число. |
generationConfig.maxOutputTokens | integer | Нет | По умолчанию модели | 1–32 768. |
generationConfig.stopSequences | string[] | Нет | — | До 5. |
generationConfig.mediaResolution | enum | Нет | По умолчанию модели | MEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH. Определяет, сколько токенов расходуют входные медиа. |
generationConfig.thinkingConfig.includeThoughts | boolean | Нет | false | Возвращать сводки размышлений модели в output.thoughts. |
generationConfig.responseFormat.image | object | Нет | — | mimeType: IMAGE_JPEG; delivery: INLINE; aspectRatio и imageSize задаются перечислениями Google, например ASPECT_RATIO_SIXTEEN_BY_NINE и IMAGE_SIZE_TWO_K; доступны те же соотношения сторон и размеры, что и в imageConfig. gemini-3-pro-image-official не принимает это поле. |
Категории безопасности: HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_DANGEROUS_CONTENT. Пороги: BLOCK_NONE, BLOCK_ONLY_HIGH, BLOCK_MEDIUM_AND_ABOVE, BLOCK_LOW_AND_ABOVE, OFF.
Неизвестные поля отклоняются. Пока недоступны: заземление через Google Search (tools) и кэшированный контент; thinkingLevel для этой модели не документирован. inlineData не принимается; передавайте медиа как URL в fileData. responseFormat.image.delivery принимает только INLINE: готовые изображения всегда возвращаются в виде размещённых URL.
Размер вывода
imageSize | Вывод 1:1 | Токены изображения |
|---|---|---|
1K | 1024×1024 | 1 120 |
2K | 2048×2048 | 1 120 |
4K | 4096×4096 | 2 000 |
Другие соотношения сторон сохраняют то же число токенов; например, 16:9 при 1K даёт 1376×768.
Режимы
Отдельного параметра режима или конечной точки для редактирования нет.
| Операция | Параметры |
|---|---|
| Текст в изображение | текстовая часть |
| Редактирование или композиция | текстовая часть + одна или несколько частей fileData |
| Многошаговое редактирование | предыдущие реплики user и model, затем новая реплика user (см. примечание ниже) |
Чтобы продолжить диалог, восстановите реплику model из output.parts предыдущей задачи в том же порядке: текстовая часть превращается в {"text": ..., "thoughtSignature": ...}, а часть с изображением — в {"fileData": {"mimeType": "image/<output_format>", "fileUri": <data[image].url>}, "thoughtSignature": ...}. Сохраняйте каждую thoughtSignature в точности в том виде, в котором она была возвращена: это URL подписи, которую мы сохранили для вас (подпись изображения 4K занимает несколько мегабайт), и мы восстанавливаем её до того, как запрос попадёт к модели. Принимаются только подписи из результатов ваших собственных задач.
Редактирование по референсному изображению
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"}}
]
}]
}'Замените пример URL на адрес своего доступного изображения.
Медиа на входе
Этот API принимает только ссылки в виде URL. Base64 inlineData, URL вида data: и multipart-загрузки не принимаются. Playground загружает выбранные файлы в хранилище, а затем отправляет их URL.
Референсные изображения должны быть публичными HTTP(S)-URL файлов PNG, JPEG, WebP, HEIC или HEIF, каждый меньше 50 МБ и не более 100 МБ в сумме. mimeType должен соответствовать файлу. URL загружаются во время обработки; недоступное изображение приводит к сбою задачи, а неудачная задача не оплачивается.
Параметры тарификации
Актуальные тарифы — в разделе цен модели. gemini-3-pro-image списывает фиксированную цену за каждое доставленное изображение независимо от размера и промпта. gemini-3-pro-image-official тарифицирует по использованию: входные токены (текст и референсные изображения), выходные токены текста и мышления и выходные токены изображения — каждые по своему тарифу. Главный фактор — размер изображения; см. таблицу выше.
Итоговые списания смотрите в истории использования аккаунта. Неудачные задачи не оплачиваются.
Схема ответа
При отправке возвращается ссылка на задачу:
{
"id": "task_...",
"model": "gemini-3-pro-image",
"status": "processing",
"created_at": 1790310979
}Опрос задачи
curl https://api.seedrouter.ai/v1/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"Опрашивайте задачу каждые несколько секунд, пока status не станет completed или failed. Сетевой тайм-аут при опросе не означает, что генерация не удалась: сохраните идентификатор задачи и продолжайте её проверять. Не создавайте новую задачу, чтобы узнать прогресс.
Полный пример опроса
Запустите этот код после примера отправки на Python выше.
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}.")Завершённая задача
{
"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}
}
}
}| Поле | Значение |
|---|---|
id | Сохраните этот ID для последующих запросов. |
status | processing, completed или failed. |
created_at, finished_at | Unix-время в секундах. |
output.data[].url | URL сгенерированного изображения. |
output.text | Текст, который модель вернула вместе с изображением, если responseModalities включает TEXT. Размышления сюда не входят. |
output.thoughts | Сводки размышлений модели, если includeThoughts равно true. Промежуточные изображения, которые модель рисует в процессе размышления, не доставляются. |
output.output_format | Фактический формат изображения. |
output.parts | Итоговые части ответа по порядку, для многошагового редактирования: {"text", "thoughtSignature"} или {"image": <index into data>, "thoughtSignature"}. thoughtSignature — это URL; отправляйте её обратно без изменений. |
output.usage | Расход токенов. output_tokens учитывает вывод текста, мышления и изображения; output_tokens_details.image_tokens — доля изображения. |
error | Структурированная ошибка неудачной задачи. |
Потоковая передача (streamGenerateContent) не поддерживается; результаты доставляются через задачу.
Ошибки
Запросы, отклонённые до создания задачи, возвращают HTTP-ошибку с объектом error. Задача, завершившаяся сбоем после принятия, при запросе возвращает HTTP 200 со status: "failed" и объектом error. Изображение, заблокированное фильтрами безопасности модели, завершается ошибкой content_policy_violation; ответ без изображения — ошибкой no_output.
Коды, HTTP-статусы и рекомендации по повторным попыткам — в общем каталоге ошибок.
{
"id": "task_...",
"status": "failed",
"error": {
"code": 60001,
"message": "The request was rejected by the content policy. Please revise the prompt or input images."
}
}Если тайм-аут произошёл уже при отправке, проверьте историю задач, прежде чем отправлять запрос повторно: первый запрос мог быть принят.
Советы
- Описывайте объект, окружение, освещение и стиль полными предложениями.
- При редактировании укажите, что нужно изменить и что должно остаться прежним.
2Kстоит столько же токенов изображения, сколько1K; для изображений под печать используйте4K.- Сохраняйте полученные изображения в своём хранилище, если нужна долговременная копия.
