Почему GPT-Image-2 падает по таймауту: 5 настоящих причин и рабочие фиксы

Почему GPT-Image-2 падает по таймауту: 5 настоящих причин и рабочие фиксы

TL;DR — GPT-Image-2 медленный по конструкции: high quality 1024px — это 145–280 секунд. Большинство “падений” на самом деле не падения, а ситуация, когда какая-то прослойка в цепочке (CDN, обратный прокси, SDK) рвёт соединение раньше, чем OpenAI отдаёт результат. Остальные четыре причины — двухуровневая модерация, несовместимость параметров в сторонних клиентах, лимиты скорости от трёх параллельных запросов и стена верификации организации. Под каждую — фикс в одну-две строки.

Триаж за 30 секунд

Что вы видитеВероятная причинаРаздел
504, обрыв соединения на 60s / 180sЦепочка таймаутов1
moderation_blocked, Your request was rejectedДвухуровневая модерация2
Unknown parameter из стороннего клиентаНесовместимость параметров3
429, всё нормально на 2 параллельных, рушится на 3+Лимит скорости4
Your organization must be verifiedВерификация организации5
Я не разработчик, мне просто нужна картинкаГотовая обёртка без кодаБез кода

1. Таймауты (главный виновник)

Две трети всех сообщений “GPT-Image-2 сломан” на форуме разработчиков OpenAI — про это. Это не баг. Модель медленная, а ваш шлюз сдаётся раньше, чем OpenAI заканчивает работу.

Реальные замеры на gpt-image-2:

  • Минимальный запрос, 1024×1024 medium, без референсов: около 80 секунд
  • 1024×1024 high, без референсов: медиана 195 секунд, p95 около 280 секунд
  • 1536×1024 high + input_fidelity="high" + маленький референс: около 130 секунд (быстрее, потому что модель раньше фиксирует композицию)
  • 1024×1024 medium + два JPG-референса: около 44 секунд

Теперь типичная цепочка таймаутов между вашим кодом и OpenAI:

ваш код                ── OpenAI Python SDK по умолчанию 600s

прокси / шлюз          ── NGINX по умолчанию 60s, Azure SDK 180s, Express 120s

CDN эдж                ── Cloudflare Free 100s, Vercel Hobby 60s

апстрим OpenAI         ── отвечает через 195s

Решает тот слой, у которого самый короткий лимит. На Vercel Hobby high quality генерация — гарантированный 504 на 61-й секунде, при этом OpenAI продолжает считать изображение, которое никто не получит.

Фиксы по убыванию эффективности

(а) Включить streaming с partial_images. Самое крупное улучшение в одну строку — и большинство кода это до сих пор не использует:

stream = client.images.generate(
    model="openai/gpt-image-2",
    prompt="рамэн-бар в два часа ночи, неоновые отражения на мокром асфальте",
    size="1024x1024",
    stream=True,
    partial_images=2,
)
for event in stream:
    if event.type == "image_generation.partial_image":
        push_to_client(event.b64_json, index=event.partial_image_index)
    elif event.type == "image_generation.completed":
        final = event.b64_json

Первый байт приходит за 5–15 секунд вместо 195. Пользователь видит прогресс, шлюз видит живой ответ, и 60-секундная отсечка не срабатывает. Цена — около 100 дополнительных image output токенов на каждый partial; обычно достаточно двух.

(б) Если стриминг невозможен — переходите на асинхронный режим. Сразу возвращаете task ID, генерация идёт в воркере, результат отдаётся через вебхук или поллинг. Это единственный рабочий паттерн, когда фронт стоит за CDN с жёстким лимитом 100 секунд. Бонус: если клиент отвалился, генерация не пропадает — воркер досчитает и сохранит результат.

(в) Опустить quality. Большинство промптов не требуют quality="high". Переход на medium экономит 60–120 секунд на вызов. При жёстких требованиях к латенси выходной формат JPEG быстрее PNG на этапах кодирования и сериализации.

Чего категорически нельзя делать: ретраить тот же промпт сразу после таймаута. OpenAI всё ещё считает. Вы получите двойной счёт и тут же поймаете 429.

2. moderation_blocked

Вторая по объёму причина. OpenAI прогоняет безопасность дважды — на входе (промпт и референсы) и на выходе (готовое изображение). Сообщения отличаются:

  • Your request was rejected by the safety system → отловлено входным фильтром. Меняйте формулировку промпта.
  • Generated image was filtered → отловлено выходным фильтром. Промпт выглядит безобидно, но сгенерированное изображение фильтр не пропустил. Менять нужно сцену целиком, а не отдельные слова.

Ретраить тот же промпт бесполезно. Фильтр детерминирован: одинаковый вход блокируется одинаково. Повторные попытки сжигают квоту.

Категории, к которым выходной фильтр особенно строг (даже если промпт мягкий):

  • Любой, кто может быть прочитан как несовершеннолетний, в том числе стилизованный
  • Узнаваемые публичные персоны (политики, артисты, спортсмены)
  • Защищённые товарным знаком персонажи (Disney, Nintendo, Marvel)
  • Реалистичная медицинская, хирургическая и травматическая сцена
  • Всё, что похоже на удостоверение личности, реальную валюту или зарегистрированный логотип

Практичный способ — добавить собственную предпроверку промпта: простой regex на имена знаменитостей, бренды и опасные слова отсекает большинство случаев, не дожидаясь 200 секунд тщетной генерации.

3. Несовместимость параметров в сторонних клиентах

Если вы вызываете GPT-Image-2 через Cherry Studio или похожий десктопный клиент — почти наверняка вы здесь. Формы параметров chat-completions и images-generations отличаются, и клиент, написанный под первое, шлёт лишние поля во второе.

Подтверждённые несовместимости на момент написания:

  • response_formatgpt-image-2 не принимает. Удалить.
  • Массив messages: [...] отправляется на /v1/images/generations — неправильный эндпоинт целиком.
  • n>1 — работает, но каждое изображение считается отдельно в лимитах скорости.

Минимально корректный запрос:

curl https://api.ofox.ai/v1/images/generations \
  -H "Authorization: Bearer $OFOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-image-2",
    "prompt": "рамэн-бар в два часа ночи, неоновые отражения на мокром асфальте",
    "size": "1024x1024"
  }'

Если клиент-обёртка падает, а curl с тем же ключом проходит — клиент посылает что-то лишнее. У большинства клиентов есть панель расширенных параметров, в которой response_format можно отключить.

4. Ограничение скорости

Лимиты для image-моделей и текстовых моделей — разные. Ключ, спокойно держащий 50 RPM на gpt-5-4, поймает 429 на десяти параллельных вызовах GPT-Image-2.

Практический бюджет параллельности:

  • 3 параллельно + пауза 2 секунды между батчами: стабильно
  • 5 параллельно: иногда 429 под нагрузкой
  • 10 параллельно: гарантированный троттлинг

Самое дешёвое решение — семафор в точке вызова:

import asyncio

sem = asyncio.Semaphore(3)

async def generate(prompt: str):
    async with sem:
        result = await client.images.generate(
            model="openai/gpt-image-2",
            prompt=prompt,
            size="1024x1024",
        )
        await asyncio.sleep(2)
        return result

Дополнить экспоненциальным откатом, который читает заголовок Retry-After из 429-ответа. Важно: на таймаут не ретраить. См. раздел 1.

5. Верификация организации

OpenAI закрывает GPT-Image-2 за процедурой верификации организации через Persona (проверка документа). Где это обычно затыкается:

  • Страна не в белом списке (а сам список не опубликован)
  • 90-дневная блокировка повторной верификации после предыдущей удачной
  • Сессия Persona истекла — повторно нужно начинать из панели OpenAI, не из письма Persona
  • Верификация прошла, но права на модель приходят в течение 6–24 часов

Если вы стоите перед “Your organization must be verified” и не хотите ждать — обращение к GPT-Image-2 через уже верифицированный агрегатор полностью обходит этот шаг. В следующем разделе — одна строка переключения SDK.

Выбираете маршрут по тому, что вы делаете

Большая часть способов “сломать” GPT-Image-2 — это отправлять запрос в самой невыгодной конфигурации: напрямую с ноутбука, с дефолтными таймаутами, по нестабильному сетевому пути до US-East эджа OpenAI. Есть два более чистых маршрута; выбирайте по тому, что вы строите.

Пишете код, встраиваете в продукт → через OpenAI-совместимый эндпоинт Ofox

from openai import OpenAI

client = OpenAI(
    api_key="ofox-...",
    base_url="https://api.ofox.ai/v1",
)

stream = client.images.generate(
    model="openai/gpt-image-2",
    prompt="...",
    size="1024x1024",
    stream=True,
    partial_images=2,
)

Основная часть времени запроса — это серверная генерация на стороне OpenAI, и она не сократится, как бы вы ни роутили. Меняется сетевой путь между клиентом и эджем OpenAI. Прямой маршрут из России / Азиатско-Тихоокеанского региона до US-East эджа OpenAI — это сотни миллисекунд задержки плюс периодические потери пакетов и повторы TLS-рукопожатий. Для быстрых текстовых вызовов это незаметно, для 100–200-секундного streaming-соединения любая такая помеха убивает всю генерацию (это та самая механика таймаут-отказов из раздела 1). Ofox удерживает стабильный оптимизированный маршрут для трафика из Азиатско-Тихоокеанского региона, чтобы байты streaming-ответа реально доходили до клиента всё время генерации. Бонус: стена верификации организации из раздела 5 уже пройдена на стороне Ofox — тот же ID модели работает без Persona.

OpenAI SDK не меняется. ID модели openai/gpt-image-2 не меняется. Streaming, partial_images, референсные картинки, input_fidelity — всё поддерживается. Меняется одна строка в настройке клиента.

Нужна пара картинок, без интеграции → gptimage2.plus

gptimage2.plus — обёртка GPT-Image-2 с обычным веб-интерфейсом. Таймауты и ретраи берёт на себя сервис, вы вводите промпт и получаете 2K изображение. При регистрации даётся 5 кредитов бесплатно, без логина — одна генерация в день, и сейчас работает код LAUNCH50 — −50% на первый месяц.

Подходит, если:

  • Вы не пишете код, нужно несколько картинок
  • Веб-интерфейс ChatGPT снова отказывается рисовать
  • Хотите готовые сценарии (товарные снимки, аватары, реставрация фото) вместо самостоятельных промптов

Не подходит, если встраиваете генерацию в собственный продукт или нужна пакетная генерация в пайплайне — для этого API.

Кратчайший путь к “перестало падать” на API

  1. Включить streaming с partial_images=2. Лучшая отдача на одну строку кода.
  2. Семафор на 3 параллельных. Уважать Retry-After в экспоненциальном откате.
  3. Предпроверка промпта на риски модерации.
  4. На таймаут не ретраить — дать оригинальному запросу закончиться или перевести вызов в асинхронную задачу.
  5. Если вы в России / Азиатско-Тихоокеанском регионе или застряли на верификации — переключить base_url на агрегатор со стабильным маршрутом до OpenAI.

Сама модель сейчас занимает первое место в Arena по генерации изображений из текста. Все способы её “сломать” ограничены и предсказуемы — у каждого есть фикс в одну-две строки.