`ChatOpenRouter` drops `cost` and `cost_details` when streaming with `stream_usage` enabled

该问题发生在使用 ChatOpenRouter 流式输出并启用 stream_usage 时,最后一个仅包含 usage 信息的 chunk 会丢失 cost 和 cost_details 字段。优先检查流式输出的 response_metadata 是否为空,并确认你使用的 LangChain 版

快速结论:该问题发生在使用 ChatOpenRouter 流式输出并启用 stream_usage 时,最后一个仅包含 usage 信息的 chunk 会丢失 costcost_details 字段。优先检查流式输出的 response_metadata 是否为空,并确认你使用的 LangChain 版本是否已包含修复。

适用环境:langchain-openrouter 集成包,OpenRouter API。Issue 中通过 mock 客户端复现,未涉及具体操作系统或 Python 版本。

最快修复方案:暂无确认的一步修复方案。该问题已在 GitHub Issue 中确认,并有 contributor 提出了修复方案(在 _stream_astream 中为 usage-only chunk 附加 response_metadata),但尚未合并。可优先尝试升级到包含该修复的最新版本。

注意事项:该问题是代码缺陷,不是配置错误。在官方修复发布前,如果依赖 cost 数据,建议改用非流式调用,或自行解析流式响应中的 usage-only chunk。

问题场景

使用 ChatOpenRouter 调用 OpenRouter 模型(如 openai/gpt-4o-mini)时,以流式方式生成内容并启用 stream_options={"include_usage": True}。非流式调用时,costcost_details 能正常出现在 response_metadata 中;流式调用时,这些字段会丢失。

报错原文

ChatOpenRouter drops `cost` and `cost_details` when streaming with `stream_usage` enabled

# 实际输出
streaming     : False
non-streaming : True

# usage-only chunk 的元数据
usage_metadata    : {'input_tokens': 10, 'output_tokens': 5, 'total_tokens': 15}
response_metadata : {}

原因分析

这是 langchain-openrouter 集成包的代码缺陷。Issue 评论中给出了详细分析:costcost_details 在三条路径中的处理不一致——非流式调用和带 choices 的流式 chunk 会正确复制到 response_metadata,但最后一个仅包含 usage 的 chunk(choices 为空列表)在 _stream_astream 中被单独处理,直接构造 UsageMetadata 对象,该对象只有 token 字段,没有成本字段,导致 costcost_details 被丢弃。

环境排查

  • 确认使用的 langchain-openrouter 包版本是否为最新稳定版(Issue 提交者已确认更新到最新版后问题仍然存在,说明该版本尚未修复)。
  • 如果项目锁定了依赖版本,检查是否早于修复 PR 合并的版本。
  • 可通过 mock 客户端(如 Issue 中的复现代码)在不消耗 API 费用的情况下复现问题,确认是否为同一缺陷。

解决步骤

  1. 在本地运行 Issue 中的复现代码,确认输出为 streaming: Falsenon-streaming: True,验证问题存在。
  2. 如果业务场景可接受,临时改用非流式调用(invoke 而非 stream),以正常获取 cost 数据。
  3. 如果必须使用流式,可自行解析返回的 chunk:检查每个 chunk 的 choices 列表,当列表为空时,直接从原始 chunk 数据中读取 usage.costusage.cost_details
  4. 关注 langchain-openrouter 仓库的 PR 和 Release 更新,在修复版本发布后升级依赖。可优先尝试关注 Issue 中 contributor 提出的修复方案是否已合并。

验证方法

运行 Issue 中的复现代码,确认流式输出中 cost 出现在 response_metadata 中(即输出变为 streaming: True)。对于临时解决方案,验证手动解析的 cost 值与非流式调用返回的值一致。

参考来源

langchain-ai/langchain #39333

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 19944

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注