AIがFetch APIに関して間違えがちな5つのこと

AIコーディングアシスタントは「正しそうに見える」コードを書きます。「正しい」コードを書くわけではありません。

ほとんどのモデルは単純なfetchのスニペットを提案します。それはデモでは動作しますが、本番環境では失敗します。Fetch APIは低レベルなツールであり、完全なHTTPクライアントではありません。AIにはできないアーキテクチャ上の決定を、あなた自身が行う必要があります。

AIがfetchにおいて失敗する5つのパターンは以下の通りです:

  • エラーハンドリング AIは、リクエストの失敗がPromiseの拒否(reject)につながると想定しています。これは間違いです。404や500のエラーはcatchブロックをトリガーしません。response.okを手動でチェックする必要があります。そうしないと、アプリはエラーページを成功したデータとして扱ってしまいます。

  • リクエストのキャンセル AIはAbortControllerの使用を忘れがちです。これはReactのようなフレームワークにおいて、メモリリークやレースコンディションの原因となります。ユーザーがリストを素早くクリックした場合、古いリクエストが新しいリクエストの後に解決(resolve)してしまうことがあります。これにより、UIに古いデータが表示されてしまいます。また、意図的なキャンセル時にエラーメッセージを表示させないよう、AbortErrorをフィルタリングする必要があります。

  • ストリーミングデータ AIはレスポンスを単一のブロックとして扱います。これは、大きなファイルやLLMのレスポンスを扱う際に問題となります。ネットワークのチャンクによって、単一の文字やJSONの行が途中で分割される可能性があるからです。チャンク間でバイトを正しく処理するには、TextDecoderStreamとバッファを使用する必要があります。

  • レジリエンスとリトライ AIは単純すぎる(naiveな)リトライループを提示します。これらのループは危険です。POSTリクエストをリトライしてしまうことが多く、二重課金やデータの重複を引き起こす可能性があります。また、バックオフ(backoff)やジッター(jitter)も欠いています。これにより、サーバーの一時的な不具合が大規模な障害へと発展してしまいます。リトライするのは冪等(idempotent)なリクエストのみに限定し、指数バックオフ(exponential backoff)を使用しなければなりません。

  • 環境の違い AIはブラウザとNode.jsのルールを混同します。Node.jsはCORSを強制しません。また、Node.jsはデフォルトのタイムアウト設定も異なります。Nodeでは、接続のリークを防ぐためにボディを消費(consume)する必要があります。AIはターゲットとなる実行環境を知ることができないため、片方では動作するがもう片方では壊れるようなコードを提示することがよくあります。

戦略:

AIはスキャフォールディング(土台作り)のために使いましょう。ボイラープレートや基本的な構造を書かせるのです。

セマンティクス(意味論)はあなたが管理しなければなりません。404をエラーとするかどうか、リトライの予算をどうするか、認証ヘッダーをどう扱うか。これらはあなたが決定することです。

AIは「もっともらしい」コードを最適化します。あなたは「正確さ」を最適化しなければなりません。

出典: https://dev.to/devunionx/new5-things-even-ai-cant-do-fetch-api-328e