DeepSeek Chat Completions 请求设为 stream: true 后,响应会以 SSE 连续发送片段。读者可以边收到边显示文本,但应等到结束事件才把整条回答标为完成;网络中断时已经显示的文字可能只是残段。
先弄清流式响应的结束条件
DeepSeek 官方 Chat Completions 参考说明:流式数据以 data: 事件送达,最终由 data: [DONE] 结束。最后一个内容块带非空 finish_reason 和本次 usage;不能因为某个片段暂时没有文字就判定结束。

用 Python 逐块显示内容
安装 openai 包并在本机设置 DEEPSEEK_API_KEY 后,保存为 deepseek_stream.py。本示例只输出最终回答内容,不把可能出现的思考字段当成最终答案。
import os
from openai import OpenAI
key = os.environ.get("DEEPSEEK_API_KEY")
if not key:
raise RuntimeError("请先设置 DEEPSEEK_API_KEY")
client = OpenAI(api_key=key, base_url="https://api.deepseek.com")
stream = client.chat.completions.create(
model="deepseek-flash",
messages=[{"role": "user", "content": "用三句话解释什么是 API。"}],
stream=True,
extra_body={"thinking": {"type": "disabled"}},
)
parts = []
finished = False
usage = None
for chunk in stream:
if chunk.usage is not None:
usage = chunk.usage
for choice in chunk.choices:
content = choice.delta.content or ""
if content:
parts.append(content)
print(content, end="", flush=True)
if choice.finish_reason is not None:
finished = True
print()
print("completed:", finished, "characters:", len("".join(parts)))
print("usage:", usage)
核对结果时看三项:屏幕上是否逐段出现内容、completed 是否为 True、usage 是否出现在末尾。SDK 会处理 SSE 的底层 [DONE] 标记,所以这段代码通过迭代结束和 finish_reason 判断完成;若你直接解析 HTTP SSE,就还要识别原始 data: [DONE]。
什么时候不能把结果当成完整回答
如果连接中途断开、迭代抛异常,或循环结束却没有非空 finish_reason,应把已显示内容标为不完整。finish_reason=length 表示达到输出或上下文限制,句子也可能被截断;需要缩短输入或调整允许的输出上限后重新请求。重新发请求可能再次计费,先检查是否真的需要。
本文按官方接口文档整理代码,未用真实密钥在你的环境中执行。不同 SDK 版本对末尾空块的封装可能有差异,以当前 SDK 对象和官方 API 原始响应为准。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/29796.html