跳转到内容

流式输出 SSE

Chat Completions 中设置 stream: true。命令行使用 -N 避免本地缓冲:

终端窗口
curl -N https://wudiapi.com/v1/chat/completions \
-H "Authorization: Bearer $WUDI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-v4.1-flash","messages":[{"role":"user","content":"分三点解释缓存。"}],"stream":true}'

SSE 以空行分隔事件。Chat Completions 的文本增量通常在 choices[0].delta.content,结束时可能收到 data: [DONE]。不要将每个网络数据包当作一个完整 JSON:一个事件可能被拆成多个包,也可能多个事件合在同一包里。

使用 SDK 可以避免手写解析:

import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["WUDI_API_KEY"], base_url="https://wudiapi.com/v1")
stream = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{"role":"user","content":"解释缓存。"}], stream=True,
)
for chunk in stream:
if chunk.choices:
print(chunk.choices[0].delta.content or "", end="", flush=True)

Responses 和 Messages 使用各自的事件类型,不能只查 delta.content。请调用对应 SDK 或按对应协议解析。工具调用的函数参数同样可能分片返回,需要合并后再解析 JSON。

首字时间是开始输出前的等待,总耗时包含完整生成。推理模型可能在输出前等待较久,客户端应设置合理的读取超时。浏览器关闭连接并不保证上游立即停止计费,不要因为几秒没字就连续重试。

如果命令行能逐字输出而网站等结束后才显示,检查应用服务器或代理是否缓冲 SSE。若连接已经建立后才出现错误,还应检查流内错误事件,而不仅看最初的 HTTP 200。