Обзор
gemini-3-pro-image-preview (то есть Nano Banana Pro) применяет строгие механизмы контроля безопасности контента и будет отклонять несоответствующие запросы на нескольких уровнях. Простое сообщение «сбой генерации» не помогает пользователям понять проблему. Хорошая обработка ошибок должна:
- Точно определять причину отклонения — различать нарушения правил контента, ограничения базы знаний и технические ошибки
- Предоставлять понятные сообщения пользователю — превращать технические ошибки в объяснения, которые легко понять
- Предлагать практические рекомендации — подсказывать пользователям, как изменить запрос, чтобы он сработал
- Сохранять полные технические сведения — для отладки разработчиками
Политика модерации контента Google (Обновление 2026)
Генерация изображений Google использует двухуровневый механизм безопасности:- Настраиваемые фильтры: охватывают четыре категории — домогательства, разжигание ненависти, контент сексуально откровенного характера и опасный контент — и настраиваются через
safetySettings - Встроенные защиты: всегда активны для базовых вредоносных сценариев (например, безопасности детей) и не могут быть отключены через параметры
- Запрещенная политика использования Generative AI:
policies.google.com/terms/generative-ai/use-policy - Справочник по распространенным ошибкам генеративного контента:
ai.google.dev/api/generate-content
Три основных диагностических индикатора
Проверяйте в порядке приоритета, от высшего к низшему:1. candidatesTokenCount (наивысший приоритет) ⭐
- Location:
response.usageMetadata.candidatesTokenCount - Meaning: количество token в сгенерированном API содержимом кандидата
- Rule: значение
0означает, что запрос был полностью отклонён на этапе модерации контента — содержимое кандидата вообще не было сгенерировано. Это самый строгий тип отклонения.
2. finishReason (второй приоритет)
- Location:
response.candidates[0].finishReason - Rule: любое значение, отличное от
STOP, указывает на аномальное завершение, требующее особой обработки
finishReason, связанные с изображениями (обратите внимание, что серия Nano Banana добавила специфичные для изображений значения с префиксом IMAGE_):
3. Пояснение отклонения текста (важно)
- Location:
response.candidates[0].content.parts[].text - Rule: когда
finishReasonравноSTOP, ноpartsсодержит толькоtextи не содержит данных изображения, API возвращает пояснение отклонения, а не изображение. Текст может быть на китайском или английском, например:
Краткая справка по сценариям ошибок
Порядок обработки (порядок принятия решений)
Реализация кода (основное)
Объедините проверки выше в одну функцию парсинга:Сообщения для конечных пользователей
Принципы оформления: ясно и кратко, позитивные рекомендации, практичность, без обвинений. Рекомендуемые шаблоны:- Конечные пользователи: по умолчанию показывайте только дружелюбное объяснение + предложение по исправлению
- Бизнес / поставщики инструментов: по умолчанию раскрывайте технические подробности (
finishReason,candidatesTokenCountи т. д.) - Разработчики: предоставьте переключатель «развернуть/свернуть» для просмотра полного ответа JSON
Лучшие практики
- Проверяйте строго по приоритету:
candidatesTokenCount→finishReason→parts→ извлечение данных → обнаружение ключевых слов - Собирайте текст до проверки thoughtSignature, чтобы не потерять объяснение отказа
- Сохраняйте полный ответ: инструменты разработки и тестирования всегда должны сохранять необработанный JSON для устранения неполадок
- Поддерживайте текст отказа на китайском и английском языках: Google может вернуть текст на китайском или английском, поэтому сопоставление по ключевым словам должно покрывать оба варианта
- Плавная деградация: выдавайте конкретное сообщение, когда интеллектуальное обнаружение успешно срабатывает; иначе показывайте текст API напрямую; иначе используйте дружественное имя
finishReason; и только затем переходите к общему сообщению - Никогда не показывайте «неизвестная ошибка»: всегда включайте практическую рекомендацию или полный ответ
Частые вопросы
Почему один и тот же prompt иногда проходит, а иногда не проходит?
Почему один и тот же prompt иногда проходит, а иногда не проходит?
Как понять, это проблема с контентом или техническая проблема?
Как понять, это проблема с контентом или техническая проблема?
candidatesTokenCount: 0 или finishReason: PROHIBITED_CONTENT → проблема с контентом; Failed to fetch или HTTP-ошибка → техническая проблема; текстовое объяснение API → обычно проблема с контентом.Сколько технической информации должны видеть пользователи-консьюмеры?
Сколько технической информации должны видеть пользователи-консьюмеры?
Нужно ли писать отдельную обработку для каждого finishReason?
Нужно ли писать отдельную обработку для каждого finishReason?
reasonMessages[finishReason] || , а затем отображайте исходное значение.