著者注:画像 API の接続が中断するよくある原因を5つに整理しました。タイムアウト設定、プロキシゲートウェイ、越境通信経路、リトライ戦略、実行環境を取り上げ、越境環境で画像を生成する際に、結果を確実に受け取る方法を紹介します。
画像生成リクエストを送信し、数十秒待った末に Connection reset や Read timed out が返ってくる。これは、越境環境で画像を生成する開発者によくある問題です。さらに厄介なのは、モデル側では画像の生成がすでに完了しているのに、結果がプログラムまで戻ってこないケースです。この記事では、画像 API の接続が中断するよくある原因5つと、それぞれの解決方法を紹介します。海外・国内いずれの環境でも、安定して画像を生成できるようになります。
一般的なネットワーク解説にとどまらない内容です。 開発者の接続をサポートするなかで、何度も直面してきた実際の問題をもとにしています。たとえば、米国のサーバーにサービスをデプロイしている開発者が特に気にするのは、どの接続先アドレスを設定すればよいか、越境呼び出しに時間がかかるか、そして画像のような大きなレスポンスをどうすれば完全に受け取れるか、といった点です。
この記事で得られること:読み終えるころには、「クライアント → ゲートウェイ → 通信経路 → リトライ → 実行環境」の5つのレイヤーに沿って、画像 API の接続中断の原因を特定できるようになります。また、すぐに使えるタイムアウト・リトライ用コードテンプレートも紹介します。

画像 API の接続切断を調べる際の重要ポイント
まず結論からお伝えします。画像 API の接続切断は、ほとんどの場合、次の5つの箇所で発生します。優先度の高い順に並べています。
| 番号 | よくある原因 | 典型的な症状 | 対処方法 |
|---|---|---|---|
| 1 | クライアントのタイムアウト設定が短すぎる | 毎回ほぼ同じ秒数で timeout が発生する |
読み取りタイムアウトを個別に延長する |
| 2 | プロキシやゲートウェイのアイドルタイムアウト | 約60秒で安定して切断され、502/504が返る | Nginxやロードバランサーのタイムアウトを調整する |
| 3 | 国際回線の品質や大きなレスポンスボディ | 断続的に切断され、結果が大きいほど失敗しやすい | 適切な接続先を選び、返送データのサイズを抑える |
| 4 | 不適切なリトライ戦略 | 重複して課金される、または混雑時にリトライするほど失敗する | むやみな自動リトライを無効にし、バックオフを設定する |
| 5 | 実行環境そのものの制限 | Serverlessやブラウザーからの直接接続で必ず切断される | 常駐するバックエンドプロセス、または非同期タスクに切り替える |
画像 API はなぜ対話 API より接続が切断されやすいのか
画像生成 API は通常、同期呼び出しです。リクエストを送信した後、モデルの生成が完了し、結果が返ってくるまで接続を維持する必要があります。対話 API ではストリーミング出力が可能で、数百ミリ秒ほどでデータが返り始めます。一方、画像 API は生成中にデータがまったく転送されないことが多く、この「無通信状態」が数十秒、場合によってはそれ以上続くため、各レイヤーのアイドルタイムアウトに引っかかりやすくなります。
もうひとつの重要な要因は、レスポンスボディが大きいことです。高解像度の画像を base64 形式で返す場合、レスポンスボディは数MBに達することがあり、動画の結果ファイルはさらに大きくなります。国際回線で一度でも通信が不安定になると、大きなレスポンスボディは転送が不完全になりやすくなります。
特に注意が必要なのは、接続が切れても結果は失われる一方で、生成はすでに完了していて課金されている可能性があることです。サーバーは、すでに切断された接続に結果を「再送」できません。そのため、接続切断の調査は安定性だけでなく、コストにも直結します。
国際回線経由で画像を生成する場合の接続先の選び方
APIYIのサーバーは米国西海岸に設置されています。海外のサービスから利用する場合は、https://api.apiyi.com/v1 をそのままお使いいただけます。物理的な距離が近いため、遅延を抑えられます。中国国内からのアクセスもスムーズなのはなぜかと疑問に思う方もいるでしょう。これは、画像や動画のような大きなレスポンスボディを扱うサービスの安定性を高めるため、国内向けの高速化回線を用意しているためです。
| デプロイ地域 | 推奨接続先 | 回線の特徴 | 注意点 |
|---|---|---|---|
| 米国/北米のサーバー | デフォルトの接続先 | サーバーと同じ地域にあり、遅延が最小 | ローカルのゲートウェイのタイムアウトを重点的に確認する |
| 欧州/アジア太平洋地域の海外サーバー | デフォルトの接続先 | 公衆インターネット経由で地域間を接続し、全体的に安定 | 読み取りタイムアウトを適度に延長する |
| 中国本土のサーバー | デフォルトの接続先 | 国内向け高速化回線を経由 | さらに不安定なプロキシを重ねない |
| ローカルの開発マシン | デフォルトの接続先 | ローカルネットワークの影響を受けやすい | ローカルでの結果だけで本番環境の挙動を判断しない |
このように、OpenAI互換モードでは、デプロイ先にかかわらず、接続時に変更するのは base_url だけです。地域ごとに複数のコードを管理する必要はありません。地域に応じて調整が必要なのは、タイムアウトのパラメーターと中間経路の設定です。

画像 API の接続中断をすばやく解決する方法
最小限の例:まずタイムアウトと自動リトライを適切に設定する
接続中断の多くは、SDK のタイムアウトとリトライ設定を適切に調整するだけで解決できます。以下は OpenAI 公式 Python SDK を使った例です。
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1", # APIYI 统一接入地址,海外与国内部署通用
timeout=300, # 图片生成是同步调用,给足等待时间
max_retries=0, # 关闭 SDK 自动重试,避免断开后重复生成、重复计费
)
result = client.images.generate(
model="gpt-image-1", # 按控制台模型列表替换
prompt="一只在雪山前奔跑的柴犬,电影感光影",
size="1024x1024",
)
print("已拿到结果,数据长度:", len(result.data[0].b64_json or ""))
見落としやすいポイントが2つあります。1つ目は、OpenAI Python SDK がデフォルトで接続エラーやタイムアウト時に自動リトライすることです。チャット API では大きな問題にならないことが多い一方、画像 API ではリトライのたびに新たな画像生成が実行され、再度課金される可能性があります。2つ目は、timeout に単一の数値を指定すると、接続と読み取りの両方にその値が適用されることです。本番環境では、以下の完全なコードのように個別に設定することをおすすめします。
完全な実装コードを見る(段階別タイムアウト+回数制限付きリトライ+結果の保存)
import base64
import time
import uuid
import httpx
import openai
# 分层超时:连接要快速失败,读取要足够耐心
TIMEOUT = httpx.Timeout(
connect=10.0, # TCP/TLS 建连,超过 10 秒基本是网络问题
read=300.0, # 等待生成与回传大响应体
write=60.0, # 上传参考图(图生图/编辑)时需要
pool=10.0,
)
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1", # APIYI OpenAI 兼容接口
timeout=TIMEOUT,
max_retries=0,
)
# 只对“请求大概率没到达服务端”的错误重试
RETRYABLE_BEFORE_SEND = (openai.APIConnectionError,)
def generate_image(prompt: str, out_dir: str = ".", max_attempts: int = 2) -> str:
task_id = uuid.uuid4().hex[:8]
for attempt in range(1, max_attempts + 1):
start = time.time()
try:
resp = client.images.generate(
model="gpt-image-1",
prompt=prompt,
size="1024x1024",
)
# 拿到结果第一时间落盘,避免后续逻辑异常导致结果丢失
path = f"{out_dir}/img_{task_id}.png"
with open(path, "wb") as f:
f.write(base64.b64decode(resp.data[0].b64_json))
print(f"[{task_id}] 成功,耗时 {time.time() - start:.1f}s")
return path
except openai.APITimeoutError:
# 读取超时:服务端很可能已在生成,不建议立即重试
print(f"[{task_id}] 读取超时 {time.time() - start:.1f}s,请检查超时与链路")
raise
except RETRYABLE_BEFORE_SEND as e:
elapsed = time.time() - start
# 建连阶段很快失败,才认为请求未送达,可以退避重试
if elapsed < 15 and attempt < max_attempts:
wait = 2 ** attempt
print(f"[{task_id}] 建连失败,{wait}s 后重试:{e}")
time.sleep(wait)
continue
print(f"[{task_id}] 连接中断({elapsed:.1f}s),不再重试:{e}")
raise
except openai.APIStatusError as e:
# 429 / 5xx 交给上层按业务决定,避免高峰期雪崩
print(f"[{task_id}] 状态码 {e.status_code}:{e.message}")
raise
if __name__ == "__main__":
generate_image("赛博朋克风格的城市夜景,霓虹灯倒映在雨后街道")
🚀 クイックスタートのおすすめ:まずは上記のシンプルなサンプルを実際のデプロイ環境で実行し、処理にかかった時間をすべて記録しましょう。その結果をもとに、読み取りタイムアウトを設定します。APIYI(apiyi.com)に登録すると無料のテスト枠を利用できるので、本番公開前にタイムアウト、ゲートウェイ、リトライのパラメーターをまとめて調整するのに便利です。
画像APIの接続が中断される5つのよくある原因を詳しく解説
原因1:クライアントのタイムアウト設定が短すぎる
最もよくある原因で、修正も簡単です。多くのHTTPクライアントや業務フレームワークでは、デフォルトのタイムアウトが30秒または60秒に設定されています。チャットAPIの呼び出しには十分ですが、高解像度の画像生成や複雑なプロンプト、高負荷の時間帯では、画像生成にそれ以上かかることがあります。
判断方法は簡単です。失敗するたびにほぼ同じ秒数で止まる場合は、どこかの層でタイムアウトが発生している可能性が高いでしょう。この場合は、接続タイムアウトと読み取りタイムアウトを分けて考える必要があります。接続タイムアウトは短く設定してネットワークの問題をすぐに検出できるようにし、読み取りタイムアウトは「生成時間+応答の返送時間」の最悪ケースをカバーできる長さに設定します。
原因2:プロキシやゲートウェイのアイドルタイムアウト
クライアントのタイムアウトを適切に設定していても、リクエスト経路上のNginx、クラウドロードバランサー、APIゲートウェイにも、それぞれタイムアウトが設定されています。Nginxの proxy_read_timeout はデフォルトで60秒です。また、多くのクラウドロードバランサーのアイドルタイムアウトも同程度です。画像生成中の無通信状態がこの時間を超えると、ゲートウェイが接続を切断し、クライアントには502、504、または接続リセットとして表示されます。
「フロントエンド → 自社バックエンド → 画像API」という転送構成の場合は、自社バックエンドの受信側ゲートウェイと送信側プロキシの両方を確認してください。
location /api/image/ {
proxy_pass http://backend;
proxy_connect_timeout 10s;
proxy_send_timeout 120s;
proxy_read_timeout 300s; # 画像生成中の無通信状態をカバー
client_max_body_size 20m; # 画像から画像生成や画像編集では参照画像のアップロードが必要
proxy_buffering on;
}
| レイヤー | 主要なパラメーター | よくあるデフォルト値 | 推奨される設定 |
|---|---|---|---|
| SDK / HTTPクライアント | read timeout | フレームワークによって大きく異なる | 最悪の生成時間をカバーし、余裕を持たせる |
| 自社運用のNginx | proxy_read_timeout | デフォルトは60秒 | クライアントの読み取りタイムアウトに合わせる |
| クラウドロードバランサー | idle timeout | 多くは数分以内 | 管理コンソールで明示的に延長する |
| ブラウザー / フロントエンド | fetchに組み込みのタイムアウトはないが、上流の制限を受ける | ゲートウェイによる | バックエンドのタスク状態をポーリングする方式に変更する |
| Serverlessプラットフォーム | 最大実行時間 | プラットフォームによって異なる | 長時間実行に対応したプランを選ぶか、アーキテクチャを変更する |
実用上の原則は、外側のレイヤーほど、内側のレイヤー以上のタイムアウトを設定することです。ゲートウェイのタイムアウトがクライアントより短いと、クライアント側のタイムアウト設定は意味をなさなくなります。
原因3:越境通信の品質と大きなレスポンスの転送
越境通信の特徴は、「平均遅延は許容範囲でも、遅延の揺らぎやパケットロスが予測しにくい」ことです。対話インターフェースの小さなリクエストで遅延が発生しても、数個のパケットを再送すれば済みます。一方、画像インターフェースで数MBの結果を転送する場合は転送時間が長くなるため、遅延の揺らぎに遭遇する確率も高くなります。
この層では、次の3つの方法で最適化できます。
- 接続先を適切に選ぶ:海外にデプロイする場合は、デフォルトの接続先を使えば、米国西海岸のサーバーと近い場所から通信できます。国内にデプロイする場合もデフォルトの接続先を使い、プラットフォームの国内向け高速回線に越境部分を任せましょう。安定性が不明な自前のプロキシを重ねて使うのは避けてください。
- レスポンスのサイズを抑える:業務要件を満たす範囲で、適切な画像サイズと枚数を選びましょう。1回のリクエストで複数枚を生成すると、転送されるデータ量もその分増加します。
- 受け取ったらすぐに保存する:結果を受け取ったら、すぐにローカルまたはオブジェクトストレージに書き込みましょう。一連の後処理をメモリ上で済ませてから保存するのは避けてください。
💡 通信経路に関するアドバイス:同じ業務で海外サーバーと国内サーバーの画像生成パフォーマンスを比較したい場合は、両方の環境に上記のテストスクリプトをデプロイし、APIYI(apiyi.com)経由で接続して、所要時間と成功率を比較できます。デプロイ先だけを変えてコードは変えないことで、より正確に比較できます。

原因4:リトライ戦略が適切でない
リトライ自体が問題なのではなく、「すべてのエラーを同じように扱ってリトライする」ことが問題です。画像APIで読み取り中に接続が切れた場合、サーバー側ではすでに生成が始まっているか、完了している可能性が高く、その状態ですぐにリトライすると、同じ注文をもう一度送ることになります。さらに、ピーク時に多くのクライアントが一斉に高速リトライすると、待ち時間が長くなり、タイムアウトも増えるという悪循環に陥ります。
| 失敗シナリオ | リクエストは送信済みか | リトライの推奨 | 対処方法 |
|---|---|---|---|
| DNS解決失敗、接続タイムアウト | ほぼ未送信 | 推奨 | 指数バックオフを適用し、回数を制限する |
| TLSハンドシェイク失敗 | ほぼ未送信 | 推奨 | まずローカルのプロキシと証明書を確認する |
| 読み取りタイムアウト | 送信済みの可能性が高い | 慎重に判断 | まずタイムアウトを延長し、その後、人手で確認する |
| 応答の受信中に接続がリセット | 送信済みで、処理が完了している可能性もある | 自動リトライは非推奨 | ログを記録し、通信経路を調査する |
| 429によるレート制限 | 送信済みだが拒否された | 推奨 | バックオフ間隔を長くし、同時実行数を制御する |
| 5xxサーバーエラー | 送信済み | 状況に応じて判断 | 少ない回数でバックオフ付きのリトライを行い、アラートを出す |
基本的な考え方は、完全版のコードにある次の判定に集約されます。「リクエストがサーバーに届いていない可能性が高い場合に限り、自動でリトライする」。それ以外のケースは、ビジネスロジック側で判断しましょう。ユーザーが自分で画像生成を実行した場合、裏側で黙ってリトライするより、「生成に失敗しました。もう一度お試しください」と明確に案内するのがおすすめです。
原因5:実行環境自体の制限
接続が中断する原因は、必ずしもネットワークにあるとは限りません。実行環境側が処理の完了を待てないケースもあります。よくあるのは次の3つです。Serverless関数には最大実行時間が設定されており、上限に達するとプラットフォームによって処理が終了されます。ブラウザーから画像APIを直接呼び出す場合は、ページの切り替えやモバイルネットワークの切り替えで接続が中断することがあります。また、一部のコンテナプラットフォームでは、アイドル状態になるとインスタンスが回収されます。
こうした問題を防ぐには、画像生成を常時稼働するバックエンドプロセスやタスクキューで実行するのがおすすめです。フロントエンドからタスクを送信し、タスクIDを受け取ったあと、ポーリングやプッシュ通知で結果を取得します。生成処理をユーザーとの接続から切り離せば、ユーザーがページを再読み込みしても結果は失われません。動画生成では結果ファイルのサイズが大きくなるため、特にこのような分離方式で結果を返すのが適しています。
画像APIの接続中断に関する実践チェックリスト
本番環境で接続中断が発生したら、次の順番で一つずつ確認しましょう。多くの場合、30分以内に問題が発生している階層を特定できます。
- 処理時間の分布を確認する:失敗したリクエストの処理時間を集計します。特定の時間に集中している場合はタイムアウト設定の問題、ばらつきがある場合は通信経路の問題が考えられます。
- エラーの種類を確認する:接続確立の失敗、読み取りタイムアウト、接続リセット、HTTPステータスコードを区別します。それぞれ問題のある階層が異なります。
- 中間層を介さずに直接接続してテストする:同じサーバーからスクリプトでAPIを直接呼び出します。成功する場合は、自社のゲートウェイやプロキシに問題がある可能性があります。
- 時間帯を変えて再テストする:ピーク時に失敗率が大きく上がる場合は、まず同時実行数と再試行の設定を確認します。
- 請求明細とログを照合する:読み取り中に切断されたリクエストについて、課金済みかどうかを確認し、損失の把握と対策の改善に役立てます。
🎯 技術的なアドバイス:調査に備えて、リクエストの開始時刻、終了時刻、エラーの種類、リクエストIDを毎回ログに記録しておきましょう。APIYI apiyi.com のコンソールでリクエストが成功しているのに、プログラム側でエラーが出ている場合は、結果の返送段階で通信経路またはタイムアウトに問題がある可能性が高いです。
よくある質問(FAQ)
Q1:画像 API の接続中断とは何ですか?
画像生成リクエストの完了前に、クライアントとサーバー間の接続が切断されることです。よくあるエラーには、読み取りタイムアウト、接続リセット、502、504 などがあります。画像 API は同期呼び出しのため、接続が切れると生成結果をクライアントに再送できません。
Q2:海外サーバーと中国国内サーバーで呼び出す場合、base_url を別々に設定する必要がありますか?
必要ありません。サーバーは米国西海岸に設置されており、海外から利用する場合はデフォルトの接続先をそのまま使用できます。中国国内からのアクセスには、プラットフォームの中国国内向け回線による高速化が適用されます。どちらの環境でも同じ base_url を使用し、違いがあるのはタイムアウト設定と中間ゲートウェイの構成だけです。
Q3:接続が中断された場合、そのリクエストの料金は発生しますか?
発生する可能性があります。モデルによる生成が完了した後、結果を返送する段階で接続が切れた場合、生成自体は完了しているため、通常は料金が発生します。ただし、結果は届きません。だからこそ、タイムアウトを適切に設定し、リトライは慎重に構成する必要があります。
Q4:読み取りタイムアウトはどのくらいに設定すればよいですか?
一律の基準値はありません。実際のデプロイ環境でテストすることをおすすめします。目標のサイズと一般的なプロンプトを使って複数のリクエストを実行し、時間がかかるケースを基準に、十分な余裕を加えて設定してください。また、ゲートウェイやロードバランサーのタイムアウトが、この値を下回らないようにします。
Q5:タイムアウトとリトライの設定が適切か、手早く確認するにはどうすればよいですか?
次の手順で確認できます。
1. APIYI apiyi.com に登録し、APIキーと無料のテストクレジットを取得します
2. この記事のコード全体で base_url を `https://api.apiyi.com/v1` のままにして、本番環境と同じリージョンのサーバーにデプロイします
3. 複数のリクエストを連続して実行し、処理時間の分布と失敗の種類を記録してから、結果に応じてパラメーターを調整します
Q6:動画生成 API でも同じ問題が起きますか?
起きます。動画の結果ファイルはサイズが大きく、国境をまたぐデータ転送の安定性にも、より強く影響されます。対策の基本は同じです。読み取りタイムアウトを長めに設定し、結果を受け取ったらすぐにディスクへ保存します。また、生成処理をユーザーとの接続から切り離し、結果の返送に失敗してもむやみにリトライしないようにします。
Q7:これらの方法で接続中断をゼロにできますか?
完全になくすことはできません。国境をまたぐネットワークでは、突発的な不安定さを完全に避けるのは困難です。この記事で紹介した方法は、失敗率を許容できる範囲まで下げ、失敗が起きた場合に原因を特定し、経緯を追えるようにするものです。重要な業務では、アラートと人による確認の仕組みもあわせて導入することをおすすめします。
画像 API の接続切断を調査する際の重要ポイント
- 同期呼び出しが根本原因:画像 API の生成中はデータ転送が発生しないため、各レイヤーのアイドルタイムアウトに最も引っかかりやすくなります。
- 切断すると結果を失う:結果を返す段階で接続が切れても、生成はすでに完了して課金されている可能性があります。安定性はコストに直結します。
- タイムアウトはレイヤーごとに調整:接続タイムアウトは短く、読み取りタイムアウトは長く設定し、外側のゲートウェイのタイムアウトは内側と同じか、それ以上にします。
- 再試行は発生段階を見極める:自動再試行は、リクエストが送信されていない接続確立時のエラーに限定し、指数バックオフを組み合わせます。
- 接続先を統一:海外・国内どちらの環境でも同じ
base_urlを使い、APIYI(apiyi.com)に接続先を統一できます。 - 長時間タスクは切り離す:Serverless やブラウザーからの直接接続では、バックエンドでタスクを実行し、ポーリングで結果を取得する方式に切り替えます。
まとめ
画像 API の接続切断を調査する際は、次のポイントが重要です。
- まず原因のレイヤーを特定する:クライアント、ゲートウェイ、ネットワーク経路、再試行、実行環境の5つのレイヤーを順に確認し、処理時間の分布とエラーの種類を調べます。
- 次にパラメーターを調整する:レイヤーごとにタイムアウトを設定し、SDK の無条件な自動再試行を無効にして、ゲートウェイとクライアントのタイムアウトを揃えます。
- 最後にアーキテクチャを見直す:大きなレスポンスは受信後すぐにディスクへ保存し、時間のかかるタスクはユーザーとの接続から切り離します。
海外向けの画像生成だからといって、必ずしも不安定になるわけではありません。接続切断の多くは設定やアーキテクチャに起因するため、体系的に対処できます。本番公開前に、この記事のテストスクリプトを実環境に導入して一度実行してみてください。APIYI(apiyi.com)を使えば、1つの API キーで複数の画像モデルの生成時間と安定性をすばやく比較できます。
📚 参考資料
- APIYI クイックスタートと API マニュアル:接続先URLと3ステップでの接続手順を解説
- リンク:
docs.apiyi.com -
説明:OpenAI 互換モードの
base_urlの設定方法や、画像 API の呼び出しに関する注意事項を掲載しています -
OpenAI Python SDK:公式クライアントライブラリ
- リンク:
github.com/openai/openai-python -
説明:
timeoutやmax_retriesなどのパラメーターについて、詳しい説明を確認できます -
Nginx プロキシモジュールのドキュメント:
proxy_read_timeoutなどのパラメーターを解説 - リンク:
nginx.org/en/docs/http/ngx_http_proxy_module.html - 説明:独自ゲートウェイのタイムアウト設定を調整する際に参考になります
著者:APIYI 技術チーム
技術に関するお問い合わせ:APIYI 公式サイトのトップページからお気軽にご連絡ください。接続に関する資料はドキュメントセンターでもご覧いただけます。
