GPT-Image-2 がタイムアウト / 失敗する本当の理由 — 5 つの根本原因と本番で効く修正

GPT-Image-2 がタイムアウト / 失敗する本当の理由 — 5 つの根本原因と本番で効く修正

TL;DR — GPT-Image-2 は仕様上遅いモデルです。high quality 1024px の生成は 145–280 秒かかります。「失敗」と報告される事象の大半は実はモデルが落ちたのではなく、経路上のどこか(CDN / リバースプロキシ / SDK)が OpenAI より先にタイムアウトしているだけです。残りは大きく分けて 4 つ — 2 段のモデレーション、サードパーティクライアントのパラメータ不整合、3 並列以降に効くレートリミット、そして組織認証の壁。それぞれに 1–2 行で済む修正があります。

30 秒トリアージ

症状推定原因該当節
504、60s / 180s で接続が切れるタイムアウト連鎖1
moderation_blockedYour request was rejected2 段モデレーション2
Unknown parameter がラッパークライアントから出るパラメータ不整合3
429、2 並列までは OK だが 3 並列で崩れるレートリミット4
Your organization must be verified組織認証5
コードを書かずに画像だけ欲しいノーコードのラッパー非開発者向け

1. タイムアウト(これが本命)

OpenAI 開発者フォーラムで「GPT-Image-2 が壊れた」と書かれているスレッドの三分の二は、これに該当します。バグではなく、ゲートウェイが 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 参照画像 2 枚:約 44 秒

そしてあなたのコードから OpenAI までの典型的なタイムアウト連鎖:

あなたのコード         ── OpenAI Python SDK デフォルト 600s

リバースプロキシ       ── NGINX デフォルト 60s、Azure SDK 180s、Express 120s

CDN エッジ             ── Cloudflare Free 100s、Vercel Hobby 60s

OpenAI 上流            ── 195 秒で応答

最短値を持つ層が勝者です。Vercel Hobby で GPT-Image-2 を高品質で叩くと、必ず壊れます。60 秒後にユーザーには 504 が返り、OpenAI 側は誰にも届かない画像を生成し続けます。

効果順の修正

(a) streaming と partial_images を有効化する。 単一の変更としては最も効果が大きく、ほとんどのコードがまだ有効化していません。

stream = client.images.generate(
    model="openai/gpt-image-2",
    prompt="深夜 2 時のラーメン屋、雨上がりの路面にネオンが反射する",
    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

ファーストバイトが 195 秒から 5–15 秒に短縮されます。ユーザーには進捗が見え、ゲートウェイは応答が流れていることを認識するため、60 秒の打ち切りが発火しません。コストは partial 1 枚あたり約 100 image output tokens で、2 枚あれば十分です。

(b) streaming が使えなければ非同期化する。 タスク ID を即座に返し、Worker で生成し、Webhook かポーリングで結果を渡す構成です。100 秒以下の硬いキャップを持つ CDN の背後にフロントエンドがあるなら、これが唯一現実的なパターンです。クライアントが切断しても生成は無駄にならず、Worker は完走して結果を保存します。

(c) quality を落とす。 多くのプロンプトは quality="high" を必要としません。medium に落とすだけで 60–120 秒短縮できます。レイテンシ優先なら PNG ではなく JPEG 出力にすると、エンコードとシリアライズも速くなります。

やってはいけないこと: タイムアウト直後に同じプロンプトでクライアント側リトライ。OpenAI はまだ生成中です。料金を二重に取られたうえで、即座に 429 を踏みます。

2. moderation_blocked

2 番目に大きい原因です。OpenAI はセーフティを 2 回走らせます — 入力時にプロンプトと参照画像を、出力時に生成結果を。

  • Your request was rejected by the safety system → 入力フィルタが捕捉。プロンプトの言葉遣いを変える必要があります。
  • Generated image was filtered → 出力フィルタが捕捉。プロンプトは無害そうに見えても、生成された絵がフィルタの基準に触れた状態です。表現ではなくシーン構成を見直す必要があります。

同一プロンプトを再送しても結果は変わりません。 フィルタは決定的に動作するため、同じ入力に対しては同じように拒否され、再試行はリクエスト枠を消費するだけです。

出力フィルタが特に厳しいカテゴリ(プロンプトが穏当でも引っかかります):

  • 未成年と読み取れる人物(スタイライズされていても)
  • 識別可能な公人(政治家、芸能人、スポーツ選手)
  • 商標キャラクター・知的財産(ディズニー、任天堂、マーベルなど)
  • 写実的な医療・手術・外傷の描写
  • 身分証、実在通貨、登録商標ロゴに見える要素

実務的な対策は自分側にプロンプトの事前バリデーション層を入れることです。芸能人名、ブランド名、リスクの高い語彙を簡単な正規表現で弾くだけで、200 秒待った末に拒否されるパターンの大半を回避できます。

3. サードパーティクライアントのパラメータ不整合

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": "深夜 2 時のラーメン屋、雨上がりの路面にネオンが反射する",
    "size": "1024x1024"
  }'

ラッパークライアントは失敗するのに同じキーで curl が通る場合、クライアントが余計なフィールドを送っています。多くのクライアントには「詳細パラメータ」設定があり、response_format を無効化すれば動きます。

4. レートリミット

画像のレートリミットはテキストのそれと別物です。テキストモデルで 50 RPM を捌けているキーでも、画像 10 並列で 429 を踏みます。

現実的な並列予算:

  • 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

429 の Retry-After ヘッダを尊重した指数バックオフと組み合わせます。重要:タイムアウトに対しては再試行しないこと。 第 1 節を参照。

5. 組織認証で詰まる

OpenAI は GPT-Image-2 を組織認証(Persona による身分証チェック)の後ろに置いています。詰まりやすいポイント:

  • 対応国の外(許可リストは公開されていません)
  • 過去に認証済みの場合、90 日間の再認証ロック
  • Persona セッションが期限切れ — OpenAI ダッシュボードから再開する必要があり、Persona のメールリンクからは再開できません
  • 認証成功からモデルアクセス権限の伝搬まで 6–24 時間

「Your organization must be verified」で止まっていて待ちたくない場合、既に認証済みの集約 API 経由なら組織認証ステップ自体を回避できます。次節に SDK を 1 行差し替えるだけの例があります。

用途で経路を選ぶ — 何を作っているかが先

GPT-Image-2 の失敗パターンの多くは、最も不利な構成でリクエストを送ったときに起きます — ラップトップから直接、デフォルトのタイムアウトで、不安定なネットワーク経路で OpenAI の米国エッジまで。もう少しまともな経路が 2 つあります。やっていることに合うほうを選んでください。

コードを書いている/プロダクトに組み込む → Ofox の OpenAI 互換エンドポイント経由

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 エッジまでのネットワーク経路です。日本から OpenAI の US-East エッジへの直接ルートは、レイテンシ数百ミリ秒に加えて散発的なパケットロスや TLS ハンドシェイクのリトライが乗ります — テキスト API なら無視できますが、100–200 秒の streaming コネクションでは、その一回の揺らぎが生成全体を巻き添えにします(第 1 節で説明したタイムアウト失敗の発生メカニズムそのものです)。Ofox はアジア太平洋向けに安定化された経路を保持しており、生成期間中ずっと streaming のバイトが安定して届きます。副次的なメリットとして、第 5 節の組織認証の壁は Ofox 側で既にクリア済みなので、Persona を通さずに同じモデル ID で叩けます。

OpenAI SDK そのまま、モデル ID openai/gpt-image-2 そのまま、streaming・partial_images・参考画像・input_fidelity すべてサポート。クライアント設定の 1 行だけが変わります。

数枚あれば十分、組み込みは不要 → gptimage2.plus

gptimage2.plus は GPT-Image-2 をブラウザ UI でラップしたサービスです。タイムアウトやリトライはサーバー側で吸収され、プロンプトを入力すれば 2K 画像が返ってきます。登録時 5 クレジット無料、未ログインでも 1 日 1 回無料生成可、現在 LAUNCH50 コードで初月 50% オフ。

向いているケース:

  • コードを書かず、数枚あればいい
  • ChatGPT のウェブ UI で画像生成が安定しない日
  • プロンプトを一から書くのではなく、プリセット(商品写真、プロフィール写真、写真修復)から始めたい

パイプラインでバッチ生成したい、自社プロダクトに組み込みたい — その場合は API を使ってください。

API 経由で「失敗が止まる」までの最短経路

  1. streaming を有効化し、partial_images=2。最も投資対効果の高い変更。
  2. セマフォで並列を 3 に制限。Retry-After を尊重した指数バックオフ。
  3. 高リスクパターンに対するプロンプトの事前バリデーション。
  4. タイムアウトでは再試行しない。元のリクエストを完走させるか、非同期タスク化する。
  5. 日本・中国・韓国・東南アジアからの呼び出し、または組織認証で止まっている場合は、アジア太平洋に安定経路を持つ集約 API の base_url に切り替える。

モデル自体は現時点で Arena テキスト生成画像ランキングの首位です。失敗パターンは限定的で、それぞれに 1–2 行で済む修正があります。