症状
スクリプト、またはAIコーディングツール(Codex、Claude Codeなど)内のスキルを使って、自分のコンピューターで画像を生成すると、次のような状況になります。- 1Kや2Kの画像はほとんどの場合返ってきますが、4K画像や複数の参照画像を含むリクエストは、返ってこないことがよくあります
- プログラムにはエラーがまったく表示されず、
read timed outを伴って独自に設定したタイムアウト(600 s、900 s)が発生するまで、またはプロセスを強制終了するまで待機し続けます - 待機中は何も返ってこず、1バイトも受信しません。HTTPステータスコードを含むレスポンスヘッダーすら届きません
- 呼び出しログでは、該当するリクエストは送信から30~90秒後に終了し、エラーコード
write_response_body_failedで失敗と記録されていますが、課金されていません - プログラムがプロキシを迂回して直接接続しています。
NO_PROXYまたはtrust_env=Falseを設定しているか、プロキシアプリでapiyi.comへの直接接続ルールを追加しています
短い回答
画像はすでに生成されています。コンピューターに戻る途中で失われてしまいました。4K画像のレスポンスは数十MBになります。一部の家庭用ブロードバンド回線やオフィスネットワークでは、海外ノードへの直接接続が、このような大きなレスポンスの数十KBほどを受信した時点で切断されることがあります。サーバー側では切断が検知される一方、コンピューターには何も届かないため、プログラムは待ち続けます。**画像リクエストをプロキシ(VPN)経由でルーティングすると、通常はこの問題を解決できます。**このような失敗に対して課金されることはありません。
この問題が発生する理由
ストリーミングを使わない画像リクエストでは、結果が最後にまとめて返されます。
調査したケースでは、サーバーは40-60秒以内に画像を生成し終えて、レスポンスの送信を開始していました。レスポンスヘッダーと最初の64-135 KBはすでに送信されており、その約1秒後に接続が切断されました。お客様のプログラムは0バイトしか受信できず、「接続が閉じられた」という通知も届かなかったため、プログラム独自のタイムアウトまで待機していました。同じ期間中、次のような状況でした。
- 同じコンピューターからの小さな1Kおよび2K画像は、ほとんどの場合正常に届いていました
- 同じアカウントからプロキシ経由で送信されたリクエストでは、40-50 MBの4K画像がほぼすべて届いていました
curlを使った接続テストやブラウザーでは、このような回線でも問題なく動作しているように見えます(小さなリクエストは1秒もかからずに返るため)。そのため、ご自身で問題を見つけるのは困難です。
これはプロキシ経由で約90秒後に画像リクエストが切断される場合とは正反対の状況です。そちらでは、画像を待って接続がアイドル状態の間にプロキシが接続を切断するため、直接接続することで解決します。こちらでは、直接接続では大きなレスポンスを転送できないため、プロキシを使うことで解決します。どちらの経路が使えるかは、以下の比較テストで判断できます。
確認方法
1
呼び出しログを確認する
呼び出しログで該当する時間帯を確認します。ログに失敗した
write_response_body_failedレコードが表示されているのに、プログラムが待機し続けている場合、サーバーは画像の生成を完了し、返送を開始しています。返送中に接続が切れています。2
大きな画像ほど失敗しやすいか確認する
同じpromptと参照画像を使って、1K / 2Kは返ってくるのに4Kは返ってこない場合、原因はほぼ間違いなくこれです。
3
プログラムが実際にプロキシを使っているか確認する
多くのAIコーディングツールは、システムプロキシを参照しないPython / Nodeの子プロセスを起動します。Clashをグローバルモードにしていても、これらのプロセスは直接接続する場合があります。同じターミナルまたはツールで、次のコマンドを実行します。ローカルのブロードバンドIPが表示された場合、その環境からのリクエストは直接送信されています。
4
4K画像をいくつか使い、プロキシ経由と直接接続を交互に試す
プロキシ、直接接続、プロキシ、直接接続の順に交互に実行します。一方を5回実行してからもう一方を5回実行するのは避けてください。一時的なネットワークの変動により、誤った判断につながる可能性があります。プロキシ経由の実行は安定して成功し、直接接続では頻繁にハングする場合、原因が確認できます。
解決策
- プログラムをプロキシ経由で実行する(推奨)
- プロキシアプリで TUN モードをオンにする
- ひとまず応答のサイズを小さくする
プログラムがプロキシをバイパスする設定を削除し、画像リクエストがプロキシ経由になるようにします。
NO_PROXYからapiyi.comを削除します- Python
requests/httpx:trust_env=Falseを削除します - Python
urllib:ProxyHandler({})を使って opener を構築しないでください - Node.js:ネイティブの
fetchはデフォルトでプロキシを使用しません。ProxyAgentなどのライブラリを使って明示的に指定してください
適切なタイムアウトも設定する
この状況では、プログラムに切断シグナルが届かないため、失敗に気付く方法はプログラム自身のタイムアウトだけです。タイムアウトを 900 秒に設定すると、リクエストが失敗したと分かるまでに 15 分も待つことになります。 ストリーミングを使わない画像リクエストでは、画像の生成中にデータが送信されないため、読み取りタイムアウトを生成時間より短くすることはできません。通常の生成時間より少し長めに設定してください。4K なら約 300 秒、1K/2K なら約 180 秒です。タイムアウト後は、まず呼び出しログを確認してリクエストが課金されたかどうかを確かめてから、再試行するかどうかを判断してください。同じ画像を二重に生成しないようにするためです。サーバーにデプロイした後も発生しますか?
中国本土または海外のクラウドサーバーからAPIYIまでの回線は、通常、自宅のブロードバンド回線よりもはるかに良好なため、この問題は主にローカル開発時に発生します。サーバーでも「ヘッダーは届くものの、本文が途中で途切れる」場合は、画像APIの接続切断に関するトラブルシューティングをご確認ください。よくある質問
これらの失敗したリクエストには課金されましたか?
これらの失敗したリクエストには課金されましたか?
いいえ。呼び出しログに
write_response_body_failedとして記録されたリクエストには課金されません。各ログレコードに表示される請求額が正確な金額です。api.apiyi.comへの直接接続テストは成功します。なぜ回線が原因だと言えるのですか?
api.apiyi.comへの直接接続テストは成功します。なぜ回線が原因だと言えるのですか?
接続テストでは数百バイトだけを送受信し、1秒もかからずに完了します。問題が発生するのは数十MBのレスポンスを転送するときだけなので、小さなリクエストでは問題を検出できません。
プログラムを強制終了した後も、サーバーは生成を続けますか?
プログラムを強制終了した後も、サーバーは生成を続けますか?
リクエストが送信されると、サーバーは通常どおり画像を生成します。そのため、プログラムを強制終了してすぐに再試行すると、2つのリクエストが同時に生成される可能性があります。ただし、ここで説明している状況では、プログラムを強制終了する時点で、サーバーはすでに画像の生成を終えていて、画像を返す処理に失敗していることがほとんどなので、課金は発生しません。
影響を受けるのは4Kだけのはずなのに、なぜ2Kでもときどきハングするのですか?
影響を受けるのは4Kだけのはずなのに、なぜ2Kでもときどきハングするのですか?
レスポンスが大きいほど途中で切断されやすくなりますが、必ず失敗する明確なサイズの境界があるわけではありません。2Kのレスポンスでも数MBあるため、回線の状態が悪いと影響を受けることがあります。ただし、その頻度はかなり低くなります。
関連ドキュメント
プロキシ経由で画像リクエストが約90秒後に切断される場合
逆の問題です。プロキシがアイドル状態の接続を閉じるため、直接接続して解決します
画像APIの接続切断に関するトラブルシューティング
write_response_body_failed、SSL EOF、その他の切断エラーに関する包括的なトラブルシューティング
ログにはリクエストが完了して課金されたと表示されますが、クライアントはレスポンスを受信していません。トラブルシューティング方法を教えてください
ログ上の所要時間とクライアントの待ち時間に差が生じる原因
リクエスト記録を確認する方法
期間を指定して各リクエストのステータスと料金を確認します