Cloudflare Tunnelを使ってストリーミングレスポンスを返すときのコツ
2025-02-14
#はじめに
今回は、Cloudflare Tunnelを使ってストリーミングレスポンスを返すときのコツについて紹介します。
生成AIをつかっていると、AIからのレスポンスをストリーミングにして、リアルタイムにメッセージを返すことでユーザー体験を向上させていると思います。
しかし、Cloudflare Tunnelを使っていると、ストリーミングされないことがありましたので、その対処法について紹介します。
#現象
メッセージをストリームで返してローカル環境で開発してきちんと動いていても、Cloudflare Tunnel経由だと、ストリーミングされない現象がありました。
次のような流れで、リクエスト・レスポンスが行われているとします。
- Cloudflare Tunnel
- cloudflared
- traefik
- Node.js Chat API Server(Vercel AI-SDK使用)
- Ollama
#原因
調査をしていて、cloudflare経由だとNGで、traefik経由だとOKであることがわかりました。
以前も似たようなことあったなぁと思いつつ、下記のissueを見つけました。
原因は、Cloudflare Tunnelで使っているcloudflaredが、バッファリングしていて、ストリーミングされないようです。
この手のネットワーク上の問題である場合、デバッグが困難なので少し解決するのに時間がかかります。
#解決策
HTTPレスポンスヘッダーで下記のように設定すると解決しました。
Content-Type: text/event-stream
Github Issueにもコメントがあります。
#まとめ
今回は、Cloudflare Tunnelを使ってストリーミングレスポンスを返すときのコツについて紹介しました。
Cloudflare Tunnelを使ってストリーミングレスポンスを返すときは、HTTPレスポンスヘッダーにContent-Type: text/event-stream
を設定しないと、ストリーミングとして処理されなかったので、注意が必要です。
