LiveKit Agents の OpenAI Responses LLM 利用中に、WebSock...
# ask-ai
b
LiveKit Agents の OpenAI Responses LLM 利用中に、WebSocket 送信時の接続エラーが発生しました。 エラー概要: - livekit.plugins.openai.responses.llm.LLM failed, switching to next LLM - aiohttp.client_exceptions.ClientConnectionResetError: Cannot write to closing transport - livekit.agents._exceptions.APIConnectionError: failed to send request over WebSocket 発生箇所: - livekit.plugins.openai.responses.llm.generate_response - WebSocket 経由でリクエスト送信中 補足: - fallback LLM に切り替わっているため、一次 LLM への送信失敗として見えています。 - job_id、room_id、内部パス、pid、詳細 timestamp はマスクしています。
✅ 1
t
Thanks for reaching out, RikuKomiya. I'm an AI assistant and I'm here to help. Give me a moment while I research this topic.
ご報告ありがとうございます。WebSocket送信時のエラー(`Cannot write to closing transport` → `failed to send request over WebSocket`、一次LLMからフォールバックに切替)について確認します。 まず、原因切り分けのため以下を教えてください(マスクした値はそのままで構いません): 1. 問題発生直前〜直後のAgentログのフルスタックトレース数行(タイムスタンプ含む) 2. Agentの稼働環境(例:Kubernetes、GCE/AWS VM、オンプレ、ローカル)とネットワーク制限の有無(プロキシ/ファイアウォールなど) 3. OpenAI接続設定(使用中のエンドポイント種別:標準API/Responses、APIキーが環境変数/シークレットに正しく設定されているか) 4. 発生頻度:断続的か常時再現するか、特定のリクエストでのみ発生するか 5. 使用中のLiveKit Agents SDKバージョンと aiohttp バージョン(わかれば) 当面の対処案(すぐ試せるもの): • Agent の再起動で一時的な接続不良が解消するか確認。 • ネットワーク機器やプロキシで長時間アイドルのWebSocket接続を切る設定が無いか確認。 • aiohttp のタイムアウトや再試行設定を緩める/有効化できるか確認。 • 発生時刻をもとにOpenAI側の稼働状況(ステータス)を確認。 上記情報をいただければ、ログから切り分けして具体的な次手(設定変更、再試行ロジック、回避方法)をご案内します。 , with interactive elements
b
{"message": "livekit.plugins.openai.responses.llm.LLM failed, switching to next LLM\nTraceback (most recent call last):\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/plugins/openai/responses/llm.py\", line 105, in generate_response\n await ws.send_str(data)\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/aiohttp/client_ws.py\", line 245, in send_str\n await self._writer.send_frame(\n data.encode(\"utf-8\"), WSMsgType.TEXT, compress=compress\n )\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/aiohttp/_websocket/writer.py\", line 83, in send_frame\n self._write_websocket_frame(message, opcode, 0)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/aiohttp/_websocket/writer.py\", line 151, in _write_websocket_frame\n raise ClientConnectionResetError(\"Cannot write to closing transport\")\naiohttp.client_exceptions.ClientConnectionResetError: Cannot write to closing transport\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/agents/llm/fallback_adapter.py\", line 176, in _try_generate\n async for chunk in stream:\n ...<3 lines>...\n yield chunk\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/agents/llm/llm.py\", line 381, in __anext__\n raise exc # noqa: B904\n ^^^^^^^^^\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/agents/llm/llm.py\", line 194, in _traceable_main_task\n await self._main_task()\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/agents/llm/llm.py\", line 219, in _main_task\n return await self._run()\n ^^^^^^^^^^^^^^^^^\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/plugins/openai/responses/llm.py\", line 386, in _run\n await self._run_impl()\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/plugins/openai/responses/llm.py\", line 418, in _run_impl\n async for raw_event in self._llm._ws.generate_response(payload):\n ...<2 lines>...\n retryable = False\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/plugins/openai/responses/llm.py\", line 107, in generate_response\n raise APIConnectionError(\"failed to send request over WebSocket\") from e\nlivekit.agents._exceptions.APIConnectionError: failed to send request over WebSocket", "level": "WARNING", "name": "livekit.agents", "exc_info": "Traceback (most recent call last):\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/plugins/openai/responses/llm.py\", line 105, in generate_response\n await ws.send_str(data)\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/aiohttp/client_ws.py\", line 245, in send_str\n await self._writer.send_frame(\n data.encode(\"utf-8\"), WSMsgType.TEXT, compress=compress\n )\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/aiohttp/_websocket/writer.py\", line 83, in send_frame\n self._write_websocket_frame(message, opcode, 0)\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/aiohttp/_websocket/writer.py\", line 151, in _write_websocket_frame\n raise ClientConnectionResetError(\"Cannot write to closing transport\")\naiohttp.client_exceptions.ClientConnectionResetError: Cannot write to closing transport\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/agents/llm/fallback_adapter.py\", line 176, in _try_generate\n async for chunk in stream:\n ...<3 lines>...\n yield chunk\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/agents/llm/llm.py\", line 381, in __anext__\n raise exc # noqa: B904\n ^^^^^^^^^\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/agents/llm/llm.py\", line 194, in _traceable_main_task\n await self._main_task()\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/agents/llm/llm.py\", line 219, in _main_task\n return await self._run()\n ^^^^^^^^^^^^^^^^^\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/plugins/openai/responses/llm.py\", line 386, in _run\n await self._run_impl()\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/plugins/openai/responses/llm.py\", line 418, in _run_impl\n async for raw_event in self._llm._ws.generate_response(payload):\n ...<2 lines>...\n retryable = False\n File \"/app/apps/agent/.venv/lib/python3.13/site-packages/livekit/plugins/openai/responses/llm.py\", line 107, in generate_response\n raise APIConnectionError(\"failed to send request over WebSocket\") from e\nlivekit.agents._exceptions.APIConnectionError: failed to send request over WebSocket", "pid": 114, "job_id": "AJ_xUfdhj98Yfn9", "room_id": "RM_3gwjDQFGzxWa", "timestamp": "2026-05-13T072754.347803+00:00"}
t
ログと詳細ありがとうございます。送信します — 対応方針と追加で必要な情報、まず試せる対処を簡潔にまとめます。 確認した問題点(対応対象) •
Cannot write to closing transport
により
ws.send_str
が失敗し、`APIConnectionError: failed to send request over WebSocket` が発生して一次LLMからフォールバックへ切替。 追加で教えてください(マスクはそのままでOK) 1. Agentの稼働環境(Kubernetes / VM / ローカル / その他)とネットワーク構成(プロキシ/ファイアウォール/VPNの有無) 2. 使用中のLiveKit Agents SDKバージョンと
aiohttp
バージョン 3. 発生頻度(断続的か毎回か、特定のリクエストだけか) 4. カスタムのWebSocket/`aiohttp` タイムアウト設定や再試行設定の有無 まず試せる対処 • Agentプロセスを再起動して一時的な接続不良か確認。 • 発生ホストからOpenAI Responsesのエンドポイントへ疎通確認(アウトバウンド接続)。 • プロキシやファイアウォールがアイドル接続を切っていないか確認。アイドル切断がある場合はkeep-alive/ping間隔の調整を検討。 •
aiohttp
のタイムアウトや書き込み設定を緩める(カスタム設定があれば元に戻すか増やす)。 • 発生時刻でOpenAI側の稼働状況(ステータス)を確認。 次のステップ • 上の追加情報をいただければ、ログの該当箇所とバージョン依存の既知問題を照合し、具体的な設定変更案(keep-alive設定、再試行ポリシー、aiohttp設定)や必要であれば回避コード例を提示します。 ご提供いただけますか? , with interactive elements
b
LiveKit Agents で OpenAI Responses LLM を利用している際、WebSocket 送信時に接続が closing transport 状態になり、一次 LLM が失敗して fallback LLM に切り替わる事象が発生しています。 主なエラーは以下です。 - aiohttp.client_exceptions.ClientConnectionResetError: Cannot write to closing transport - livekit.agents._exceptions.APIConnectionError: failed to send request over WebSocket - livekit.plugins.openai.responses.llm.LLM failed, switching to next LLM 稼働環境は Kubernetes / VM / ローカルではなく、Render 上です。 Render の private service として Docker image runtime で動かしており、region は Singapore、plan は starter です。コンテナは Python 3.13 / Debian Bookworm slim ベースです。環境変数は Render dashboard の env group から注入しています。 ネットワーク構成について、アプリケーション側・リポジトリ上では明示的な proxy / firewall / VPN / HTTP_PROXY / HTTPS_PROXY / NO_PROXY 設定は行っていません。Render 側の管理ネットワークや outbound 制限の詳細は未確認です。 使用バージョンは以下です。 - livekit-agents: 1.5.5 - livekit-plugins-openai: 1.5.5 - aiohttp: 3.13.3 発生頻度は断続的です。 確認できている範囲では、2026-05-13 0720〜0728 UTC(日本時間 2026-05-13 1620〜1628)ごろの約8分間に同種のエラーが3回発生しました。2つの LiveKit job / room で発生しており、うち1つでは同じ job 内で再発しています。 各回とも FallbackAdapter により数秒後に recovered ログは出ていますが、その後
Turn ... TTL expired, flushing as incomplete
が出ており、該当ターンは incomplete 扱いになっています。 LLM 設定としては、OpenAI Responses LLM と Azure OpenAI fallback LLM の timeout を 60 秒に設定し、FallbackAdapter の attempt_timeout を 30 秒に設定しています。WebSocket / aiohttp に対する独自の timeout や retry 設定は、アプリケーション側では行っていません。
t
ありがとうございます。詳細な情報とログ、環境(Render / Starter / Singapore / Docker / Python 3.13)を共有いただき助かります。ご報告の現象(`Cannot write to closing transport` → WebSocket送信失敗で一次LLMがフォールバックされ、該当ターンが incomplete になる)に対応する実務的な次手を簡潔にまとめます。 まず実行できる優先対応(推奨順) 1. WebSocketのキープアライブ(ping/heartbeat)を有効化する ◦ LiveKit OpenAI Responses LLMのコンストラクタで
ws_heartbeat
を指定するか、aiohttpで接続時に
heartbeat=30
などを設定してください(30秒程度を推奨)。これによりRender側でアイドル接続が切られるケースを回避できます。 1. Renderのアウトバウンド idle timeout を確認/延長する ◦ Starterプランでは設定項目が限定される場合があります。ダッシュボードでOutbound/Idle Timeout設定があれば延長を検討してください。設定不可であれば次の対処を優先してください。 1. aiohttpのタイムアウトを緩める(クライアント側) ◦
ClientTimeout(total=120)
のように全体タイムアウトを増やしておくと、短時間の接続切断に耐えられます。 1. 短期的なリトライ(送信失敗時)を導入する ◦
ws.send_str
が
ClientConnectionResetError
を投げた場合に小さなバックオフで1〜2回リトライすることで、一時的な切断による失敗を減らせます。 1. ライブラリ/ランタイムの確認とアップデート ◦ livekit-agents / livekit-plugins-openai のマイナー/パッチ更新があれば適用検討。aiohttp も 3.x 系の最新安定版へ更新してください(3.13.3 以降の修正がある場合に有効)。 追加で実施してほしい診断(再発時に収集) • 発生タイムスタンプ(UTC)と該当コンテナのstdout/stderrの直前・直後ログ(ws heartbeat 送受信ログがあれば尚良し)。 • Render の outbound connection / network logs(確認できる場合)。 • エラー発生時にコンテナ外から OpenAI Responses エンドポイントへの疎通結果(`curl`/`nc`)やOpenAIのステータス確認結果。 短い手順例(参考) 1. LLM生成箇所に
ws_heartbeat=30
を追加してデプロイ。 2. コンテナ再起動 → 数分監視。 3. もし再発するなら、`ClientTimeout` を 120–180 秒に増やし、送信リトライを入れてみる。 理由の要約: • エラーは「WebSocket がクローズ中(closing transport)」での書き込み失敗であり、Renderのインフラ側のアイドル切断や一時的なネットワーク切り替わりが原因となることが多いです。keep‑alive とタイムアウト緩和、リトライで多くは緩和できます。 次にやることを教えてください。 • まずは
ws_heartbeat
を追加してデプロイしていただけますか?適用後のログ(再発の有無)をいただければ、必要に応じて具体的な aiohttp 設定例や SDK側の回避パッチ案(コード例)を提示します。, with interactive elements