Vercel AI SDK Stream protocal详解
本文最后更新于 2025年10月7日 晚上
AI-SDK Stream Protocol
AI SDK UI 流式协议(Stream Protocol)摘要
参考文档:AI SDK UI - Stream Protocols
本摘要面向在自定义后端(如 FastAPI / Python)与前端(@ai-sdk/react
)之间,通过 SSE 协议实现与 AI SDK UI 兼容的流式通讯。
核心概念
- 两类协议:
- Text Stream:仅流式输出纯文本。适用于简单补全与聊天文本,不含工具调用/结构化数据。
- Data Stream(UI Message Stream):在 SSE 基础上定义了标准化事件类型(start/text/reasoning/data/tool/finish 等),可承载更丰富的结构化数据、工具调用、推理过程与多 step。
- 首选协议:
- 前端
useChat
/useCompletion
默认使用 Data Stream。 - 若后端自定义实现 Data Stream,必须设置响应头:
x-vercel-ai-ui-message-stream: v1
。
- 前端
HTTP 与 SSE 要点
- 响应类型:
Content-Type: text/event-stream
- 推荐头:
Cache-Control: no-cache
Connection: keep-alive
x-vercel-ai-ui-message-stream: v1
(Data Stream 必需)
- 传输格式:标准 SSE 行,使用
data: <JSON>
加空行分隔;流末尾必须发送data: [DONE]
。
事件类型(Data Stream 使用)
消息生命周期:
start
:开始一条新的消息1
data: {"type":"start","messageId":"..."}
finish
:当前消息完成1
data: {"type":"finish"}
- 终止标记:
1
data: [DONE]
Step(后端一次 LLM 调用粒度):
start-step
/finish-step
1
2data: {"type":"start-step"}
data: {"type":"finish-step"}
文本分段(增量拼接):
text-start
/text-delta
/text-end
1
2
3data: {"type":"text-start","id":"msg_..."}
data: {"type":"text-delta","id":"msg_...","delta":"Hello"}
data: {"type":"text-end","id":"msg_..."}
推理分段(类似文本分段):
reasoning-start
/reasoning-delta
/reasoning-end
引用与文件:
source-url
、source-document
、file
工具调用(可选):
tool-input-start
/tool-input-delta
/tool-input-available
tool-output-available
自定义数据:
data-*
命名空间的任意结构化数据1
data: {"type":"data-weather","data":{"location":"SF","temperature":100}}
错误:
error
1
data: {"type":"error","errorText":"error message"}
常见注意事项
- 始终以
[DONE]
结束流;否则前端无法正确终止流程。 - 为每一段文本匹配
text-start
/text-delta
/text-end
,避免粘连或丢失。 - 多次 LLM 子调用时配对
start-step
/finish-step
,便于前端区分阶段和 Stitching。 - 错误时仍应发送
error
事件,并以finish
+[DONE]
正常完结流。
完整示例:覆盖全部关键事件
下面给出一个后端(FastAPI/Python)示例,演示如何在一次请求中按顺序输出常见与可选事件:
1 |
|
前端(@ai-sdk/react
)依然可以用默认 useChat
消费上述流;如果需要对 reasoning-*
、tool-*
、data-*
、source-*
做更细 UI,可在客户端中按事件类型进行路由与渲染。
Vercel AI SDK Stream protocal详解
https://www.aye10032.com/2025/10/07/2025-10-07-ai-sdk/