流式输出
边写边收到回答,以及为什么长调用应该始终使用流式输出。
加上 "stream": true,回答就会以服务器发送事件的形式到达,每次几个词。每种格式都按它自己的方式流式输出,和它的官方 API 完全一致,所以 SDK 照常读取即可。
为什么要用流式输出
- 时间上限更长。 流式调用最多可以运行 30 分钟。非流式调用在 13 分钟时停止。
- 连接更稳定。 有些网络会断开长时间没有数据的连接。流式输出能让连接保持活跃。
- 感觉更快。 在快速模型上,用户远不到一秒就能看到最初的几个词。
Claude Code、Codex、OpenClaw 和 Hermes 默认使用流式输出。
流式调用的费用
在 Chat Completions 上,加上 stream_options 就能收到最后一个带有 usage 的数据块,其中包括这次调用的费用:
{
"model": "google/gemini-3.8-flash",
"messages": [{ "role": "user", "content": "Hello" }],
"max_tokens": 256,
"stream": true,
"stream_options": { "include_usage": true }
}data: [DONE] 之前的最后一个事件:
{
"choices": [],
"usage": { "prompt_tokens": 9, "completion_tokens": 12, "cost": 0.000062 }
}在 Responses 上,response.completed 事件带有 usage.cost。Messages 的流带有 Token 数,但不带费用;扣费会在一分钟内出现在你的调用记录页面上。
流中断时
- 已经收到部分内容后出错,会以该格式自己的错误事件发送,所以 SDK 会抛出错误,而不是一直挂起。这次调用按已经写出的内容扣费。
- 如果你断开连接, 模型会停止,你需要为它在此之前写出的内容付费。我们从不把断开连接按零计费,因为有些服务商会对已经完成的工作收费。
- 到达时间上限时, 流会在被切断前 5 秒以一个规范的错误事件结束。
在调试台中试一试:“原始数据”标签页会显示每个事件及其时间。