流式响应
当用户需要尽快看到首段内容时,把文本对话切换为流式返回,并在客户端按 SSE 事件持续拼接结果。
流式与同步文本对话使用同一个 /v1/chat/completions 接口。核心差别是请求体中的 stream: true,以及客户端从“一次读取 JSON”改为“持续消费事件”。
先判断是否需要流式
流式不会减少模型实际生成的内容。它改善的是结果到达和展示方式,同时也增加了客户端状态管理。
发起流式请求
先配置固定网关与访问凭证:
export BASE_API_URI="https://api.ggpu.ai"
export GGPU_ACCESS_CREDENTIAL_SECRET="<access-credential-secret>"请求时增加 stream: true,并用 curl -N 关闭命令行输出缓冲:
curl -N -X POST "${BASE_API_URI}/v1/chat/completions" \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer ${GGPU_ACCESS_CREDENTIAL_SECRET}" \
-d '{
"model": "qwen-plus",
"messages": [
{
"role": "user",
"content": "请分三点介绍GGPU API。"
}
],
"stream": true
}'流式响应使用 SSE 格式。客户端需要按协议读取 data: 内容,而不是把每个网络数据块直接当作一条完整消息。
客户端处理顺序
建立连接
发送请求后先检查 HTTP 状态。鉴权、额度或参数错误可能在流开始前直接返回,此时应按普通错误响应处理。
解析增量事件
持续读取 SSE 事件,解析每条 data: 数据,再从事件载荷中提取当前增量内容。网络分片不等于业务事件,解析器需要保留尚未完整的数据。
更新业务状态
将增量内容追加到当前回答;同时更新“生成中”状态。界面刷新可以适当合并,避免每个极小片段都触发一次重渲染。
识别正常结束
收到服务端结束信号或连接正常关闭后,停止读取并把当前结果标记为完成。若响应提供结束原因或用量信息,应一并保存。
处理中断
连接异常断开时,把已接收内容与“未完整完成”状态一起保留,并给用户明确的重试入口。
用状态而不是字符串驱动界面
已经向用户展示部分内容后,不要无条件自动重放整个请求,否则可能产生重复回答和额外用量。是否重试应由业务根据幂等性和已展示状态决定。
上线前检查
- 客户端真正支持 SSE 增量解析,而不只是一次性读取响应体
- 连接与读取超时分别符合业务时长
- 页面离开或用户取消时会主动结束读取
- 异常断开后保留已接收内容,并显示明确状态
- 对
429和临时5xx的重试有次数上限与退避 - 服务端日志不记录完整 API Key 或敏感输入