流式输出 SSE
开启流式响应
Section titled “开启流式响应”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 osfrom 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)不同协议的流不能混用
Section titled “不同协议的流不能混用”Responses 和 Messages 使用各自的事件类型,不能只查 delta.content。请调用对应 SDK 或按对应协议解析。工具调用的函数参数同样可能分片返回,需要合并后再解析 JSON。
首字时间是开始输出前的等待,总耗时包含完整生成。推理模型可能在输出前等待较久,客户端应设置合理的读取超时。浏览器关闭连接并不保证上游立即停止计费,不要因为几秒没字就连续重试。
如果命令行能逐字输出而网站等结束后才显示,检查应用服务器或代理是否缓冲 SSE。若连接已经建立后才出现错误,还应检查流内错误事件,而不仅看最初的 HTTP 200。
