一.基本概念
SSE(Server-sent Events) 是一种基于 HTTP 的服务端→客户端单向实时推送协议。浏览器(或客户端)发起一次请求后,服务器保持连接,不断往响应里写事件文本,客户端边收边处理------很适合聊天打字机效果、进度推送、状态更新。
-
规范(官网标准)
WHATWG HTML Living Standard --- Server-sent events
SSE 的正式规范,定义事件流格式与 EventSource 行为。
-
MDN(最常用的官方教程入口)
-
后端用它返回 text/event-stream。
二.解决什么问题
传统 HTTP:请求 → 等完整响应 → 断开。
若要实时感,常见做法:

SSE 的定位:服务器持续往下推事件,客户端基本只听。
三.协议信息
- 响应头:
bash
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
- 响应体是纯文本,按空行分块。每块常见字段:
bash
event: text_delta
data: {"content":"你好","mode":"append"}
event: done
data: {}
- 规则要点:
- event::事件名(可省略,默认 message)
- data::载荷;多行 data: 会拼成一条
- 空行 \n\n:一条事件结束
- 还可有 id:(断线续传)、retry:(重连间隔毫秒)
四.客户端接收
标准浏览器 API 是 EventSource(只能 GET,自动重连)。
很多 AI/Agent 场景用 fetch + ReadableStream。
前端:fetch → response.body.getReader() → 按 \n\n 拆块解析:
javascript
export async function streamAgentMessage(threadId, payload, { signal, onEvent }) {
// ...
const response = await fetch(url, {
method: 'POST',
headers: { Accept: 'text/event-stream', 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
signal,
})
// reader.read() → 按空行分块 → parseBlock → onEvent(event, data)
}
注意:这叫"SSE 格式 的流式 HTTP",不完全等于原生 EventSource,但线上很常见。
五.SSE vs WebSocket(怎么选)

聊天机器人打字机输出:SSE(或 fetch 流)通常够用;若还要频繁从浏览器推二进制/高频双向消息,再上 WebSocket。
一句话:SSE = 用长连接 HTTP 响应体,按 event/data 文本格式,让服务器持续推事件。
六.LangChain Event streaming 与 SSE
二者不是同一层技术,也没有官方绑定关系;常见做法是:用 LangChain Event streaming 产生过程事件,再用 SSE(或 WebSocket)把事件送到浏览器。

bash
LangChain Event streaming = "发生了什么"(业务/运行时事件)
SSE = "怎么把这些事推给网页"(传输通道)
- 容易混淆的点
-
名字都带 "stream/event",但协议不同
LangChain 的 event 是 Python 对象/字典;SSE 是 HTTP 文本行(event: / data:)。
-
LangChain 不会自动开 SSE
stream_events 只是在服务端给你一个可迭代流;要不要挂到 HTTP、怎么命名事件,都是你自己的事。
-
SSE 也不依赖 LangChain
SSE 可以推任何东西(股票价、日志、进度)。只是 AI Agent 场景里,数据源经常是 Event streaming。
-
前端也可以不碰 SSE
例如后端用 WebSocket、或 gRPC stream,照样消费 stream_events。选 SSE,是因为单向推送、HTTP 好接、够用。
结论 :Event streaming 是事件源,SSE 是推送管道;二者通过后端适配层串联。
经典路径:stream_events(v3) → 业务事件 → text/event-stream → Dashboard。