SSE(Server-Sent Events) 协议

别名: 服务器推送事件

基于 HTTP 的**单向**服务器→客户端推送协议:服务器把 `content-type` 设为 `text/event-stream`,一条接一条推送事件,连接保持打开直到主动关闭。浏览器原生 `EventSource` 只支持 GET、无法带自定义头,所以 LLM 流式接口必须手写客户端。

它是什么

SSE(Server-Sent Events,服务器推送事件)是 W3C/HTML 标准里定义的基于 HTTP 的单向推送机制。与 WebSocket 的「全双工」不同,SSE 只允许服务器向客户端推数据:服务器把响应的 content-type 设为 text/event-stream,然后通过**分块传输编码(chunked transfer)**在同一个响应里持续写出事件,连接保持打开直到服务器主动关闭或客户端断开。

事件帧格式

每个事件(frame)由若干 键: 值 行组成,用**空行(\n\n)**分隔两个事件:

  • data: —— 负载,可以多行,多行会被拼接(中间换行);
  • event: —— 事件类型(默认 message);
  • id: —— 事件序号,配合浏览器断线自动重连的 Last-Event-ID 机制;
  • : —— 注释行,客户端忽略(常用于心跳保活)。

为什么 LLM 场景要手写

浏览器原生 EventSource 只能发 GET 且无法自定义请求头,而 LLM 流式接口是 POST + Authorization: Bearer <key>,所以必须用 fetch 拉一个 POST 流、再手写解析器——这正是第 03 章做的事。OpenAI 兼容的流式接口把所有信息都塞在 data: 行里,负载本身又是一段 JSON(choices[0].delta)。

小结

SSE 是「把总延迟转化为渐进可见进度」的协议基础:它简单(纯 HTTP、无新协议)、可断线重连、天然穿透代理与 CDN,是 Agent 工具调用中间态、审批交互等事件流场景的首选。唯一注意点是连接保持打开,客户端要处理好超时与主动中止(AbortController)。

相关词条

出现在这些章节