快速结论:该报错通常出现在 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、显卡等信息,无需据此排查。
解决步骤
- 先定位问题边界:抓取一次包含 Anthropic 调用的 OTEL generation span,导出其全部属性。
- 在 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。 - 若这些属性缺失或命名不同,说明上游 exporter 未按 Langfuse 可识别的格式发送缓存 token,应优先在
claude-agent-sdk的 OTEL 上报侧补齐或修正字段(可优先尝试)。 - 若属性已存在但仍按全价计费,再检查 Langfuse 的模型价格配置是否匹配该模型,以及缓存 token 是否从 input 总量中被正确扣除。
- 如需贡献修复,可参考 Issue 建议,确认是否需为
claude-agent-sdk增加额外的属性提取模式。
验证方法
在 span 中确认缓存 token 属性已按 Langfuse 可识别的字段名上报后,重新跑一段包含缓存命中的会话,对比 Langfuse 计算成本与 Anthropic 实际账单:若缓存读取/创建 token 分别按缓存价计入、成本偏差明显收敛(Issue 中目标是从约 2.5 倍高估回归到接近实际值),即可认为问题已解决。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


