# Nano Banana 2 blockReason OTHER: что значит ошибка и что делать

> Google определяет blockReason OTHER как блокировку запроса по неизвестным причинам: кандидатов нет, правило не названо, на BLOCK_NONE рассчитывать не стоит.

- URL: https://blog.laozhang.ai/ru/posts/nano-banana-2-blockreason-other
- Published: 2026-03-09
- Updated: 2026-10-04
- Author: LaoZhang AI Team (https://blog.laozhang.ai/ru/about)
- Topic: Генерация изображений
- Tags: Nano Banana 2, blockReason OTHER, Gemini API, promptFeedback, finishReason, Nano Banana Pro

---
Ответ `"promptFeedback": {"blockReason": "OTHER"}` от Nano Banana 2 означает ровно то, что написано в справочнике Google: запрос заблокирован по неизвестным причинам (Prompt was blocked due to unknown reasons), кандидатов в ответе нет. Известно, что отказ вынесен до генерации и изображение не создавалось. Неизвестно, какое правило или какая система его вынесли: ответ этого не сообщает. Поэтому любая конкретная «категория» или «уровень фильтра» за OTHER остаётся догадкой, и настройка `BLOCK_NONE` не обязана его снимать.

На практике это значит четыре вещи. Код должен обрабатывать OTHER как отдельный исход, а не как успех и не как повод повторять запрос по кругу. Из ответа нужно сохранить `responseId`, `modelVersion`, `usageMetadata` и весь объект `promptFeedback`. Дальше меняйте в запросе по одной переменной. Если же OTHER получает и заведомо нейтральный запрос, собранные данные пора передавать в Google.

Всё ниже относится к методу `generateContent` (REST, AI Studio, официальные SDK) и моделям `gemini-3.1-flash-image` (Nano Banana 2) и `gemini-3-pro-image` (Nano Banana Pro). Preview-версии `gemini-3.1-flash-image-preview` и `gemini-3-pro-image-preview` Google отключил 25 июня 2026 года ([график отключений](https://ai.google.dev/gemini-api/docs/deprecations)); если они остались в коде, замените ID. Формулировки справочника API приведены по состоянию на 4 октября 2026 года.

## Что Google пишет о blockReason OTHER: запрос заблокирован, причина не названа

Поле `promptFeedback.blockReason` в ответе `GenerateContentResponse` Google описывает так: если оно заполнено, запрос заблокирован и кандидаты не возвращаются; совет справочника — переформулировать запрос (Rephrase the prompt). Возможных значений шесть ([справочник GenerateContent](https://ai.google.dev/api/generate-content#BlockReason)):

| Значение `blockReason` | Как его описывает Google | Что это даёт для разбора |
| --- | --- | --- |
| `BLOCK_REASON_UNSPECIFIED` | значение по умолчанию, не используется | отказа нет |
| `SAFETY` | запрос заблокирован по соображениям безопасности; категорию смотрите в `safetyRatings` | категория указана в `safetyRatings` |
| `OTHER` | запрос заблокирован по неизвестным причинам | ни категории, ни правила |
| `BLOCKLIST` | запрос содержит термины из списка запрещённой терминологии | дело в словах запроса |
| `PROHIBITED_CONTENT` | запрос содержит запрещённое содержимое | тип нарушения назван |
| `IMAGE_SAFETY` | кандидаты заблокированы из-за небезопасного содержимого для генерации изображения | отказ связан с изображением |

Разница видна по соседним строкам. Для `SAFETY` Google прямо отсылает к `safetyRatings`, для `BLOCKLIST` и `PROHIBITED_CONTENT` называет тип нарушения, а для `OTHER` не называет ничего. Сам отказ приходит в теле обычного ответа, а не в объекте `error`. Код, который проверяет только HTTP-статус, примет такой ответ за успешный и потом упадёт на пустом списке `candidates`.

## Три разных OTHER в ответе generateContent: где искать каждый

Слово OTHER встречается в ответе в трёх местах, и это три разные ситуации. Первая касается всего запроса, две другие — отдельного кандидата, который всё-таки был создан ([FinishReason в справочнике](https://ai.google.dev/api/generate-content#FinishReason)).

| Где в JSON | Кандидаты есть? | Как описывает Google | Куда смотреть дальше |
| --- | --- | --- | --- |
| `promptFeedback.blockReason: "OTHER"` | нет | запрос заблокирован по неизвестным причинам | весь объект `promptFeedback`, `responseId`, `modelVersion` |
| `candidates[].finishReason: "OTHER"` | да, генерация остановлена | неизвестная причина (Unknown reason) | `finishMessage` и `safetyRatings` этого кандидата |
| `candidates[].finishReason: "IMAGE_OTHER"` | да, генерация изображения остановлена | остановлена из-за прочей проблемы (other miscellaneous issue) | `finishMessage`, затем разбор ответа без изображения |

Поле `finishMessage` Google заполняет только тогда, когда у кандидата задан `finishReason`, и иногда в нём есть подробности. У отказа на уровне запроса такого поля нет. Порядок проверки в коде поэтому один: сначала `promptFeedback.blockReason`, потом `candidates`. Если запрос заблокирован, смотреть на кандидатов бессмысленно — их нет.

![Три места OTHER в ответе generateContent: promptFeedback.blockReason без кандидатов, finishReason OTHER и IMAGE_OTHER у кандидата, и какие поля смотреть для каждого](https://blog.laozhang.ai/posts/ru/nano-banana-2-blockreason-other/img/three-other-locations.webp)

Рядом стоит значение `NO_IMAGE`: модель должна была вернуть изображение, но не вернула. Это не OTHER, и у него свой порядок разбора. Он, как и остальные причины вида `IMAGE_*`, описан в руководстве [«Nano Banana не генерирует изображение в API: как найти причину»](https://blog.laozhang.ai/ru/posts/nano-banana-2-200-ok-no-image).

## Что известно и что неизвестно при blockReason OTHER

Из ответа с `blockReason: "OTHER"` следует немного, но это твёрдые факты:

- запрос отклонён до генерации, кандидатов нет, изображение не создавалось;
- справочник для любого `blockReason` советует одно: переформулировать запрос. Повтор того же запроса в этом совете не упоминается.

Неизвестным остаётся главное:

- какое правило, классификатор или служба вынесли отказ;
- что именно сработало: текст, референсные изображения или их сочетание;
- повторится ли отказ на том же запросе через минуту.

Без дополнительных данных нельзя утверждать следующее:

- что OTHER — это «фильтр второго уровня», «ненастраиваемая политика» или одна из категорий фиксированного списка. Google не публикует ни такой архитектуры, ни такого списка;
- что запрос обязательно нарушает правила. Для запрещённого содержимого у Google есть отдельное значение `PROHIBITED_CONTENT`. Обратное, что нарушения точно нет, из OTHER тоже не следует;
- что причина в регионе, API-ключе или аккаунте;
- что `BLOCK_NONE` должен убрать отказ.

## Поможет ли BLOCK_NONE при blockReason OTHER: оснований ждать этого нет

Настраиваемые фильтры безопасности в Gemini API охватывают четыре категории: травлю (Harassment), язык вражды (Hate speech), откровенно сексуальное содержимое (Sexually explicit) и опасный контент (Dangerous). Кроме них, есть встроенная защита от тяжёлого вреда, например от содержимого, угрожающего безопасности детей. Такое содержимое блокируется всегда, и эту защиту настроить нельзя. Для моделей Gemini 2.5 и 3 порог, который вы не задали, по умолчанию равен `OFF` ([настройки безопасности](https://ai.google.dev/gemini-api/docs/safety-settings)).

Дальше вывод, а не формулировка Google. `BLOCK_NONE` и `OFF` меняют поведение только этих четырёх категорий. Связь OTHER с ними нигде не описана, а у текущих моделей эти фильтры и без того выключены по умолчанию. Значит, рассчитывать, что `BLOCK_NONE` снимет OTHER, нельзя. С этим совпадает случай со Stack Overflow из следующего раздела: все пороги стояли на `BLOCK_NONE`, а OTHER продолжал приходить.

Настройки безопасности при этом стоит сохранить вместе с ответом: если вы их меняли, это одна из переменных случая.

## Когда разработчики получали OTHER: три сообщения с датами

Это наблюдения отдельных людей, а не правила Google, и относятся они в основном к Nano Banana Pro и preview-ID.

- **29 декабря 2025 года, форум Google AI Developers.** Разработчик, подключивший Nano Banana Pro через AI Studio, получал OTHER примерно на каждый пятый запрос. Логан Килпатрик из Google ответил, что команда переделывает ошибки «Other», потому что в нынешнем виде они бесполезны («Right now it is not helpful the way it is setup»), и рассчитывал выпустить изменения в первые две недели января. Более поздних сообщений в [ветке](https://discuss.ai.google.dev/t/blockreason-other/113496) нет, а справочник API по состоянию на 4 октября 2026 года по-прежнему называет причину OTHER неизвестной.
- **6 февраля 2026 года, Stack Overflow.** Команда на `gemini-3-pro-image-preview` в европейском регионе получала `blockReason: OTHER` на запросах с известными публичными людьми и культурно чувствительными темами. Не помогли ни `BLOCK_NONE` для всех категорий, ни низкое `media_resolution`, ни описания вместо имён ([вопрос](https://stackoverflow.com/questions/79884545)).
- **7 мая 2026 года, форум Google AI Developers.** В AI Studio каждая генерация на `gemini-3-pro-image-preview` с референсными изображениями блокировалась с причиной Other. Сотрудник Google попросил подробности в личных сообщениях, публичного ответа о причине нет ([ветка](https://discuss.ai.google.dev/t/persistent-other-block-reason-error-on-nano-banana-pro-gemini-3-pro-image-preview-with-reference-images/143901)).

Вместе эти случаи показывают, что OTHER приходит и на обычных с виду запросах, и на запросах с референсными изображениями, и на запросах с именами реальных людей. Причину ни один из них не доказывает. В ветке на Stack Overflow единственный ответ, от автора вопроса и с оценкой −1, советует пускать запросы через прокси в США. Это обход ограничений Google, и его результат ничем не подтверждён. Комментатор там же считает OTHER правилом для изображений реальных людей и пишет, что смена региона в основном не помогает, но ссылки на Google тоже не приводит.

## Какие данные сохранить из ответа с blockReason OTHER

Google не публикует обязательного перечня для разбора OTHER. Ниже — поля, которые ответ уже содержит, и параметры запроса, без которых случай не сопоставить с другими и не передать в поддержку:

- `responseId` — идентификатор конкретного ответа;
- `modelVersion` из ответа и ID модели из запроса;
- время запроса в UTC;
- `usageMetadata` целиком: `promptTokenCount`, `candidatesTokenCount`, `thoughtsTokenCount`, `totalTokenCount`;
- весь объект `promptFeedback`, включая `safetyRatings`, даже если массив пуст;
- для каждого кандидата, если они есть, — `finishReason` и `finishMessage`;
- были ли референсные изображения и сколько;
- формат вывода (`responseModalities`) и настройки безопасности, если вы их задавали;
- результат каждой повторной попытки и что в ней изменилось.

Текст запроса и исходные изображения храните у себя, в закрытом хранилище. На форум или в поддержку отправляйте только отредактированные копии: без персональных данных, чужих лиц и коммерческих материалов, которые нельзя показывать.

## Скрипт на Python, который отделяет OTHER от успешного ответа

Скрипт ниже читает сохранённый ответ `generateContent` в формате REST (имена полей в camelCase, как в справочнике) и присваивает ему один из пяти статусов:

- `api_error` — в ответе есть объект `error` (например, 429 или 503);
- `prompt_blocked` — задан любой `blockReason`, кроме `BLOCK_REASON_UNSPECIFIED`, в том числе значение, которого сегодня нет в справочнике;
- `candidate_stopped` — кандидат завершился не с `STOP` (`OTHER`, `IMAGE_OTHER`, `NO_IMAGE` и другие);
- `image_ready` — есть хотя бы одно годное изображение у кандидата с `finishReason: "STOP"`;
- `no_image` — всё остальное, например текст вместо картинки.

Изображение считается годным, только если MIME-тип — PNG, JPEG или WebP, base64 декодируется в непустые байты, Pillow открывает картинку и её формат совпадает с MIME. Части с `thought` (промежуточные изображения рассуждений) пропускаются.

```python
import base64
import binascii
import io
import json
import sys
from pathlib import Path

from PIL import Image, UnidentifiedImageError

FORMATS = {"image/png": "PNG", "image/jpeg": "JPEG", "image/webp": "WEBP"}


def as_dict(value):
    return value if isinstance(value, dict) else {}


def as_list(value):
    return value if isinstance(value, list) else []


def inspect_response(response):
    if not isinstance(response, dict):
        raise ValueError("Верхний уровень ответа должен быть JSON-объектом")

    feedback = as_dict(response.get("promptFeedback"))
    block = feedback.get("blockReason")
    report = {
        "status": "no_image",
        "response_id": response.get("responseId"),
        "model_version": response.get("modelVersion"),
        "usage": response.get("usageMetadata"),
        "block_reason": block,
        "prompt_safety_ratings": as_list(feedback.get("safetyRatings")),
        "candidates": [],
        "images": [],
    }
    if response.get("error"):
        report["status"] = "api_error"
        return report
    # Отказ на уровне запроса проверяется до кандидатов: при нём их нет.
    if block and block != "BLOCK_REASON_UNSPECIFIED":
        report["status"] = "prompt_blocked"
        return report

    candidates = as_list(response.get("candidates"))
    for ci, raw_candidate in enumerate(candidates):
        candidate = as_dict(raw_candidate)
        reason = candidate.get("finishReason")
        entry = {
            "index": ci,
            "finish_reason": reason,
            "finish_message": candidate.get("finishMessage"),
            "safety_ratings": as_list(candidate.get("safetyRatings")),
            "image_issues": [],
        }
        report["candidates"].append(entry)
        content = as_dict(candidate.get("content"))
        for pi, raw_part in enumerate(as_list(content.get("parts"))):
            part = as_dict(raw_part)
            if part.get("thought"):
                continue
            blob = as_dict(part.get("inlineData"))
            if not blob:
                continue
            mime = blob.get("mimeType")
            encoded = blob.get("data")
            problem = None
            data = b""
            if not isinstance(mime, str) or mime not in FORMATS:
                problem = "unsupported_mime"
            elif not isinstance(encoded, str) or not encoded:
                problem = "empty_or_missing_data"
            else:
                try:
                    data = base64.b64decode(encoded, validate=True)
                    if not data:
                        raise ValueError("empty bytes")
                    with Image.open(io.BytesIO(data)) as img:
                        actual_format = img.format
                        img.load()
                    if actual_format != FORMATS[mime]:
                        raise ValueError("MIME does not match image format")
                except (ValueError, binascii.Error, OSError,
                        UnidentifiedImageError, Image.DecompressionBombError):
                    problem = "invalid_image_data"
            if problem:
                entry["image_issues"].append({"part": pi, "reason": problem})
            # Картинка принимается только у кандидата, завершившегося с STOP.
            elif reason == "STOP":
                report["images"].append({
                    "candidate": ci, "part": pi, "mime_type": mime, "data": data
                })
            else:
                entry["image_issues"].append({
                    "part": pi, "reason": "finish_reason_requires_review"
                })

    if report["images"]:
        report["status"] = "image_ready"
    elif any(c["finish_reason"] not in (None, "STOP", "FINISH_REASON_UNSPECIFIED")
             for c in report["candidates"]):
        report["status"] = "candidate_stopped"
    return report


if __name__ == "__main__":
    response = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
    result = inspect_response(response)
    # Не выводим в терминал двоичные данные и полный ответ: только краткую сводку.
    print(json.dumps({
        "status": result["status"],
        "block_reason": result["block_reason"],
        "finish_reasons": [c["finish_reason"] for c in result["candidates"]],
        "image_count": len(result["images"]),
        "image_issues": [c["image_issues"] for c in result["candidates"]],
    }, ensure_ascii=False, indent=2))
```

Запуск: `pip install pillow`, затем `python3 inspect_response.py response.json`. Для ответа с `{"promptFeedback": {"blockReason": "OTHER"}}` скрипт печатает `"status": "prompt_blocked"`, `"block_reason": "OTHER"` и пустые `finish_reasons`. Если вы вызываете модель через Python SDK, там поля названы в snake_case (`block_reason`), а скрипт рассчитан на JSON в формате REST, а не на объект SDK.

Скрипт прогнан на 29 вручную собранных ответах: отсутствующие и пустые `candidates`, OTHER на уровне запроса и кандидата, новое неизвестное значение `blockReason`, битый base64, поддельный PNG, неверный MIME, изображение в части `thought`, OTHER вместе с картинкой, ошибка API и другие. Все 29 случаев прошли 4 октября 2026 года на Python 3.12.1 с Pillow 12.0.0. Это проверка разбора JSON, а не вызовов Gemini API: к модели при тесте не было ни одного запроса, и как часто Google возвращает OTHER, скрипт не показывает.

Что делать с каждым статусом в своём коде:

- `prompt_blocked` — не ставить запрос в очередь автоматических повторов, сохранить данные из предыдущего раздела, показать пользователю понятное сообщение об отказе;
- `api_error` — отдельная логика повторов для 429 и 503, она описана в руководстве [«Nano Banana API не работает: как разобрать 429, 503, отсутствие изображения и отказ»](https://blog.laozhang.ai/ru/posts/nano-banana-pro-error);
- `candidate_stopped` — смотреть `finish_reason` и `finish_message` конкретного кандидата;
- `no_image` — разбирать ответ без изображения по отдельной инструкции.

## Повторить, изменить запрос или написать в Google: правила для OTHER

Google не публикует правил повтора для OTHER. Порядок ниже — вывод из определения в справочнике и сообщений разработчиков; цель у него одна — понять, от чего зависит отказ.

1. **Не повторяйте автоматически.** Повторы с паузой нужны для 429 и 503. Запрос, заблокированный с OTHER, цикл повторов должен пропускать.
2. **Один повтор без изменений допустим**, если тот же запрос раньше проходил. На форуме OTHER приходил примерно на каждый пятый запрос, так что разовый отказ на обычном запросе возможен. Если OTHER повторился, дальше одинаковые попытки ничего не добавят.
3. **Проверьте нейтральный запрос.** Отправьте с тем же ключом и той же моделью заведомо безобидный текст без изображений, например «красное яблоко на белом фоне». Если отказ пришёл и на него, дело не в вашем содержимом: переходите к пункту 6.
4. **Меняйте по одной переменной.** Уберите референсные изображения (если их несколько, по одному), уберите имена реальных людей и брендов, сократите и упростите текст. После каждой попытки записывайте, что изменилось, рядом с `responseId`.
5. **Остановитесь**, если отказ исчезает только тогда, когда из запроса убрано то, ради чего вы его отправляли: конкретный человек, конкретная фотография, конкретный сюжет. Это сигнал, что OTHER связан именно с этим содержимым. Перефразировать его так, чтобы модель всё равно изобразила то же самое (описание вместо имени, нарезка запроса на части), значит обходить ограничения Google, а не устранять ошибку. Если отказ не уходит ни от одного изменения, а запрос безобиден, переходите к пункту 6.
6. **Напишите в Google**, если OTHER получает нейтральный запрос, если доля OTHER резко выросла на запросах, которые раньше проходили, или если блокируется безобидный запрос, который вы можете показать. Приложите данные из списка выше и отредактированные копии запроса. Публичное место для таких сообщений — [форум Google AI Developers](https://discuss.ai.google.dev/): в обеих ветках, упомянутых выше, сотрудники Google отвечали.

![Порядок действий после blockReason OTHER: без автоповторов, один повтор, нейтральный запрос, по одной переменной, затем остановиться или написать в Google](https://blog.laozhang.ai/posts/ru/nano-banana-2-blockreason-other/img/other-action-rules.webp)

## Списываются ли деньги за ответ с blockReason OTHER

Google не публикует правила ни о том, что заблокированный запрос без кандидатов оплачивается как изображение, ни о том, что он бесплатен. Проверять приходится по факту: в `usageMetadata` конкретного ответа видно, сколько токенов учтено на входе (`promptTokenCount`), на выходе (`candidatesTokenCount`) и на рассуждения (`thoughtsTokenCount`), а итог виден в отчёте о расходах проекта. Тарифы опубликованы на странице [цен Gemini API](https://ai.google.dev/gemini-api/docs/pricing).

Если вы вызываете модель через посредника, правила списания задаёт он. Например, в документации LaoZhang API ответ HTTP 200 без изображения учитывается как один вызов ([описание Nano Banana в LaoZhang API](https://docs.laozhang.ai/en/api-capabilities/nano-banana-image)).

*Примечание: [laozhang.ai — наш собственный сервис](https://blog.laozhang.ai/ru/about#laozhang); его цены — наши тарифы, а не независимое сравнение.*

## Если ошибка другая: пустой ответ, 429, 503 и thought signature

- Ответ без ошибки, но и без картинки, `NO_IMAGE`, `IMAGE_SAFETY` и другие причины вида `IMAGE_*`: [«Nano Banana не генерирует изображение в API: как найти причину»](https://blog.laozhang.ai/ru/posts/nano-banana-2-200-ok-no-image).
- Общий разбор 429, 503 и отказов: [«Nano Banana API не работает: как разобрать 429, 503, отсутствие изображения и отказ»](https://blog.laozhang.ai/ru/posts/nano-banana-pro-error).
- Только 503 и перегрузка модели: [«Nano Banana 2: исправление ошибки 503 «Model is Overloaded» — 6 проверенных решений (2026)»](https://blog.laozhang.ai/ru/posts/nano-banana-2-503-overloaded-fix).
- `finishReason: "MISSING_THOUGHT_SIGNATURE"` в многоходовом диалоге: [«Ошибка Thought Signature в Nano Banana 2: полное руководство по исправлению (2026)»](https://blog.laozhang.ai/ru/posts/nano-banana-2-thought-signature-error).
- Картинка не получается в приложении или на сайте Gemini, а не в API: [«Nano Banana Pro не работает в Gemini: сначала проверьте маршрут приложения»](https://blog.laozhang.ai/ru/posts/nano-banana-pro-not-working-in-gemini).

## Вопросы о blockReason OTHER в Nano Banana 2

### Раньше запрос проходил, а теперь Nano Banana 2 возвращает OTHER. Что изменилось?

Google не публикует изменений в том, как выносятся отказы с OTHER, поэтому со стороны ответа причину не узнать. Сравните сохранённые ответы до и после: поменялся ли `modelVersion`, добавились ли референсные изображения, изменились ли запрос или настройки. Если всё одинаково, а OTHER стал приходить массово, это случай для пункта 6 из правил выше. Внезапные массовые OTHER на прежних запросах описывал и разработчик на форуме в декабре 2025 года.

### Зависит ли blockReason OTHER от региона?

Google ничего об этом не публикует. Единственное высказывание на эту тему — комментарий на Stack Overflow о том, что смена региона в основном не помогает, и он ничем не подкреплён. Менять регион или прокси, чтобы пройти отказ, — это обход ограничений, а не диагностика.

### Почему OTHER приходит только с референсными изображениями?

Объяснения от Google нет. Такой случай описан на форуме в мае 2026 года для Nano Banana Pro, и публичного ответа там нет. Проверьте изображения по одному: если отказ стабильно вызывает конкретный снимок, остановитесь и не пытайтесь его замаскировать. Если OTHER вызывает любое изображение, даже нейтральное, соберите данные и напишите в Google.

### Есть ли blockReason OTHER в Interactions API?

В таком виде нет. Google называет Interactions API рекомендуемым для новых проектов, а `generateContent` — устаревшим, но полностью поддерживаемым. В ответах Interactions вместо `candidates` и `promptFeedback` используются `status` и шаги `steps`, а пользовательские настройки безопасности там недоступны. Как читать такой ответ, когда изображения нет, объясняет руководство [«Nano Banana не генерирует изображение в API: как найти причину»](https://blog.laozhang.ai/ru/posts/nano-banana-2-200-ok-no-image).

## Источники

Внешние страницы, на которые ссылается это руководство, в порядке упоминания. Последнее обновление: 2026-10-04.

- [график отключений](https://ai.google.dev/gemini-api/docs/deprecations) (ai.google.dev)
- [справочник GenerateContent](https://ai.google.dev/api/generate-content) (ai.google.dev)
- [настройки безопасности](https://ai.google.dev/gemini-api/docs/safety-settings) (ai.google.dev)
- [ветке](https://discuss.ai.google.dev/t/blockreason-other/113496) (discuss.ai.google.dev)
- [вопрос](https://stackoverflow.com/questions/79884545) (stackoverflow.com)
- [ветка](https://discuss.ai.google.dev/t/persistent-other-block-reason-error-on-nano-banana-pro-gemini-3-pro-image-preview-with-reference-images/143901) (discuss.ai.google.dev)
- [форум Google AI Developers](https://discuss.ai.google.dev/) (discuss.ai.google.dev)
- [цен Gemini API](https://ai.google.dev/gemini-api/docs/pricing) (ai.google.dev)
