GitHub Repo
langchain-openai 1.6.6、ストリーミング時のエラー通知漏れを修正 失敗イベントで例外を送出
新版では、Responses APIのストリーミング中に明示的な失敗イベントをアプリケーション層へ伝達し、同期・非同期の両インターフェースにテストを追加した。終了イベントのない途切れたストリームについては別途検証が必要で、既存の例外処理やリトライ戦略も確認する必要がある。

LangChainは9月24日、langchain-openai 1.6.6をリリースし、Responses APIのストリーミングで失敗イベントを受信しても例外が送出されない問題を修正した。GitHubのリリース記録とPyPIの公開日は一致しており、修正は正式なパッケージとして提供されている。これにより、ストリーミングで受け取った回答を使って後続の処理を進めるエージェントは、生成の失敗をより明確に識別できるようになる。[リリース記録](https://github.com/langchain-ai/langchain/releases/tag/langchain-openai==1.6.6)、[PyPIパッケージ](https://pypi.org/project/langchain-openai/1.6.6/)
問題の原因はイベント変換層にあった。7月のユーザー報告では、模擬HTTPトランスポートを使って問題が再現された。サーバーが一部のテキストを送信した後に失敗イベントを送っても、旧バージョンでは例外が発生せず、エラー情報も保持されないまま、イテレーションが正常終了する場合があった。アプリケーションが「ループの終了」を成功と見なすと、途中で途切れた回答が保存されたり、次のステップに渡されたりする可能性がある。[元の報告](https://github.com/langchain-ai/langchain/issues/39039)
新しいコードでは、`response.failed`を受信するとレスポンス内のエラー情報を読み取り、`error`を受信するとエラーコードとメッセージを組み合わせ、どちらの場合も`ValueError`を送出する。失敗したレスポンスにエラー情報がない場合は、レスポンスIDを使ってメッセージを生成する。これによりアプリケーション層で失敗を捕捉できるが、既存のハンドラーがプロバイダーのSDK固有の例外だけを捕捉している場合は、調整が必要になる。[修正差分](https://github.com/langchain-ai/langchain/pull/40791/files)
すでに画面へ表示したテキストやバッファーへ書き込んだテキストも、アプリケーション側で処理する必要がある。今回のコード変更から推測すると、例外が送出されても、それまでに出力された断片が自動的に取り消されるわけではない。後続の処理で内容をツールの引数として解析する場合は、レスポンスの完了を確認してから、操作を実行するかどうかを判断すべきだ。エラーメッセージは診断に利用できるが、リトライの可否やバックオフの待機時間は、別の層で決める戦略となる。
今回の修正では、同期の`stream()`と非同期の`astream()`のテストも追加され、サーバーエラー、エラー情報の欠落、レート制限イベントをカバーしている。これらのテストは模擬ストリームを使っており、イベントの伝達を検証できる一方、実際のネットワーク、プロキシサーバー、サービス停止時の挙動をすべて再現するものではない。[テストコード](https://github.com/langchain-ai/langchain/pull/40791/files)
修正範囲には限界もある。追加された分岐が処理するのは明示的な失敗イベントであり、`response.incomplete`は引き続き既存の処理経路を通る。元の報告では、終了イベントがまったく届かないストリームにも言及している。今回の差分を見る限り、そのような途切れ方にも対応済みだとは判断できない。[問題と再現例](https://github.com/langchain-ai/langchain/issues/39039)
運用に向けては、アップグレード後に「テキストを出力した後で失敗する」ケースを使って、画面の状態、トレース記録、リトライ戦略を検証し、完了状態のチェックも維持することが望ましい。これは修正後の挙動に基づくデプロイ時の推奨事項だ。例外によって失敗が可視化されても、部分的な回答をどう表示するか、リトライ時に完了済みの処理を重複実行しないようにするにはどうするかは、引き続きアプリケーション側で決める必要がある。