stream=True。
代码长什么样
你拿到的不再是单个response 对象,而是一个迭代器。每次迭代得到一个 chunk,有用的文本在 chunk.choices[0].delta.content 里。随着片段到达,把它追加到输出即可。
data: {...} 的形式到达,每行携带各自的片段。流结束的标志是 data: [DONE] 这一行。
切换模型
和普通请求一样,切换模型只需改model 字段——流式代码本身不变。例如 gpt-5、gemini-3.5-flash 或 deepseek-v3:
通过 Anthropic 协议流式输出
如果你走的是原生 Anthropic 协议(Claude Code、Anthropic SDK),同样支持流式输出——通过client.messages.stream(...)。注意这里的地址不带 /v1:
容易踩的坑
最后一个 chunk 的 delta.content 是 None
最后一个 chunk 的 delta.content 是 None
流的最后一个片段通常携带的是元信息(比如
finish_reason)而非文本,因此那里的 delta.content 是 None(在 Node.js 中是 undefined)。在打印或拼接之前一定要先判空,否则拼接时会抛出 TypeError。流式输出时如何获取 token 用量
流式输出时如何获取 token 用量
默认情况下,最终用量统计(这样在流的最末尾会单独到达一个带
usage)不会出现在流里。要拿到它,在请求中加上 stream_options 参数:usage 字段的 chunk。该 chunk 的 choices 列表是空的——解析时要注意这一点。响应一次性全部返回,而不是分段
响应一次性全部返回,而不是分段
如果文本是一整块出现而不是逐字打出,多半是你和 API 之间有一层会缓冲 SSE 的代理或负载均衡。请确认已关闭响应缓冲(例如 nginx 里的
proxy_buffering off;),并确认你的 HTTP 客户端没有自己把流攒起来。用 curl 时,加上 -N(--no-buffer)参数更稳妥。接下来
- 快速开始 — 注册、获取密钥、发出第一个请求
- Claude 模型 — 流式示例里默认用的就是 Claude,看看怎么选型
- Telegram 机器人 — 把流式回复接进一个真实应用
- 错误解析 — 请求失败时该怎么办