Если Nano Banana Pro возвращает текст вместо изображений, чаще всего причина заключается в отсутствии параметра responseModalities: ["TEXT", "IMAGE"] в конфигурации API. Одно только это исправление решает более 60% случаев. Среди других причин -- слишком расплывчатые промпты, блокировки фильтров безопасности, исчерпанные квоты API или выбор неправильной модели. В этом руководстве рассмотрены все 7 основных причин с рабочими примерами кода на Python и JavaScript, проверенными по официальной документации Google на февраль 2026 года.
Краткое содержание -- Контрольный список быстрого исправления
Прежде чем переходить к подробному анализу, вот самый быстрый путь к решению проблемы, когда Nano Banana Pro выводит только текст без изображений. Большинство разработчиков, столкнувшихся с этой проблемой, могут решить её за пять минут, пройдя этот контрольный список по порядку -- от наиболее частой причины к всё более редким сценариям. Каждое исправление устраняет конкретную причину, и после применения каждого из них следует проверить генерацию изображений, чтобы определить, решена ли проблема.
Шаг 1: Добавьте responseModalities в конфигурацию генерации. Это наиболее распространённая причина, на которую приходится примерно 60% всех обращений с проблемой «только текст, без изображений». Ваш вызов API должен содержать responseModalities: ["TEXT", "IMAGE"] (или response_modalities в Python с соглашением snake_case) в объекте конфигурации генерации. Без этого параметра Gemini API по умолчанию работает в режиме вывода только текста, а значит модель будет описывать изображение словами, а не генерировать пиксельные данные. Ниже в разделе сравнения кода приведён точный синтаксис для Python и JavaScript.
Шаг 2: Убедитесь, что ваш промпт явно запрашивает генерацию изображения. Промпт вроде «закат над горами» неоднозначен -- модель может интерпретировать его как запрос текстового описания, а не изображения. Вместо этого используйте промпты с явными визуальными командами: «Сгенерируй фотореалистичное изображение заката над заснеженными горами с тёплым золотистым светом». Слово «сгенерируй» или «создай» в сочетании с визуальными описаниями сигнализирует модели о необходимости создать изображение вместе с текстовым ответом.
Шаг 3: Проверьте ответ API на наличие индикаторов фильтра безопасности. Если ваш ответ возвращается успешно (HTTP 200), но не содержит данных изображения в массиве parts, проверьте поле finishReason. Значение SAFETY означает, что контент был заблокирован фильтрами безопасности Google. Это скрытый сбой, который застаёт врасплох многих разработчиков, поскольку явного сообщения об ошибке нет -- изображение просто не появляется. Перепишите промпт, чтобы избежать потенциально чувствительного контента, или ознакомьтесь с нашим подробным руководством по устранению проблем с фильтрами безопасности для детальных обходных решений.
Шаг 4: Убедитесь, что у вашего API-ключа достаточная квота и правильный уровень тарификации. Nano Banana Pro (gemini-3-pro-image-preview) не имеет бесплатного тарифа (ai.google.dev/pricing, проверено 2026-02-19). Вам необходим активный платёжный аккаунт Blaze (с оплатой по мере использования). Если вы видите ошибки HTTP 429, вы достигли лимита запросов -- либо подождите сброса, либо повысьте уровень тарификации. Tier 1 требует завершённой настройки тарификации, Tier 2 -- суммарных расходов от $250 и 30 дней, Tier 3 -- суммарных расходов от $1 000 и 30 дней.
Шаг 5: Перепроверьте идентификатор модели. Убедитесь, что вы используете gemini-3-pro-image-preview для Nano Banana Pro, а не устаревший идентификатор. Некоторые разработчики по ошибке используют gemini-pro или gemini-pro-vision, которые являются моделями предыдущего поколения и не поддерживают нативную генерацию изображений. Идентификатор модели должен совпадать точно, включая суффикс -image-preview.
Почему Nano Banana Pro возвращает текст вместо изображений

Чтобы понять, почему Nano Banana Pro выдаёт текстовые описания вместо реальных изображений, необходимо знать, как устроен конвейер мультимодальной генерации Gemini API «под капотом». В отличие от традиционных API для генерации изображений, таких как DALL-E, где есть отдельный эндпоинт для изображений, который всегда возвращает пиксельные данные, Nano Banana Pro -- это единая мультимодальная модель, способная возвращать текст, изображения или и то, и другое в зависимости от конфигурации. Именно это архитектурное различие является корнем большинства недоразумений, поскольку поведение модели по умолчанию -- генерировать текст, если вы явно не указали включать изображения в вывод.
Модель Gemini 3 Pro Image (gemini-3-pro-image-preview) обрабатывает ваш промпт через единый конвейер вывода, который генерирует чередующиеся текстовые и графические токены. Однако между вашим кодом и моделью находится слой API, и этот слой использует параметр responseModalities для определения типов токенов, включаемых в ответ. Когда responseModalities не задан, API по умолчанию устанавливает значение ["TEXT"], что означает: графические токены модели генерируются внутренне, но затем отбрасываются до того, как ответ дойдёт до вашего приложения. Это не баг -- это задуманное поведение по умолчанию, призванное минимизировать трафик и затраты для чисто текстовых сценариев. В результате модель технически генерирует запрошенное вами изображение, но API отфильтровывает его из ответа ещё до того, как вы его увидите.
Помимо проблемы с конфигурацией, существует ещё шесть дополнительных причин, которые могут препятствовать выводу изображений даже при правильной настройке. Расплывчатые или неоднозначные промпты составляют примерно 20% случаев. Модель интерпретирует естественный язык, и если ваш промпт больше похож на вопрос или запрос описания, чем на команду генерации изображения, она по умолчанию выдаст текстовый ответ даже при включённых модальностях изображения. Блокировки фильтров безопасности составляют ещё около 10% случаев и особенно раздражают, потому что происходят тихо -- вы получаете успешный ответ HTTP 200, но данные изображения просто отсутствуют в теле ответа, и лишь флаг finishReason: "SAFETY", скрытый в метаданных, указывает на то, что произошло.
Остальные причины включают: исчерпание квоты (ошибки HTTP 429 при превышении лимита запросов текущего уровня), неправильный выбор модели (использование идентификатора модели, не поддерживающей вывод изображений), проблемы с региональной доступностью (функция генерации изображений может быть недоступна во всех регионах) и ограничение Files API (использование ссылок fileData вместо inlineData для входных изображений при задачах редактирования, что может вызывать скрытые сбои, как описано на форумах разработчиков Google). Каждая из этих причин имеет специфическую диагностическую сигнатуру и способ исправления, которые мы рассмотрим в последующих разделах.
Исправление #1 -- Правильная настройка responseModalities (решает 60%+ случаев)

Самое результативное исправление проблемы «только текст» в Nano Banana Pro -- добавление параметра responseModalities в конфигурацию генерации. Этот параметр сообщает API, какие типы контента вы хотите получить в ответе, и без явного включения "IMAGE" вы получите только текст. Точное понимание того, где и как установить этот параметр в вашем коде, решит большинство случаев, поэтому давайте рассмотрим правильную реализацию на Python и JavaScript с полными рабочими примерами.
Реализация на Python
SDK Google Generative AI для Python использует соглашение snake_case, поэтому параметр называется response_modalities, а не responseModalities. Ниже приведён полный рабочий пример, демонстрирующий правильную конфигурацию для генерации изображений с Nano Banana Pro. Этот код проверен с пакетом google-generativeai актуальной версии на февраль 2026 года и может быть скопирован напрямую в ваш проект.
pythonimport google.generativeai as genai import base64 genai.configure(api_key="YOUR_API_KEY") # Create the model instance model = genai.GenerativeModel("gemini-3-pro-image-preview") # The critical configuration — without this, you get text only generation_config = { "response_modalities": ["TEXT", "IMAGE"], # Both text AND image "temperature": 0.7, } # Generate content with image output enabled response = model.generate_content( "Generate a photorealistic image of a golden retriever playing in autumn leaves", generation_config=generation_config ) # Process the response — iterate through parts to find image data for part in response.candidates[0].content.parts: if hasattr(part, "inline_data") and part.inline_data: # This is the image data (base64-encoded) image_bytes = base64.b64decode(part.inline_data.data) with open("output.png", "wb") as f: f.write(image_bytes) print(f"Image saved! MIME type: {part.inline_data.mime_type}") elif hasattr(part, "text") and part.text: print(f"Text response: {part.text}")
Самая распространённая ошибка разработчиков -- размещение response_modalities в неправильном месте. Параметр должен находиться внутри словаря generation_config, а не передаваться как отдельный параметр функции generate_content(). Другая частая ошибка -- использование camelCase (responseModalities) вместо snake_case (response_modalities) в Python: SDK ожидает именно Python-соглашение об именовании и молча проигнорирует нераспознанное имя параметра, что означает, что ваш код выполнится без ошибок, но выдаст только текстовый вывод.
Реализация на JavaScript / Node.js
JavaScript SDK использует camelCase, поэтому параметр называется responseModalities. Ниже приведена эквивалентная рабочая реализация для окружения Node.js. Обратите внимание на структуру объекта generationConfig и место его передачи в вызове generateContent, поскольку сигнатура вызова JavaScript API несколько отличается от Python.
javascriptconst { GoogleGenerativeAI } = require("@google/generative-ai"); const fs = require("fs"); const genAI = new GoogleGenerativeAI("YOUR_API_KEY"); const model = genAI.getGenerativeModel({ model: "gemini-3-pro-image-preview", }); // Critical: include responseModalities with "Image" const generationConfig = { responseModalities: ["Text", "Image"], // Note: capitalized in JS SDK temperature: 0.7, }; async function generateImage() { const result = await model.generateContent({ contents: [{ role: "user", parts: [{ text: "Generate a photorealistic image of a golden retriever playing in autumn leaves" }] }], generationConfig: generationConfig, }); const response = result.response; for (const part of response.candidates[0].content.parts) { if (part.inlineData) { // Save the generated image const imageBuffer = Buffer.from(part.inlineData.data, "base64"); fs.writeFileSync("output.png", imageBuffer); console.log(`Image saved! MIME: ${part.inlineData.mimeType}`); } else if (part.text) { console.log(`Text: ${part.text}`); } } } generateImage();
Тонкое различие между SDK Python и JavaScript заключается в регистре значений модальностей. В JavaScript SDK следует использовать "Text" и "Image" (с заглавной буквы), тогда как Python SDK использует "TEXT" и "IMAGE" (полностью заглавными). Использование неправильного регистра может привести к тому, что параметр будет проигнорирован без какой-либо ошибки, вызывая ту же проблему с выводом только текста, которую вы пытаетесь решить. Если вы переносите код между языками, это распространённая ловушка, которую легко пропустить. Для полного пошагового руководства по начальной настройке API см. наше руководство по настройке Nano Banana Pro API.
Исправление #2 -- Составление промптов, оптимизированных для изображений
Даже при правильно настроенном responseModalities качество и конкретность вашего промпта существенно влияют на то, сгенерирует ли Nano Banana Pro изображение или вернётся к текстовому описанию. Модель обрабатывает естественный язык и делает вывод о том, какой тип ответа лучше всего удовлетворит ваш запрос. Если промпт неоднозначен, разговорный или сформулирован как вопрос, модель может решить, что текстовое объяснение -- более подходящий ответ, даже если вывод изображений включён в конфигурации.
Ключевой принцип -- составлять промпты, не оставляющие двусмысленности относительно вашего намерения получить визуальный результат. Это означает использование глаголов действия, связанных с созданием изображений («сгенерируй», «создай», «нарисуй», «визуализируй», «спроектируй»), и включение конкретных визуальных описаний (цвета, композиция, стиль, освещение, перспектива). Разница между промптом, который стабильно генерирует изображения, и промптом, который иногда возвращает текст, часто заключается лишь в том, насколько прямо вы сообщаете о визуальном намерении.
Промпты, которые часто не генерируют изображения, как правило, короткие, расплывчатые или сформулированы как описания, а не как команды. Например, «закат над океаном» можно интерпретировать и как запрос на генерацию изображения, и как запрос информации о закатах. Аналогично, «расскажи о викторианском доме» почти наверняка выдаст текст, поскольку слово «расскажи» сигнализирует о разговорном намерении. Даже «картина заката» без какого-либо глагола генерации достаточно неоднозначна, чтобы модель могла ответить текстовым анализом картин с закатами, а не создать изображение. Модель спроектирована быть полезной в любой интерпретации вашего запроса, а значит бремя явного указания на необходимость визуального вывода лежит на вас.
Промпты, которые стабильно генерируют изображения, включают явный язык генерации и богатые визуальные детали. Вместо «кот» напишите «Сгенерируй фотореалистичное изображение рыжего полосатого кота, сидящего на освещённом солнцем подоконнике, с мягким размытием фона и тёплым послеполуденным светом». Вместо «логотип для технологической компании» напишите «Создай минималистичный дизайн логотипа для технологической компании TechFlow в синих и серебряных тонах с абстрактным волновым паттерном на белом фоне». Дополнительная конкретность не только гарантирует генерацию изображения, но и улучшает качество результата, поскольку у модели больше информации для работы. Для дополнительных техник создания эффективных промптов ознакомьтесь с нашим руководством по продвинутым техникам промпт-инженеринга для Nano Banana Pro.
Вот конкретные примеры «до и после», показывающие, как переписывание промптов влияет на успешность генерации изображений при тестировании с Gemini API:
| Плохой промпт (часто только текст) | Хороший промпт (стабильно генерирует изображение) |
|---|---|
| «горный пейзаж» | «Сгенерируй фотореалистичное изображение заснеженных гор в золотой час с отражением в спокойном альпийском озере» |
| «как выглядит нейронная сеть» | «Создай техническую диаграмму-иллюстрацию архитектуры нейронной сети, показывающую входной, скрытые и выходной слои с соединяющими узлами» |
| «фото продукта наушников» | «Визуализируй профессиональную продуктовую фотографию чёрных матовых накладных наушников на чистом белом фоне с мягким студийным освещением и лёгкой тенью» |
| «милая собака» | «Сгенерируй изображение пушистого щенка золотистого ретривера, сидящего на поляне с полевыми цветами и смотрящего в камеру с игривым выражением, с малой глубиной резкости» |
Исправление #3 -- Работа с фильтрами безопасности и блокировками контента
Блокировки фильтров безопасности -- самая досадная причина, по которой Nano Banana Pro возвращает текст вместо изображений, потому что они срабатывают незаметно. В отличие от ошибки квоты (HTTP 429) или сбоя аутентификации (HTTP 401), блокировка фильтром безопасности возвращает абсолютно нормальный ответ HTTP 200 с валидным JSON -- данные изображения просто отсутствуют в теле ответа. Многие разработчики тратят часы на отладку кода или конфигурации, прежде чем осознают, что проблема не техническая, а связана с содержанием запроса. Понимание того, как работают эти фильтры и как программно их обнаруживать, необходимо для создания надёжных конвейеров генерации изображений.
Фильтры безопасности Google для генерации изображений работают на нескольких уровнях. Первый уровень оценивает входной промпт на наличие потенциально опасных категорий контента, включая насилие, сексуальный контент, разжигание ненависти и опасные действия. Второй уровень оценивает само сгенерированное изображение перед его возвратом, проверяя визуальный контент по тем же категориям безопасности. Каждый уровень может заблокировать вывод изображения независимо, что означает: ваш промпт может пройти входной фильтр, но сгенерированное изображение может быть перехвачено выходным фильтром. Когда это происходит, ответ API содержит поле finishReason со значением "SAFETY", а массив parts либо содержит только текст, либо пуст. Критически важно то, что вы должны активно проверять это условие в коде обработки ответа, а не предполагать, что успешный HTTP-ответ означает получение изображения.
Ниже показано, как программно обнаруживать блокировки фильтров безопасности и реализовать автоматическую корректировку промпта для восстановления после заблокированных запросов. Этот паттерн проверяет метаданные ответа перед попыткой извлечения данных изображения, и если обнаружена блокировка безопасности, переписывает промпт с более мягкими формулировками и повторяет запрос. Для полного разбора поведения фильтров безопасности, включая пограничные случаи и продвинутые обходные решения, см. наше подробное руководство по устранению проблем с фильтрами безопасности.
pythondef generate_image_with_safety_handling(model, prompt, generation_config, max_retries=3): """Generate an image with automatic safety filter detection and retry.""" for attempt in range(max_retries): response = model.generate_content(prompt, generation_config=generation_config) # Check finish reason for safety blocks candidate = response.candidates[0] if candidate.finish_reason.name == "SAFETY": print(f"Attempt {attempt + 1}: Safety filter triggered. Adjusting prompt...") # Soften the prompt and retry prompt = f"Create a family-friendly, artistic illustration: {prompt}" continue # Check if image data actually exists in the response has_image = any( hasattr(part, "inline_data") and part.inline_data for part in candidate.content.parts ) if has_image: return response # Success! # No image but no safety block either — prompt may need to be more explicit print(f"Attempt {attempt + 1}: No image in response. Making prompt more explicit...") prompt = f"Generate a detailed image of: {prompt}" raise Exception(f"Failed to generate image after {max_retries} attempts")
Среди типичных триггеров фильтров безопасности -- промпты, упоминающие реальных людей по имени (особенно публичных персон), запросы фотореалистичных изображений детей, промпты с упоминанием оружия или насилия даже в вымышленном контексте, а также медицинский или анатомический контент. Фильтры спроектированы консервативно, поэтому иногда блокируют контент, который вы можете считать безобидным. Наиболее эффективный обходной путь -- перефразировать промпт, используя более абстрактный или художественный язык. Например, вместо «солдат в сцене битвы» попробуйте «художественная иллюстрация средневекового рыцаря в эпическом фэнтезийном ландшафте». Это передаёт похожую визуальную концепцию, избегая конкретных языковых паттернов, которые активируют фильтр насилия.
Исправление #4 -- Проверка квот, API-ключей и конфигурации модели
Когда конфигурация responseModalities корректна, промпты явно указывают на генерацию изображений, а фильтры безопасности не являются проблемой, следующая категория для расследования -- инфраструктура вашего аккаунта и API. Эти проблемы, как правило, легче диагностировать, поскольку они выдают явные коды ошибок, а не скрытые сбои, но могут вызывать путаницу, когда симптомы пересекаются с проблемой «только текст» -- особенно в случаях, когда API переключается на режим «только текст» при временном исчерпании мощностей генерации изображений, а не возвращает ошибку.
Первое, что следует проверить, -- привязан ли ваш API-ключ к платёжному аккаунту Blaze (с оплатой по мере использования). Возможность генерации изображений в Nano Banana Pro (gemini-3-pro-image-preview) не имеет бесплатного тарифа. Входные токены стоят $2,00 за миллион токенов, а генерация изображений -- примерно $0,134 за изображение в разрешении 1K-2K или $0,24 за изображение в разрешении 4K (ai.google.dev/pricing, проверено 2026-02-19). Если ваша тарификация настроена неправильно, запросы на генерацию изображений могут молча завершаться неудачей или возвращать только текстовые ответы, а не выдавать явную ошибку тарификации. Вы можете проверить статус тарификации в Google Cloud Console в разделе Billing > Account Overview.
Лимиты запросов организованы по уровням (tier), и каждый уровень имеет специфические требования. Tier 1 требует завершённой настройки платного аккаунта. Tier 2 требует суммарных расходов не менее $250 и минимум 30 дней с момента создания аккаунта. Tier 3 требует суммарных расходов не менее $1 000 и 30 дней. Более высокие уровни предоставляют более щедрые лимиты запросов в минуту (RPM) и токенов в минуту (TPM). При достижении лимита API возвращает ошибку HTTP 429 (Too Many Requests). Вам следует реализовать экспоненциальный откат (exponential backoff) в логике повторных попыток, а не повторять запрос немедленно, поскольку быстрые повторы только продлят период ограничения. Для полного справочника по всем кодам ошибок и их значениям обратитесь к нашему полному справочнику кодов ошибок Nano Banana.
Проверка идентификатора модели -- ещё один критически важный чекпоинт. Правильный идентификатор модели для Nano Banana Pro с поддержкой генерации изображений -- gemini-3-pro-image-preview. Типичные ошибки включают использование gemini-pro (базовая текстовая модель без вывода изображений), gemini-pro-vision (модель предыдущего поколения, способная анализировать изображения, но не генерировать их) или gemini-3-pro (которая может по умолчанию работать только в текстовом режиме). Каждая из этих моделей примет ваш промпт и вернёт текстовый ответ без какой-либо ошибки, из-за чего проблема выглядит идентично неправильной настройке responseModalities, тогда как фактическая причина -- вызов модели, которая принципиально не может генерировать изображения. Если вы управляете затратами при большом объёме генерации изображений, рассмотрите использование стороннего агрегатора API, такого как laozhang.ai, который предоставляет доступ к Nano Banana Pro по сниженным тарифам без сложностей управления уровнями тарификации Google Cloud напрямую.
Построение надёжного конвейера генерации изображений
Переходя от отдельных исправлений, реальная задача для продакшн-приложений -- создать конвейер генерации изображений, который автоматически обрабатывает все рассмотренные режимы сбоев и корректно деградирует при возникновении проблем. Наивная реализация, которая просто вызывает generate_content и надеется получить данные изображения, будет периодически давать сбои в продакшене из-за разнообразия потенциальных причин отказа, которые мы обсудили. Что вам нужно -- это надёжная обёртка, которая валидирует конфигурацию, обнаруживает сбои, реализует интеллектуальную логику повторных попыток и предоставляет чёткую диагностическую информацию при возникновении проблем.
Следующая реализация на Python демонстрирует продакшн-уровень конвейера генерации изображений с комплексной обработкой ошибок, автоматическим повтором с экспоненциальным откатом, обнаружением фильтров безопасности и подробным логированием. Это паттерн, который мы рекомендуем для любого приложения, зависящего от надёжной генерации изображений с Nano Banana Pro, и он включает все исправления, рассмотренные в предыдущих разделах, в один переиспользуемый класс.
pythonimport time import base64 import logging from typing import Optional, Tuple import google.generativeai as genai logging.basicConfig(level=logging.INFO) logger = logging.getLogger("image_pipeline") class NanoBananaProPipeline: """Production-ready image generation pipeline for Nano Banana Pro.""" def __init__(self, api_key: str): genai.configure(api_key=api_key) self.model = genai.GenerativeModel("gemini-3-pro-image-preview") self.generation_config = { "response_modalities": ["TEXT", "IMAGE"], "temperature": 0.7, } def generate( self, prompt: str, max_retries: int = 3, save_path: Optional[str] = None ) -> Tuple[Optional[bytes], str]: """ Generate an image with full error handling. Returns: (image_bytes or None, status_message) """ current_prompt = prompt base_delay = 2 # seconds for attempt in range(max_retries): try: logger.info(f"Attempt {attempt + 1}/{max_retries}: Generating image...") response = self.model.generate_content( current_prompt, generation_config=self.generation_config ) # Check for empty response if not response.candidates: logger.warning("Empty candidates list — possible content filter") current_prompt = f"Create an artistic, family-friendly illustration: {prompt}" continue candidate = response.candidates[0] # Check finish reason finish_reason = candidate.finish_reason.name if finish_reason == "SAFETY": logger.warning(f"Safety filter triggered on attempt {attempt + 1}") current_prompt = f"Create a safe, artistic illustration of: {prompt}" continue elif finish_reason == "RECITATION": logger.warning("Recitation filter triggered") current_prompt = f"Generate an original image inspired by: {prompt}" continue # Extract image data from parts image_data = None text_response = "" for part in candidate.content.parts: if hasattr(part, "inline_data") and part.inline_data: image_data = base64.b64decode(part.inline_data.data) elif hasattr(part, "text") and part.text: text_response = part.text if image_data: if save_path: with open(save_path, "wb") as f: f.write(image_data) logger.info(f"Image saved to {save_path}") return image_data, f"Success. Text: {text_response[:100]}..." # No image data — make prompt more explicit logger.warning(f"No image data in response. Text: {text_response[:200]}") current_prompt = f"Generate a detailed visual image (not text): {prompt}" except Exception as e: error_str = str(e) if "429" in error_str: delay = base_delay * (2 ** attempt) logger.warning(f"Rate limited. Waiting {delay}s...") time.sleep(delay) elif "403" in error_str: return None, "Authentication error: check API key and billing" else: logger.error(f"Unexpected error: {e}") if attempt < max_retries - 1: time.sleep(base_delay) else: return None, f"Failed after {max_retries} attempts: {e}" return None, f"Failed to generate image after {max_retries} attempts" # Usage pipeline = NanoBananaProPipeline(api_key="YOUR_API_KEY") image_bytes, status = pipeline.generate( "Generate a photorealistic landscape of Mount Fuji at sunrise", save_path="fuji_sunrise.png" ) print(status)
Этот конвейер автоматически обрабатывает пять различных режимов сбоя: отсутствие данных изображения в ответе (корректирует промпт для большей явности), блокировки фильтров безопасности (переписывает промпт с более безопасными формулировками), ограничение частоты запросов (экспоненциальный откат), ошибки аутентификации (немедленный отказ с понятным сообщением) и непредвиденные исключения (повтор с задержкой). Для продакшн-развёртываний с высокими требованиями к надёжности вы также можете добавить мониторинг и оповещения -- отслеживайте процент успешных запросов с течением времени, и если он падает ниже порога, расследуйте, не изменила ли Google поведение модели или параметры фильтров безопасности. Для команд, которым нужна ещё более высокая надёжность без управления этой сложностью, сторонние провайдеры API, такие как laozhang.ai, предлагают агрегированный доступ со встроенным ограничением частоты запросов, автоматическим переключением на резерв и упрощённой тарификацией, что существенно снижает операционную нагрузку.
Nano Banana Pro против Nano Banana: выбор правильной модели

Часто упускаемая из виду причина проблемы «только текст, без изображений» -- использование совершенно не той модели. Google предлагает две различные модели генерации изображений под брендом Nano Banana, и путаница между ними может привести к проблемам конфигурации, которые трудно диагностировать. Nano Banana Pro (gemini-3-pro-image-preview) -- это премиальная модель с более высоким качеством вывода и продвинутыми возможностями рассуждений, тогда как Nano Banana Standard (gemini-2.5-flash-image) -- более быстрый и экономичный вариант, который по-прежнему создаёт изображения хорошего качества. Обе модели поддерживают генерацию изображений, но имеют разные идентификаторы API, структуры ценообразования и возможности.
Важнейшее различие для целей отладки -- идентификатор модели. Nano Banana Pro использует gemini-3-pro-image-preview, включающий суффикс -image-preview, указывающий на то, что генерация изображений является активной функцией этого варианта модели. Если вы используете gemini-3-pro без суффикса, вы можете получить модель, поддерживающую генерацию текста и понимание изображений (вход), но не генерацию изображений (выход). Это тонкое, но критически важное различие, которое не вызывает никакой ошибки -- модель просто работает в текстовом режиме, потому что выбранный вами вариант не включает функцию генерации изображений. Всегда проверяйте, что идентификатор вашей модели содержит полную строку с суффиксом -image-preview или -image.
С точки зрения ценообразования обе модели требуют оплаты (бесплатного тарифа нет ни для одной). Nano Banana Pro взимает $2,00 за миллион входных токенов и примерно $0,134 за сгенерированное изображение в разрешении 1K-2K, тогда как Nano Banana Standard -- $1,00 за миллион входных токенов и примерно $0,067 за изображение в том же разрешении (ai.google.dev/pricing, проверено 2026-02-19). Это означает, что Nano Banana Standard примерно вдвое дешевле Pro для эквивалентных нагрузок. Обе модели поддерживают одинаковый набор разрешений (1K, 2K, 4K) и соотношений сторон (1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9), поэтому выбор в первую очередь определяется требованиями к качеству в сравнении с бюджетными ограничениями. Для более глубокого анализа выбора между моделями см. наше детальное сравнение Nano Banana Pro и Nano Banana.
Выбирайте Nano Banana Pro, когда ваш сценарий требует максимально возможного качества изображений, когда необходимо, чтобы модель справлялась со сложными сценами с мелкими деталями и точной отрисовкой текста на изображениях, или когда вы комбинируете продвинутое текстовое рассуждение с генерацией изображений в одном взаимодействии. Pro отлично справляется со сложными многокомпонентными промптами и создаёт изображения, точно соответствующие детальным спецификациям.
Выбирайте Nano Banana Standard, когда ваша основная забота -- экономическая эффективность, когда нужно генерировать изображения в большом объёме, или когда скорость генерации важнее максимального качества. Standard лучше подходит для прототипирования, пакетной обработки и приложений, где «достаточно хорошее» качество изображений за половину стоимости -- правильный инженерный компромисс. Обе модели используют одинаковую конфигурацию responseModalities, поэтому исправление проблемы «только текст» идентично вне зависимости от выбранной модели.
Часто задаваемые вопросы
Почему Nano Banana Pro возвращает текстовое описание изображения вместо самого изображения?
Наиболее частая причина -- отсутствие параметра responseModalities: ["TEXT", "IMAGE"] в конфигурации генерации вашего вызова API. Без этого параметра Gemini API по умолчанию работает в режиме вывода только текста. Модель внутренне генерирует изображение, но слой API удаляет данные изображения из ответа до того, как он достигнет вашего приложения. Добавление одного этого параметра решает проблему в более чем 60% зарегистрированных случаев.
Можно ли использовать генерацию изображений Nano Banana Pro бесплатно?
Нет. Nano Banana Pro (gemini-3-pro-image-preview) не имеет бесплатного тарифа. Вам нужен платёжный аккаунт Blaze (с оплатой по мере использования) в Google Cloud. Стоимость входных данных составляет $2,00 за миллион токенов, а генерация изображений -- примерно $0,134 за изображение в стандартном разрешении (ai.google.dev/pricing, проверено 2026-02-19). Если вы ищете более экономичные варианты, Nano Banana Standard (gemini-2.5-flash-image) предлагает аналогичные возможности примерно за половину стоимости.
Что означает finishReason: SAFETY в ответе API?
Это указывает на то, что фильтры безопасности Google заблокировали генерацию изображения по вашему промпту. API возвращает HTTP 200 (успех), но ответ не содержит данных изображения -- это скрытый сбой, который многие разработчики пропускают. Для исправления перефразируйте промпт, избегая контента, который может вызвать срабатывание фильтров безопасности, такого как упоминания реальных людей, насилия или чувствительных тем. Проверяйте поле candidates[0].finish_reason в каждом ответе для программного обнаружения этого состояния.
Почему мой код работает с текстовыми промптами, но не генерирует изображения?
Обычно это означает, что responseModalities не настроен корректно, или вы используете вариант модели, не поддерживающий вывод изображений. Убедитесь, что вы используете gemini-3-pro-image-preview (а не gemini-pro или gemini-3-pro), и подтвердите, что конфигурация генерации включает responseModalities: ["TEXT", "IMAGE"]. Также проверьте правильность регистра для вашего SDK -- Python использует response_modalities (snake_case с значениями в верхнем регистре), тогда как JavaScript использует responseModalities (camelCase со значениями с заглавной буквы).
Как извлечь изображение из ответа API?
Сгенерированное изображение возвращается в виде данных, закодированных в base64, в массиве parts ответа. Переберите response.candidates[0].content.parts и найдите части, имеющие свойство inline_data (или inlineData в JavaScript). Поле data содержит байты изображения в кодировке base64, а поле mime_type сообщает формат изображения (обычно image/png). Декодируйте данные base64 и сохраните в файл или обработайте далее в вашем приложении.
Есть ли разница между использованием Files API и inlineData для редактирования изображений?
Да, и это известная проблема, задокументированная на форумах разработчиков Google. При выполнении задач редактирования изображений (предоставление входного изображения для модификации моделью) использование Files API (fileData) может вызывать скрытые сбои, при которых модель возвращает текст вместо отредактированного изображения. Использование inlineData в формате base64 для входного изображения решает эту проблему. Если ваш рабочий процесс редактирования изображений возвращает текстовые описания вместо модифицированных изображений, переключитесь с fileData на inlineData в качестве метода ввода.
