Claude Opus 5.5 уже доступна в SeedRouter
SeedRouter Docs

Nano Banana 2 (Gemini 3.1 Flash Image)

Генерация и редактирование изображений в Nano Banana 2 через единую асинхронную конечную точку с телом запроса generateContent от Google: вывод до 4K и до 14 референсных изображений.

View Markdown

Nano Banana 2 (Нано Банана 2) — это модель Gemini 3.1 Flash Image от Google. Отправьте тело запроса generateContent от Google с полем model, сохраните возвращённый идентификатор задачи и запрашивайте эту задачу, чтобы получить готовое изображение. Референсные изображения передаются в contents как URL в частях fileData.

ID моделей

ID моделиКаналТарификация
gemini-3.1-flash-imageStandardФиксированная цена за каждое доставленное изображение
gemini-3.1-flash-image-officialOfficialПотокенные тарифы на вход, текстовый вывод и мышление, а также на вывод изображения

Оба ID принимают одинаковые параметры. Актуальные цены — на странице модели.

Краткий пример

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

Конечная точка

POST https://api.seedrouter.ai/v1/images/generations
ЗаголовокЗначение
AuthorizationBearer YOUR_API_KEY
Content-Typeapplication/json

Тело запроса — это запрос generateContent от Google с одним дополнением: полем model, поскольку путь этой конечной точки не содержит модели. В ответе приходит идентификатор задачи, а не готовое изображение. Храните API-ключи в серверном коде. Прямые вызовы /v1beta/models/...:generateContent не поддерживаются; используйте эту конечную точку.

Параметры

ИмяТипОбязательныйПо умолчаниюПримечания
modelstringДа—Один из двух ID моделей, указанных выше.
contentsContent[]Да—От 1 до 32 реплик. У каждой есть parts и необязательная role (user или model); последняя реплика — user.
contents[].parts[].textstring——Текстовая часть. Требуется хотя бы одна текстовая часть.
contents[].parts[].fileDataobjectНет—{"mimeType": "...", "fileUri": "https://..."}; референс-изображение, видео или PDF. Всего до 14.
systemInstructionobjectНет—{"parts": [{"text": "..."}]}.
safetySettingsobject[]Нет—Пары {"category", "threshold"}; см. ниже.
generationConfig.responseModalitiesenum[]Неттекст и изображение["IMAGE"] — только изображения, или ["TEXT", "IMAGE"].
generationConfig.imageConfig.aspectRatioenumНетСоотношение сторон входного изображения, иначе 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.imageSizeenumНет1K512, 1K, 2K, 4K. K — заглавная.
generationConfig.candidateCountintegerНет1Только 1. Один запрос возвращает одно изображение.
generationConfig.temperaturenumberНетПо умолчанию модели0–2.
generationConfig.topPnumberНетПо умолчанию модели0–1.
generationConfig.topKintegerНетПо умолчанию модели1 или больше.
generationConfig.seedintegerНет—32-битное целое число.
generationConfig.maxOutputTokensintegerНетПо умолчанию модели1–32 768.
generationConfig.stopSequencesstring[]Нет—До 5.
generationConfig.mediaResolutionenumНетПо умолчанию моделиMEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH. Определяет, сколько токенов расходуют входные медиа.
generationConfig.thinkingConfig.includeThoughtsbooleanНетfalseВозвращать сводки размышлений модели в output.thoughts.
generationConfig.responseFormat.imageobjectНет—mimeType: IMAGE_JPEG; delivery: INLINE; aspectRatio и imageSize задаются перечислениями Google, например ASPECT_RATIO_SIXTEEN_BY_NINE и IMAGE_SIZE_TWO_K; доступны те же соотношения сторон и размеры, что и в imageConfig.

Категории безопасности: 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Токены изображения
512512×512747
1K1024×10241 120
2K2048×20481 680
4K4096×40962 520

Другие соотношения сторон сохраняют то же число токенов; например, 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.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"}}
      ]
    }]
  }'

Замените пример URL на адрес своего доступного изображения.

Медиа на входе

Этот API принимает только ссылки в виде URL. Base64 inlineData, URL вида data: и multipart-загрузки не принимаются. Playground загружает выбранные файлы в хранилище, а затем отправляет их URL.

Референсы должны быть публичными HTTP(S)-URL, каждый меньше 50 МБ и не более 100 МБ в сумме: изображения (image/png, image/jpeg, image/webp, image/heic, image/heif), видео (video/mp4, video/mpeg, video/mov, video/avi, video/x-flv, video/mpg, video/webm, video/wmv, video/3gpp) или PDF-документы (application/pdf). mimeType должен соответствовать файлу. URL загружаются во время обработки; недоступное изображение приводит к сбою задачи, а неудачная задача не оплачивается.

Параметры тарификации

Актуальные тарифы — в разделе цен модели. gemini-3.1-flash-image списывает фиксированную цену за каждое доставленное изображение независимо от размера и промпта. gemini-3.1-flash-image-official тарифицирует по использованию: входные токены (текст и референсные изображения), выходные токены текста и мышления и выходные токены изображения — каждые по своему тарифу. Главный фактор — размер изображения; см. таблицу выше.

Итоговые списания смотрите в истории использования аккаунта. Неудачные задачи не оплачиваются.

Схема ответа

При отправке возвращается ссылка на задачу:

{
  "id": "task_...",
  "model": "gemini-3.1-flash-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.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}
    }
  }
}
ПолеЗначение
idСохраните этот ID для последующих запросов.
statusprocessing, completed или failed.
created_at, finished_atUnix-время в секундах.
output.data[].urlURL сгенерированного изображения.
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."
  }
}

Если тайм-аут произошёл уже при отправке, проверьте историю задач, прежде чем отправлять запрос повторно: первый запрос мог быть принят.

Советы

  • Описывайте объект, окружение, освещение и стиль полными предложениями.
  • При редактировании укажите, что нужно изменить и что должно остаться прежним.
  • Используйте 512 или 1K для черновиков и 2K или 4K для финальных изображений.
  • Сохраняйте полученные изображения в своём хранилище, если нужна долговременная копия.

См. также