gemini-3-pro-image (Nano Banana Pro) через APIYI. Она объясняет структуру выходного JSON-ответа и то, что на самом деле означает каждое поле usageMetadata, а также проясняет несколько особенностей подсчета, которые выглядят как аномалии, но являются неотъемлемой частью модели. Все выводы получены в ходе тестирования на production-шлюзе (48 запросов text-to-image + 18 запросов image-edit) и сверены с официальной документацией Google (ai.google.dev/gemini-api/docs/image-generation), а не основаны на предположениях.
Общая структура ответа
Серия APIYI Nano Banana использует нативный формат Google. В ответе всегда есть четыре поля верхнего уровня:При успешной генерации
Когда заблокировано политиками безопасности
Код состояния HTTP по-прежнему 200; различие находится внутри candidate:- Было замечено три значения
finishReason:IMAGE_SAFETY(выходное изображение нарушает политику),PROHIBITED_CONTENT(сработала политика запрещённого использования, с пояснительнымfinishMessage), иNO_IMAGE(изображение не сгенерировано, обычно возвращается в течение нескольких секунд). - Пояснение об отказе находится в поле
finishMessage— оно не появляется как текстовая часть внутриparts. - Ваш код разбора должен обрабатывать то, что
partsравноnull, иначе заблокированные ответы вызовут сбой.
Значения полей usageMetadata
У успешных генераций всегда 6 полей:
Количество token для изображений определяется уровнем разрешения, а не соотношением сторон: 1120 token на изображение как на уровне 1K, так и на уровне 2K, 2000 на изображение на уровне 4K. Соотношение сторон влияет только на размеры пикселей, но никогда — на количество token. Когда в одном ответе возвращается N изображений, детали в точности равны N × значению на одно изображение.
Таблица ниже — это официальный справочник Google по соотношению сторон и размерам изображений для Pro Image (источник:
ai.google.dev/gemini-api/docs/image-generation), полностью совпадающий с нашими измерениями gemini-3-pro-image:
В официальной таблице Google заголовок столбца
1K tokens означает «количество token для уровня разрешения 1K» — фактическое количество token на одно изображение равно значению в ячейке: 1120 token на изображение на уровнях 1K/2K, 2000 на уровне 4K. (В китайской локализации этой страницы заголовок отображается как «1,000 tokens», что легко принять за количество token на одно изображение.) Также обратите внимание: уровень 512px (747 token на изображение) существует только для моделей Flash для генерации изображений — gemini-3-pro-image поддерживает только 1K/2K/4K; Nano Banana 2 Lite (gemini-3.1-flash-lite-image) — особый случай: у нее есть только уровень 1K, без 512px.Три поведения, похожие на аномалии
Поведение 1: candidatesTokenCount ≠ сумма candidatesTokensDetails — нормально и неизбежно
В ходе тестирования 100% выборок (49/49 успешных генераций) показали, чтоcandidatesTokenCount превышает сумму деталей на 88–630 tokens (чем сложнее prompt и чем больше изображений возвращается, тем больше разрыв).
Причина: candidatesTokensDetails учитывает только сам image payload (фиксированные 1120/2000 на каждое изображение), тогда как candidatesTokenCount также включает внутренние tokens, сгенерированные в процессе image generation, для которых нет соответствующей записи по модальности. Это собственная схема подсчета Gemini; APIYI передает ее без изменений.
Итог: не рассматривайте details как полную разбивку
candidatesTokenCount для проверки. Для сверки и тарификации всегда используйте candidatesTokenCount / totalTokenCount; details полезны только для оценки доли изображений.Поведение 2: totalTokenCount ≠ prompt + candidates + thoughts — только в ответах без image output
- При успешной генерации уравнение строго выполняется (49/49):
total = promptTokenCount + candidatesTokenCount + thoughtsTokenCount. - В ответах, заблокированных системой безопасности (без image output), уравнение никогда не выполняется (6/6), при этом наблюдается фиксированный шаблон:
candidatesTokenCount зеркально отражает thoughtsTokenCount, поэтому при суммировании трех полей tokens, отвечающие за thinking, учитываются дважды. Это тоже поведение, присущее upstream. totalTokenCount сам по себе точен — просто используйте его напрямую. Если примерно 10% ответов в ваших логах «не сходятся», проверьте, есть ли в этих ответах пустой parts — это почти наверняка выборки, заблокированные системой безопасности.
Поведение 3: output tokens иногда достигают 6000+ — причина в нескольких частях изображения из процесса thinking
Официальная документация Google указывает, что модели Gemini 3 image являются thinking-моделями: режим «Thinking» включен по умолчанию и не может быть отключен в API. Модель генерирует промежуточные изображения для проверки композиции и логики, а «последнее изображение внутри Thinking также является финальным отрисованным изображением» (источник: раздел Thinking Process вai.google.dev/gemini-api/docs/image-generation).
В наших тестах эти промежуточные черновики thinking возвращаются в native generateContent response как обычные части изображения: каждая часть содержит поле thoughtSignature, но не имеет флага thought: true, и каждая из них учитывается как 1120 tokens в candidatesTokensDetails. В документации Google сказано, что Thinking генерирует не более двух промежуточных изображений, но в сложных task-подобных prompt мы наблюдали до 10 image parts в одном ответе. Использование растет строго линейно с числом изображений:
Поле
thoughtsTokenCount учитывает только text thinking и в тестировании никогда не превышало 400 — источник высоких output tokens заключается в количестве image parts, а не в этом поле. Когда вы видите 6000+ или даже пятизначные output tokens, проверьте число частей в этом ответе — это почти наверняка multi-image ответ и нормальная тарификация (по-прежнему сверяйте с totalTokenCount).
Уровни thinking и две API-парадигмы
Как thinkingLevel влияет на tokens
Управление уровнем thinking поддерживается только Gemini 3.1 Flash Image / Flash Lite Image (generationConfig.thinkingConfig.thinkingLevel, по умолчанию minimal или high); на gemini-3-pro-image thinking всегда включен и его нельзя настроить. Измерено (тот же prompt, 1K text-to-image, через шлюз APIYI):
highonly increases thinking tokens and latency — image tokens stay unchanged (still 1120 per image).- Passing
thinkingLeveltogemini-3-pro-imagedoes not error, but has no measurable effect — thinking tokens stay in the default range. includeThoughts: truechanged neither the response structure nor billing in testing; Google states explicitly that thinking tokens are billed by default whether or not you view the thinking process.- Google also notes that «minimal thinking» does not mean the model does no thinking at all — under
minimalthe usage simply stops listing a separatethoughtsTokenCountfield.
Nano Banana 2 Lite (
gemini-3.1-flash-lite-image) is in the same 3.1 Flash family as Nano Banana 2 and also supports the thinkingLevel control, with the same mechanics as the table above; it hasn’t been separately measured and included in the table yet. For pricing details, see Тарификация серии Nano Banana.Чем thinking tokens image-моделей отличаются от текстовых моделей
- Текстовые thinking-модели: вывод thinking — это текст;
thoughtsTokenCountcan reach thousands and is billed at the output-token price. Officially, pricing is based on the full internal thoughts the model generates, even though the API only returns thought summaries (source: the pricing section ofai.google.dev/gemini-api/docs/thinking). - Image thinking-модели: thinking produces two kinds of output — a small amount of text thinking counted in
thoughtsTokenCount(measured: up to 400 on Pro, ~800 on Flash athigh), and interim draft images, which come back as ordinary image parts billed at 1120/2000 tokens each intocandidatesTokenCount. So for image models the «cost of thinking» mostly shows up in the number of image parts, not in thethoughtsTokenCountfield (see Behavior 3 above).
Две API-парадигмы
Документация Google по image-моделям теперь существует в двух вариантах: классический generateContent API (без состояния) и недавно рекомендованный Interactions API (созданный для agents и tools). Шлюз APIYI использует нативный для Google формат generateContent — вся эта страница основана именно на нем. Отличия, связанные с thinking:
Полное сравнение двух парадигм (эндпоинты, управление состоянием, хранение данных и тесты совместимости шлюза APIYI) см. в Interactions API vs generateContent.
Лучшие практики парсинга и сверки
- Сверяйте тарификацию с
totalTokenCount(это корректно даже при отказах); не проверяйте это, суммируя три поля вручную или суммируя детали. - Итерируйте по частям — никогда не предполагайте одно изображение; любая бизнес-логика на уровне изображения должна опираться на фактическое число частей
inlineData. - Обрабатывайте заблокированные ответы с
parts = null+ HTTP 200, ветвясь поfinishReason. - Простые правки занимают ~22–25 с; сложные задачи (ответы с несколькими изображениями) занимают 35–142 с, дольше при большем числе изображений. Установите тайм-ауты клиента на ≥ 5 минут (включая любой proxy-слой).
Связанные документы
Руководство для разработчиков Nano Banana
Методы интеграции, требования к входным изображениям, основы тарификации, настройки таймаута и пояснение по нескольким изображениям
Руководство по обработке ошибок
Три ключевых индикатора для диагностики неудачных генераций, политики модерации контента и дружественные стратегии prompt
План гарантии на неудачную генерацию
Для сбоев, не вызванных вашим вводом, кредиты возмещаются по числу неудачных запросов
Тарификация Nano Banana
Цена за изображение в зависимости от разрешения и уровней модели