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_blocked、Your request was rejected | 2 段モデレーション | 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_format—gpt-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 経由で「失敗が止まる」までの最短経路
- streaming を有効化し、
partial_images=2。最も投資対効果の高い変更。 - セマフォで並列を 3 に制限。
Retry-Afterを尊重した指数バックオフ。 - 高リスクパターンに対するプロンプトの事前バリデーション。
- タイムアウトでは再試行しない。元のリクエストを完走させるか、非同期タスク化する。
- 日本・中国・韓国・東南アジアからの呼び出し、または組織認証で止まっている場合は、アジア太平洋に安定経路を持つ集約 API の base_url に切り替える。
モデル自体は現時点で Arena テキスト生成画像ランキングの首位です。失敗パターンは限定的で、それぞれに 1–2 行で済む修正があります。


