LLMのAPIではストリーミング的にサーバからデータを断続的に受け取って、ちょっとずつ画面に出すということがよくあり、そのために Server Sent Events (SSE) というものがよく使われているようだ。

自作のAIコーディングエージェントでは、 Anthropic のLLMを呼び出すときに公式のSDKが見当たらなかったので自分で net/http を使って書いたときに、 SSE の仕様についても調べた。適当なクライアントライブラリを使ってもいいかなと思ったのだが、けっきょく仕様を調べて自分で簡単なパーサを書いたのだった。

SSE の仕様というか中身についてはそのとき MDN の記述 https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#event_stream_format を参考にしたのだけど、この仕様のなんともいえない古臭さに驚いたのであった。テキストベースで行指向なフォーマット。こんなのが最新のLLMの根幹技術なの?って感じ。その分実装は割と簡単なのだけど。

それで改めて調べてみて知ったんだけど、 SSE ってめちゃくちゃ古い技術なのであった。初登場は 2004 年、仕様著者は hixie こと Ian Hickson。多分 Google 以前の作ですね。その割に全然存在を知らなかったし、全く使ったこともなかった。ブラウザAPIとかもあり、ブラウザ内で使うなら割と便利なのかもしれない。

HTTP で非同期にサーバからデータを送るというと例えば websocket があるのだけども、 websocket というのは http/2 ではいまだに使えないとか制限が多くて難しい。一方で特殊な content-type で断続的にテキストデータが返ってくるだけでそれをクライアント側でいい感じに解釈してもらうという SSE の方が取り回しが良く、現代でもよく使われる、といったあたりなのではないかと思う。また LLM の API セマンティクス的にも双方向非同期通信は必要なくてサーバから断続的にデータが送られればそれでいいから SSE が適している、といった話もある。

しかし、そういう事情は考えればわかるとしても、ウェブ仕様の発展を横目に見て 2004 年からある SSE が採用されているってのはなんだか味わい深い話だと思っちゃうんだよな。