コーディング エージェントは、再試行とレート制限の処理を追加し、テストは通っていると言います。 それを信頼する前に、テストが何を対象に実行されたか確認してください。
3 つのコーディング エージェント (210 回の実行) で実施したテストでは、アプリで API の障害を処理し、アプリが動作することを示すよう依頼しました。 作業コードを要求した 140 回の実行のうち 76% では、エージェントはフェッチ スタブ、httpx.MockTransport、または使い捨ての HTTP サーバーを使用して障害を手作業で再現しました。 実際の API が使用可能で、プロンプトで除外されなかった 75 の実行では、実際の API URL でアプリをテストした実行は 0 件でした。 このようなテストに合格すると、エージェントのコードがエージェントが想像した障害を処理することが証明されます。 これは、API が送信するエラーとは異なる失敗です。
Checklist
- 何を対象にテストしたのかを尋ねます。 エージェントに「テスト中にアプリが呼び出した URL と、何がエラーを返したか」を尋ねてください。回答がスタブまたは作成したローカル サーバーの場合は、追加したブランチの単体テストとしてテストを扱います。
- テスト用に追加されたスイッチを探します。 差分内で新しい環境変数、ベース URL 設定、またはフラグを検索します。 このテストでは、GitHub、OpenAI、または天気 API を呼び出すアプリでの 105 回の実行のうち 61 回で、1 つ追加しました。 本番環境にするかどうかを決定します。
- API の文書化された動作に照らしてコードを確認します。 各 API は、それぞれ独自の形で失敗します:
-
GitHub: プライマリ レート制限を超えると、
x-ratelimit-remainingが返され、0が に設定されます。その後、x-ratelimit-resetの時刻 (UTC エポック秒) まで待機します。 セカンダリ レート制限の場合は、retry-afterが存在する場合は待機します。それ以外の場合は、0がx-ratelimit-resetの場合はx-ratelimit-remainingまで、それ以外の場合は 1 分以上待ちます。 429 のみをチェックするコードでは、403 が見落とされます。 -
OpenAI: 一部の 429 は、
credit_balance_exhaustedに関するものです。 それらを再試行しても役に立ちません。 429 エラーのたびに再試行するコードでは、問題が見えなくなります。 -
Anthropic: 支出上限 429 には
retry-afterヘッダーがなく、オーバーロードは 529 を返します。標準のステータスコードしか知らないコードでは、これを想定していない可能性があります。
-
GitHub: プライマリ レート制限を超えると、
-
Retry-Afterがどう読めるか確認します。 ヘッダーは、秒数または HTTP 日付 (RFC 9110) を保持します。 コードが API が送信する形式を処理し、試行回数と合計待機時間を制限し、既に再試行されている SDK の上で再試行しないことを確認します。 - 再試行が実行されたときにユーザーに表示される内容を確認します。 スタック トレースや無限のスピナーではなく、明確なメッセージを探し、ユーザーが作業を失っていないことを確認します。
- シミュレートされた障害を伴う実際の URL でアプリを実行します。 これは、実行中のアプリ、SDK、および再試行ポリシーがどのように動作するかを示す唯一の手順です。
エージェントが記述したエラー処理を確認する方法
| Approach | 見つけたもの | 見逃したもの |
|---|---|---|
| 差分を読む | コードが正しく見えるかどうか | API の実際の応答に対して正しく動作するかどうか |
| エージェントのテストを実行する | それが書き込んだブランチが実行されること | スタブが再現しなかったもの (実際の状態コード、ヘッダー、エラー本文、SDK の再試行) |
| 失敗するまで実際の API を呼び出す | 実際の挙動 | オンデマンドで障害をトリガーすることはできません。実際のクォータを使用します |
| 障害をシミュレートして実際の URL でアプリを実行する | 実行中のアプリ、SDK、および再試行ポリシーが API 独自のエラーを処理する方法 | 独立したコード。 そのために、エージェントの単体テストを保持します。 |
アプリで試す
Dev Proxy は、アプリが実際の API に送信する要求をインターセプトし、選択したエラーを返します。アプリのコードを変更せずに利用できます。 よく使われる API の場合は、プリセットから始めます。 エージェントが書き込んだGitHubレート制限の処理を確認するには:
devproxy config get github-rate-limiting
devproxy --config-file "~dataFolder/configs/github-rate-limiting/.devproxy/devproxyrc.json"
アプリを実行し、Dev Proxy の出力を確認します。 プリセットは、アプリが制限を超えると、GitHubのレート制限ヘッダーを含む 429 を返します。 プリセットの RetryAfterPlugin は、待機時間が終了する前にアプリが API を再度呼び出した場合に知らせます。
openai-throttlingプリセットとanthropic-throttlingプリセットは、プロバイダー独自のレート制限エラーに対して同じ処理を行い、openai-throttlingも再試行すべきではないcredit_balance_exhausted 429を返します。
その他の API の場合:
- GenericRandomErrorPlugin は、選択した頻度で定義したエラーを返します。
--failure-rateでレートを設定します。 「ランダムなエラーでアプリをテストする」を参照してください。 - LatencyPlugin は応答を遅らせ、エージェントが設定したタイムアウトを確認できます。 「遅い API 応答をシミュレートする」を参照してください。
また、開発プロキシ構成を記述するようにコーディング エージェントに依頼することもできます。 Dev Proxy MCP サーバー をエージェントに追加して、Dev Proxy のドキュメントとベスト プラクティスを調べて、インストールしたバージョンを確認できるようにします。 エージェントが書く他のコードと同様に、その設定を確認します。
開発プロキシをインストールするには、「 開発プロキシの設定」を参照してください。
次のステップ
参照
Dev Proxy