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)。