# Ошибка 503 Nano Banana Pro: что делать при перегрузке и Deadline expired

> Если Nano Banana Pro вернул 503, сначала выясните, какой сервис ответил, и проверьте код ошибки. Повторяйте запрос с паузами и установленным пределом, а восстановление подтверждайте готовым изображением. Сообщение Deadline expired само по себе не делает ошибку 504.

- URL: https://blog.laozhang.ai/ru/posts/fix-gemini-3-pro-image-503-overloaded
- Published: 2026-02-23
- Updated: 2026-10-07
- Author: LaoZhang AI Team (https://blog.laozhang.ai/ru/about)
- Topic: Руководства по API
- Tags: Gemini API, Ошибка 503, Deadline expired, Nano Banana Pro, Генерация изображений

---
При ошибке **503 у Nano Banana Pro** сначала проверьте адрес сервиса, HTTP-статус и структурированные поля ошибки. Если подтверждён временный сбой, оставьте модель, входные данные и настройки изображения прежними, выдержите паузу и выполните ограниченное число повторов. Остановитесь, когда получено нужное изображение, исчерпан срок ожидания или изменился тип ошибки. Увеличивать тайм-аут только из-за слов `Deadline expired` не нужно.

Это особенно важно для сообщения `Deadline expired before operation could complete.`: на форуме Google зафиксирован ответ с этой фразой, **целочисленным кодом 503 и статусом `UNAVAILABLE`**. Он относится к периоду с декабря 2025 года по январь 2026 года и старой preview-модели, а не доказывает текущий сбой. [Историческое обсуждение Google](https://discuss.ai.google.dev/t/servererror-503-unavailable-error-code-503-message-deadline-expired-before-operation-could-complete-status-unavailable/110949) помогает распознать сочетание полей, но не устанавливает срок восстановления.

## Что значит 503 и кто его вернул

HTTP 503 означает, что ответивший сервис временно не может обработать запрос; перегрузка и обслуживание — возможные причины. Это определение [HTTP 503 в стандарте](https://www.rfc-editor.org/rfc/rfc9110.html#section-15.6.4). Один такой ответ не позволяет установить внутреннюю причину или объявить недоступным весь Google.

Сначала сохраните небольшую запись: время, адрес API, ID модели, HTTP-статус, код и статус из тела ответа, длительность попытки, `Retry-After` и идентификатор запроса, если он есть. Ключи, приватные изображения и полный промпт в общий журнал не помещайте.

Дальше выясните, откуда пришёл ответ:

- **Прямой Google API.** Сопоставьте тело с форматом того API, который вызываете.
- **Посредник или API-шлюз.** Посмотрите его диагностические поля и журнал обращения к Google. Шлюз может сформировать собственный 503.
- **Ваше приложение.** Если 503 выдал ваш сервер, проверьте его очередь и журнал исходящего запроса. Ошибка страницы приложения ещё не доказывает 503 у модели.

Если на месте JSON пришла HTML-страница прокси или HTTP-статус противоречит полям тела, сначала установите источник ошибки. Автоматическое повторение «ошибки Google» в таком случае может чинить совсем другой сервис.

### Не смешивайте форматы generateContent и Interactions

В историческом примере `generateContent` тело выглядело так:

```json
{
  "error": {
    "code": 503,
    "message": "Deadline expired before operation could complete.",
    "status": "UNAVAILABLE"
  }
}
```

У Python SDK поле `APIError.code` в [изученном исходном коде Google](https://github.com/googleapis/python-genai/blob/main/google/genai/errors.py) также целочисленное. Читайте типизированные поля исключения; поиск строки «503» во всём сообщении ненадёжен — число может находиться в промпте или постороннем тексте.

У **Interactions** другой формат: `error.code` — строка. В [документации ошибок Interactions](https://ai.google.dev/gemini-api/docs/api-errors) `service_unavailable` соответствует HTTP 503, а `deadline_exceeded` — HTTP 504. Не подставляйте эти строки в обработчик целочисленного кода `generateContent`.

| Полученный результат | Что проверять дальше |
|---|---|
| HTTP 503 и `UNAVAILABLE` в generateContent либо `service_unavailable` в Interactions | Ограниченное восстановление после временного сбоя |
| HTTP 504; для Interactions — `deadline_exceeded` | Кто не дождался вышестоящего сервиса и где установлен срок ожидания |
| Клиент прервал ожидание, HTTP-ответа нет | Неизвестный результат первоначального запроса |
| HTTP 429 | Какой лимит или квота проекта сработали |
| HTTP 400, 401, 402, 403 или 404 | Параметры, ключ, оплата, разрешения или ID модели — по точному коду |
| HTTP 200 без нужного изображения | Формат ответа, состояние задания, отказ или настройки вывода |

![Deadline expired сверяется с типом кода generateContent или Interactions; 503, 504, новый 4xx и отсутствие HTTP ведут к разным действиям](https://blog.laozhang.ai/posts/ru/fix-gemini-3-pro-image-503-overloaded/img/message-code-branches.webp)

## Как восстановить генерацию после подтверждённого 503

Рабочая процедура состоит из короткой проверки, пауз между попытками и явного выхода. Google рекомендует для временных ошибок увеличивать задержку, добавлять случайный разброс и ограничивать число повторов. [Руководство по устранению неполадок Gemini](https://ai.google.dev/gemini-api/docs/troubleshooting) не задаёт универсальный срок, за который любой запрос Pro обязан восстановиться.

1. **Зафиксируйте исходную задачу.** Оставьте прежними сервис, API, проект, модель, промпт, референсы, размер и соотношение сторон. Для официального Pro текущий ID — `gemini-3-pro-image`; старый `gemini-3-pro-image-preview` указан среди отключённых моделей в [списке Google](https://ai.google.dev/gemini-api/docs/deprecations). Исправление устаревшего ID — отдельная необходимая правка, а не доказательство восстановления 503.
2. **Назначьте одного ответственного за повторы.** Это может быть приложение или настроенный клиент. Узнайте, повторяет ли запрос SDK и шлюз, иначе три попытки приложения способны превратиться в гораздо большее число обращений.
3. **Установите два предела.** Максимальное число отправок, включая первую, и общий срок задания, включающий ожидание ответов и паузы. Тайм-аут одной отправки должен укладываться в оставшееся время.
4. **Выдержите паузу.** Если пришёл корректный `Retry-After`, не отправляйте раньше указанного срока. Без него используйте растущую задержку со случайным разбросом. Слишком длинная пауза для интерактивного запроса означает перенос в очередь или остановку, а не сокращение серверного ожидания.
5. **Проверьте результат следующей попытки.** При очередном 503 продолжайте только в пределах политики. При другой ошибке завершите процедуру 503 и выберите действие по новому коду. При успехе проверьте само изображение.

Повторы POST требуют отдельного решения о допустимости повторной генерации. [Правило HTTP об идемпотентности](https://www.rfc-editor.org/rfc/rfc9110.html#section-9.2.2) не делает произвольный POST безопасным для автоматического повтора. Если неизвестно, применён ли первый запрос, возможны дополнительный результат и расходы. Внутренний ID задания помогает вашему приложению вести учёт, но не создаёт у Google неописанную поддержку `Idempotency-Key`.

### Пример ограничений без обращения к API

Ниже — **функция принятия решения**, а не готовый сетевой клиент. Она получает HTTP-статус и словарь `error` из уже разобранного ответа известного сервиса; для успешного ответа можно передать пустой словарь. Числа выбраны для примера интерфейса: не более трёх отправок, общий срок 110 секунд и резерв 25 секунд на следующую попытку. Для вашей задачи резерв должен отражать настроенный срок одной отправки; сами числа не являются лимитами Google или измеренной скоростью Pro.

`replay_allowed=True` выставляет приложение после решения о допустимости повторной генерации. По умолчанию повтор запрещён. Время `elapsed` считайте монотонными часами с начала задания, включая все ожидания; `now_utc` требуется только для даты в `Retry-After`. Для каждой паузы передавайте новое случайное число от 0 до 1 в `random_fraction`; значение 0,5 в примере фиксировано, чтобы результат можно было воспроизвести.

```python
import math
from datetime import datetime, timezone
from email.utils import parsedate_to_datetime


def next_action(http_status, error, protocol, elapsed, sent_attempts,
                retry_after=None, now_utc=None, random_fraction=0.5,
                replay_allowed=False, issuer_known=False):
    if http_status is None:
        return ("check_original_result", 0)
    if not issuer_known:
        return ("inspect_issuer", 0)
    if http_status == 200:
        return ("validate_image", 0)
    if protocol == "generateContent":
        consistent = (
            type(error.get("code")) is int
            and error["code"] == http_status
        )
        transient = consistent and error.get("status") == "UNAVAILABLE"
    elif protocol == "interactions":
        transient = error.get("code") == "service_unavailable"
        consistent = transient if http_status == 503 else True
    else:
        return ("inspect_protocol", 0)
    if not consistent:
        return ("inspect_error_fields", 0)
    if http_status != 503:
        return ("diagnose_other_error", 0)
    if not transient:
        return ("inspect_error_fields", 0)
    if not replay_allowed:
        return ("stop_duplicate_risk", 0)
    if sent_attempts >= 3:
        return ("queue_or_stop", 0)
    if not (0 <= random_fraction <= 1) or sent_attempts < 1:
        raise ValueError("Invalid attempt count or random fraction")
    delay = None
    if retry_after is not None:
        value = str(retry_after).strip()
        if value.isascii() and value.isdecimal():
            delay = int(value)
        else:
            try:
                deadline = parsedate_to_datetime(value)
                if (deadline.tzinfo is None or now_utc is None
                        or now_utc.utcoffset() is None):
                    return ("inspect_retry_after_clock", 0)
                delay = max(0, math.ceil(
                    (deadline - now_utc).total_seconds()
                ))
            except (ValueError, TypeError, OverflowError):
                pass
    if delay is None:
        delay = min(12, 3 * 2 ** (sent_attempts - 1)) * random_fraction
    if elapsed + delay + 25 > 110:
        return ("queue_or_stop", delay)
    return ("wait_then_send", delay)


print(next_action(
    503, {"code": 503, "status": "UNAVAILABLE"},
    "generateContent", elapsed=30, sent_attempts=1,
    replay_allowed=True, issuer_known=True,
))  # ('wait_then_send', 1.5)
```

Перед выполнением `wait_then_send` выдержите возвращённую задержку и **снова проверьте оставшееся время**, затем задайте сетевому клиенту срок не больше оставшегося бюджета. Отключите независимые повторы на других уровнях либо включите их в общий счётчик. Функция не отменяет сетевой запрос и не гарантирует завершение за 110 секунд.

Например, при `elapsed=30` и `Retry-After: 120` она предлагает очередь или остановку: новая попытка уже не помещается в общий срок. Заголовок допускает секунды или HTTP-дату — оба варианта определены в [стандарте Retry-After](https://www.rfc-editor.org/rfc/rfc9110.html#section-10.2.3). Если дата читается неверно или часы расходятся, проверьте заголовок и время, а не объявляйте сервис восстановленным.

Синтаксис и решения функции проверены локально на искусственных ответах и времени. Реальных запросов к Pro, замеров задержки и проверки списаний для этого примера не выполнялось.

### Когда очередь полезнее новых повторов

Если несколько заданий подряд исчерпали свой предел, приостановите немедленные отправки этому сервису. Оставьте задания в очереди только там, где допустим поздний результат; поставьте им срок годности и разрешайте небольшое число пробных обращений после паузы. Для интерактивного продукта верните понятное состояние «генерация временно недоступна» с возможностью повторить позже.

Снижение параллелизма и ограничение очереди — способы не усиливать сбой собственным трафиком. Это инженерные меры, а не обещание зарезервированной мощности Pro. Конкретный размер очереди и число параллельных запросов выбирают по своему приложению.

## Как убедиться, что исходный запрос восстановился

![Повтор прежнего запроса, проверка результата и переход к диагностике другого кода](https://blog.laozhang.ai/posts/ru/fix-gemini-3-pro-image-503-overloaded/img/verify-route-out.webp)

Восстановление подтверждено, когда **тот же сервис и модель с прежними входными данными и требуемыми настройками** вернули пригодное изображение. Одного HTTP 200, текста «готово» или постановки в очередь недостаточно.

Для `generateContent` прочитайте целевые части `candidates[].content.parts[]` с `inlineData`; для Interactions — блоки изображений в `steps` типа `model_output`, внутри `content`. Эти структуры различаются, поэтому переключение API без изменения обработчика ответа легко выглядит как «изображение пропало». Форматы описаны в [документации генерации изображений](https://ai.google.dev/gemini-api/docs/image-generation?hl=en).

Проверьте MIME-тип и непустые данные, декодируйте изображение, сохраните файл с подходящим расширением и откройте его. Затем сверьте нужный размер, соотношение сторон и содержание. Сохраните все необходимые изображения; сокращение SDK `output_image` возвращает только последнее. Полный пример сохранения файлов для обоих форматов есть в [руководстве Nano Banana Pro API](https://blog.laozhang.ai/ru/posts/nano-banana-pro-api-guide).

Если пришёл 200, но изображения нет, остановите автоматический повтор по правилу 503. Прочитайте ответ: это может быть текст, незавершённое задание, отказ по содержимому или неправильные настройки вывода. Проверка формата и причин отказа должна предшествовать новой оплачиваемой генерации; ограничения безопасности не следует обходить ради получения картинки.

## Если это 504 или клиент не получил ответа

**HTTP 504** означает, что шлюз или прокси не получил своевременный ответ от вышестоящего сервера. Так определяет его [стандарт HTTP](https://www.rfc-editor.org/rfc/rfc9110.html#section-15.6.5). Установите, какой компонент вернул 504, и сравните сроки ожидания приложения, прокси и API. Увеличение срока ожидания клиента не отменяет уже полученный серверный `deadline_exceeded`.

Если **HTTP-ответа нет**, а клиент сообщил об истечении времени или разрыве соединения, результат первоначального запроса неизвестен. Сервер мог ещё обрабатывать его или уже закончить. Сначала проверьте существующий ID задания и доступный механизм получения результата, если выбранный сервис действительно их предоставляет. Не придумывайте для произвольного шлюза метод получения задания и не отправляйте автоматически дубликат.

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

## Когда нужно перейти к другой ошибке или варианту генерации

При **429** выясните измерение лимита и окно сброса. Квота проекта, особенно суточная или нулевая, не исправляется короткими повторами или новым ключом того же проекта. Начните с [диагностики лимита 429 при генерации изображений](https://blog.laozhang.ai/ru/posts/gemini-image-429-rate-limit); эта ссылка нужна для определения квоты, а не для выбора актуальной модели замены. Общие правила подтверждает [страница лимитов Google](https://ai.google.dev/gemini-api/docs/rate-limits).

При **400** исправьте конкретное поле или предварительное условие; при **401/403** проверьте принадлежность ключа и доступ; при **402** разберите оплату у ответившего сервиса; при **404** — адрес и ID модели. Слепые повторы эти причины не исправляют. Для Interactions точные строковые коды перечислены в [документации ошибок](https://ai.google.dev/gemini-api/docs/api-errors). Другие 5xx тоже требуют своего диагноза: например, 501 не означает тот же временный сбой, что 503.

Если исходная задача может ждать, очередь сохраняет её требования. Если важнее быстро получить любой допустимый результат, можно **отдельно согласовать замену**: иной размер, другую модель или другого поставщика. Перед заменой проверьте поддерживаемые параметры, цену, обращение с данными и обработчик ответа. Успех этой новой задачи записывайте отдельно от восстановления Pro.

В частности, 4K и 2K — разные требования. [Текущая карточка Pro](https://ai.google.dev/gemini-api/docs/models/gemini-3-pro-image) поддерживает 1K, 2K и 4K, но отдельные исторические сообщения о неудачных 4K-запросах не доказывают общего запрета 4K. Увеличенное после генерации изображение тоже не подтверждает, что восстановился исходный запрос на 4K.

## Частые вопросы

### Нужно ли повышать тайм-аут при Deadline expired и коде 503?

Само сообщение этого не требует. При подтверждённых 503 и `UNAVAILABLE` сначала применяют ограниченные повторы временного сбоя. Тайм-аут разбирают отдельно, когда есть 504 либо известно, что клиент прекратил ожидание. Историческое сочетание 503 и Deadline описано в [обсуждении Google](https://discuss.ai.google.dev/t/servererror-503-unavailable-error-code-503-message-deadline-expired-before-operation-could-complete-status-unavailable/110949).

### Сколько ждать, пока исчезнет ошибка 503 Gemini?

Гарантированного срока для конкретного запроса нет. Выберите общий срок задания, учитывайте `Retry-After` и завершайте интерактивное ожидание, когда следующая попытка не помещается в этот срок. Три отправки и 110 секунд в примере — политика приложения, а не норматив Google.

### Почему платный аккаунт тоже получает 503?

Оплата не исключает временную недоступность сервиса. На форуме есть [исторический случай платного Tier 1](https://discuss.ai.google.dev/t/503-error-while-generate-content-model-gemini-3-pro-image-preview-tire1-paid/112180), где 503 впоследствии исчез. Он не доказывает, что повышение уровня снимет ваш сбой, и не устанавливает срок восстановления.

### SDK уже повторяет запросы — нужна ли своя петля?

Только если вы учли все отправки. В текущем [руководстве Gemini](https://ai.google.dev/gemini-api/docs/troubleshooting) описаны четыре автоматических повтора Python SDK. В исходном коде ветки `main`, прочитанном 6 октября 2026 года и повторно изученном локально 7 октября, путь без `retry_options` даёт одну попытку, а явно заданные стандартные опции — пять, включая первую. Это разные области описания; установленная у вас версия здесь не проверялась. Проверьте её поведение и оставьте одного ответственного за повторы, чтобы не перемножать попытки приложения, SDK и шлюза. [Исходный код клиента Google](https://github.com/googleapis/python-genai/blob/main/google/genai/_api_client.py) может меняться.

### Ответ 200 без изображения означает, что всё исправлено?

Нет. Он подтверждает успешный HTTP-ответ, но не выполнение задачи генерации. Найдите целевой блок изображения, проверьте данные и откройте сохранённый файл. Если результат отсутствует, разбирайте ответ и настройки, а не продолжайте повторы 503.

### Повтор после тайм-аута обязательно бесплатный?

Нет оснований так считать. Если ответ потерян, неизвестно, завершилась ли генерация. Условия списаний определяет конкретный сервис; статус 503 или локальный тайм-аут сами по себе не обещают возврата денег. Перед повтором учитывайте риск дополнительного результата и расходов.

## Источники

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

- [Историческое обсуждение Google](https://discuss.ai.google.dev/t/servererror-503-unavailable-error-code-503-message-deadline-expired-before-operation-could-complete-status-unavailable/110949) (discuss.ai.google.dev)
- [HTTP 503 в стандарте](https://www.rfc-editor.org/rfc/rfc9110.html) (rfc-editor.org)
- [изученном исходном коде Google](https://github.com/googleapis/python-genai/blob/main/google/genai/errors.py) (github.com)
- [документации ошибок Interactions](https://ai.google.dev/gemini-api/docs/api-errors) (ai.google.dev)
- [Руководство по устранению неполадок Gemini](https://ai.google.dev/gemini-api/docs/troubleshooting) (ai.google.dev)
- [списке Google](https://ai.google.dev/gemini-api/docs/deprecations) (ai.google.dev)
- [документации генерации изображений](https://ai.google.dev/gemini-api/docs/image-generation?hl=en) (ai.google.dev)
- [страница лимитов Google](https://ai.google.dev/gemini-api/docs/rate-limits) (ai.google.dev)
- [Текущая карточка Pro](https://ai.google.dev/gemini-api/docs/models/gemini-3-pro-image) (ai.google.dev)
- [исторический случай платного Tier 1](https://discuss.ai.google.dev/t/503-error-while-generate-content-model-gemini-3-pro-image-preview-tire1-paid/112180) (discuss.ai.google.dev)
- [Исходный код клиента Google](https://github.com/googleapis/python-genai/blob/main/google/genai/_api_client.py) (github.com)
