GPT-Image-2 таймаут: 5 причин и фиксы

504, зависание на 3 минуты, отклонённый промпт — это разные причины. Реальные замеры генерации 1024px, разбор цепочки таймаутов и готовый код для каждого случая.

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 по генерации изображений из текста. Все способы её “сломать” ограничены и предсказуемы — у каждого есть фикс в одну-две строки.

Часто задаваемые вопросы

Почему GPT-Image-2 висит три минуты и потом отдаёт 504?
Модель действительно медленная на стороне OpenAI: медианное время генерации 1024×1024 high quality около 195 секунд, p95 — около 280 секунд. В цепочке между вашим кодом и OpenAI выигрывает тот, у кого таймаут короче (Vercel Hobby — 60s, Cloudflare Free — 100s, Azure SDK — 180s). Он рвёт соединение, OpenAI ещё считает, клиент видит 504. Самое эффективное решение — включить streaming с partial_images, тогда первый байт приходит за 5–15 секунд.
Промпт безобидный, но прилетает moderation_blocked. Почему?
OpenAI прогоняет проверку дважды: на вход (промпт + референсные изображения) и на выход (готовое изображение). 'Your request was rejected' — поймал входной фильтр, нужно менять формулировку промпта. 'Generated image was filtered' — поймал выходной фильтр, тут нужно пересобирать саму сцену, а не подбирать синонимы. Повторять один и тот же промпт бесполезно — фильтр работает детерминированно.
Cherry Studio выдаёт Unknown parameter, что делать?
Сторонние клиенты часто отправляют параметры в форме chat-completions (response_format, массив messages) на эндпоинт images-generations, который их не принимает. Минимальный корректный запрос — только model + prompt + size. В большинстве клиентов в разделе 'Расширенные параметры' можно отключить response_format, после чего вызов начинает работать.
Сколько параллельных запросов выдерживает GPT-Image-2?
На практике 3 параллельно стабильно, 5 — иногда 429, 10 — почти гарантированно троттлинг. Лимиты у image-моделей строже, чем у текстовых, даже на одном и том же ключе. Семафор в точке вызова плюс экспоненциальный откат с уважением к Retry-After — стандартное решение.
Как обойти верификацию организации OpenAI?
Прямой доступ к gpt-image-2 у OpenAI закрыт верификацией организации через Persona. Распространённые тупики: страна не в белом списке, блокировка на 90 дней после предыдущей верификации, истечение сессии Persona, задержка пропагации прав на 6–24 часа. Если вы вызываете модель через уже верифицированный агрегатор (Ofox), этот шаг полностью исключается: тот же ID модели, тот же SDK, отличается только base_url.