VanaAPI

← 文章

把一段回答改成流式输出之后

花钱这件事ZH2026-10-27

第一次接入模型 API 时,常见的体验是:发出问题,等待几秒,然后收到整段回答。开启流式输出后,文字会陆续出现,用户可以边看边等。界面显得更及时,但这不代表模型少做了工作,也不代表账单自动变小。

理解流式输出,可以先把两件事分开:内容怎样送到你手里,以及模型实际处理了多少内容。前者影响等待体验,后者才是理解 token 费用的起点。

§ 变化的是接收方式

普通请求通常等回答生成完成后,再把结果一次返回。流式请求则允许客户端持续接收增量事件,把新内容追加到界面上。在支持的 OpenAI 兼容请求中,通常可以通过设置 stream 为 true 开启;其他协议的请求方式和事件结构可能不同。

这些事件并不一定是一句话,也不一定恰好对应一个 token。有的携带文字片段,有的携带工具调用参数、结束状态或其他信息。因此,收到多少个数据片段,不能直接用来计算用了多少 token。

Vana API 提供统一的服务入口,兼容 OpenAI 接口,也支持 Anthropic Messages 和 Gemini 原生协议。接入时应按照所选协议解析流,而不是假设所有响应都采用同一种事件格式。

§ 更早看到文字,不等于更早完成

流式输出主要改善的是“多久能开始看到回答”。对于较长的解释,用户不必等到最后一个字生成后才开始阅读。这种变化很实用,但它不保证请求的总耗时缩短。

可以分别记录两个时间:从发出请求到收到首段有效内容的时间,以及从发出请求到生成结束的时间。排队、网络、输入长度和模型处理过程都可能影响它们。仅凭文字开始滚动得早,无法判断整次任务更快。

§ 计费仍然看实际 token

Vana API 按实际 token 用量计费,没有月费。流式输出是一种交付方式,不是折扣开关。如果模型、输入、实际输出和其他计费条件相同,仅仅改变是否流式返回,不应被理解为减少了用量。

例如,一次请求使用了 1000 个输入 token,并生成了 500 个输出 token。无论这 500 个输出 token 是逐段送达,还是最后一起返回,都不能仅因显示方式不同而算成更少的输出。实际金额还要分别按照适用的输入、输出单价及其他计费规则计算,不能把两类 token 简单套用同一个价格。

比较费用时,也要尽量保持条件一致。两次请求即使问题相同,回答长度仍可能不同;如果同时换了模型或调整了上下文,就更难把账单变化归因于流式设置。

§ 停止显示,不一定停止生成

流式界面通常会放一个“停止”按钮。这里容易产生误解:浏览器不再显示文字,不等于上游模型已经停止工作。关闭页面、断开网络,或者只停止读取响应,都不能自动视为取消成功。

实际能否中止生成,取决于客户端、转发链路和上游服务是否正确传递并处理取消。即使成功取消,停止之前已经处理或生成的内容,也可能产生费用。不要只数屏幕上留下的文字,就把它当作完整的计费用量。

如果希望通过提前停止控制支出,应确认取消行为,并结合用量记录检查结果。对于只需要短回答的任务,明确要求简短、设置合适的输出上限,通常比单纯开启流式更直接。

§ 把中断和重试一起考虑

流式请求中途断开时,客户端可能已经收到半段回答,但尚未收到结束事件或用量信息。这时不能因为缺少统计,就认定请求没有消耗 token。某些接口或选项会在流末尾提供用量,具体是否支持、怎样获取,需要按所用协议确认。

  • 分别记录请求是否正常结束,以及是否拿到完整用量。
  • 记录模型、请求标识和重试次数,便于排查异常。
  • 把本地估算用于提醒,把可核对的用量与账单记录用于对账。
  • 重试前考虑重复生成的成本,不要假设上一条失败请求一定免费。

尤其要注意,重试通常意味着发起一次新请求,并不等于接着上一条响应继续传输。如果应用在断线后自动重试,用户可能只看到最终成功的一次,后台却已经发生了多次调用。

§ 先为体验开启,再单独管理预算

对于聊天、长文解释和需要持续反馈的界面,流式输出值得尝试。对于必须拿到完整结果才能继续的后台任务,它的价值可能没有那么明显。选择依据应是应用怎样使用结果,而不是期待它天然省钱。

如果准备动手,可以创建一个 Vana API 账户,用同一个短任务分别测试普通返回和流式返回,记录首段内容时间、总耗时、实际用量与异常情况。先确认接收方式适合自己的程序,再通过控制上下文、输出长度和重试次数管理费用,会更容易看清每一项变化来自哪里。