bug: Support `cache_read_input_tokens` / `cache_creation_input_tokens` in OTEL generation spans for accurate Anthropic cost calculation

该报错通常出现在 Langfuse 通过 OTEL 接收 Anthropic(如 claude-sonnet-4-5-20250929 )的 generation span 后,把全部 input token 按完整输入价计费,导致成本被高估约 2.5 倍。优先确认 span 里是否真的带上了 ca

快速结论:该报错通常出现在 Langfuse 通过 OTEL 接收 Anthropic(如 claude-sonnet-4-5-20250929)的 generation span 后,把全部 input token 按完整输入价计费,导致成本被高估约 2.5 倍。优先确认 span 里是否真的带上了 cache_read_input_tokens / cache_creation_input_tokens 等缓存 token 属性。

适用环境:Langfuse 自托管 v3.150.0 OSS;SDK/集成:claude-agent-sdk == 0.1.48。Issue 未提供操作系统、Python、CUDA、显卡信息。

最快修复方案:暂无确认的一步修复方案。Issue 结论是 Langfuse 侧已支持缓存计价,问题更可能出在 claude-agent-sdk 的 OTEL exporter 没有发送缓存 token 属性;可优先尝试抓取并核对实际 span 属性,确认缺失后再在上游/集成侧补齐上报。

注意事项:Langfuse 的成本计算依赖 span 中携带规范的缓存 token 属性;若属性缺失,仅靠 Langfuse 配置或版本调整无法让成本自动正确。Issue 中提到的属性名需与实际上报的 span 对照确认,不要臆测字段。

问题场景

用户在自托管 Langfuse(v3.150.0 OSS)中接入 claude-agent-sdk == 0.1.48,通过 OTEL generation span 上报 Anthropic 模型调用(claude-sonnet-4-5-20250929)的用量。在一次 46 轮会话中,Langfuse 计算成本为 $3.71,而 Anthropic 实际账单为 $1.47,偏差约 2.5 倍,怀疑缓存读取/写入 token 未被按缓存价格计费。

报错原文

bug: Support `cache_read_input_tokens` / `cache_creation_input_tokens` in OTEL generation spans for accurate Anthropic cost calculation

原因分析

最可能的原因不是 Langfuse 的成本计算逻辑缺失,而是上游 OTEL span 没有携带缓存 token 明细。Issue 讨论指出 Langfuse 已内置 Anthropic 缓存价格(cache_read_input_tokens 约 $0.30/MTok、cache_creation_input_tokens 约 $3.75/MTok、常规 input 约 $3.00/MTok),并按 token 类型分别计价,且有防止重复计数的处理(从 input 总量中减去缓存 token)。

因此若 span 中缺少 gen_ai.usage.cache_read_tokens / gen_ai.usage.details.cache_read_input_tokens、gen_ai.usage.cache_write_tokens / gen_ai.usage.details.cache_creation_input_tokens(或 Vercel AI SDK 的 ai.response.providerMetadata)等属性,缓存部分就会退化为按完整输入价计费,造成成本高估。可能原因还包括 claude-agent-sdk 的属性命名不在 Langfuse 已支持的提取模式内。

环境排查

  • 确认 Langfuse 版本是否为自托管 v3.150.0 OSS。
  • 确认 claude-agent-sdk 版本为 0.1.48。
  • 确认模型标识为 claude-sonnet-4-5-20250929,且 Langfuse 模型价格配置可识别该模型。
  • 抓取实际上报的 OTEL generation span 属性,检查是否存在缓存 token 字段及其命名。
  • Issue 未提供 Python、CUDA、PyTorch、显卡等信息,无需据此排查。

解决步骤

  1. 先定位问题边界:抓取一次包含 Anthropic 调用的 OTEL generation span,导出其全部属性。
  2. 在 span 中查找缓存 token 属性,重点核对 gen_ai.usage.cache_read_tokens、gen_ai.usage.details.cache_read_input_tokens、gen_ai.usage.cache_write_tokens、gen_ai.usage.details.cache_creation_input_tokens,以及 ai.response.providerMetadata。
  3. 若这些属性缺失或命名不同,说明上游 exporter 未按 Langfuse 可识别的格式发送缓存 token,应优先在 claude-agent-sdk 的 OTEL 上报侧补齐或修正字段(可优先尝试)。
  4. 若属性已存在但仍按全价计费,再检查 Langfuse 的模型价格配置是否匹配该模型,以及缓存 token 是否从 input 总量中被正确扣除。
  5. 如需贡献修复,可参考 Issue 建议,确认是否需为 claude-agent-sdk 增加额外的属性提取模式。

验证方法

在 span 中确认缓存 token 属性已按 Langfuse 可识别的字段名上报后,重新跑一段包含缓存命中的会话,对比 Langfuse 计算成本与 Anthropic 实际账单:若缓存读取/创建 token 分别按缓存价计入、成本偏差明显收敛(Issue 中目标是从约 2.5 倍高估回归到接近实际值),即可认为问题已解决。

参考来源

langfuse/langfuse #12635

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 31031

发表回复

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