快速结论:该报错出现在通过 AWS Bedrock 等下游服务调用 ChatAnthropic 时,provider 的 usage.cache_creation 中显式返回 ephemeral_1h_input_tokens: null,导致 _create_usage_metadata 在累加缓存 token 时对 None 执行 +=,从而抛出 TypeError: unsupported operand type(s) for +=: ‘int’ and ‘NoneType’ when cache_creation contains an explicit None value。优先排查 usage.cache_creation 里是否存在值为 None 的字段。
适用环境:LangChain;包为 langchain-anthropic;使用 ChatAnthropic 并经 Bedrock 路由的场景。Issue 未提供已确认的操作系统、Python、CUDA、显卡版本信息。
最快修复方案:暂无确认的一步修复方案。Issue 中提出的修复思路是在求和时把 None 归并为 0(例如 specific_cache_creation_tokens += (cache_creation.get(k) or 0)),并新增回归测试,该方案可优先尝试。
注意事项:上述改法属于 Issue 讨论中提出的方案,未在正文中说明已合并或已验证;修改时需注意保持 cache-total 与 detail 语义不变,并覆盖“键存在但值为 None”的字典 payload 场景。
问题场景
用户通过 Bedrock 使用 ChatAnthropic(langchain-anthropic)。Bedrock 不支持 1 小时扩展 prompt-cache TTL,因此其 usage 的 cache_creation 分解中会显式包含 ephemeral_1h_input_tokens: null,而不是省略该键。此时 _create_usage_metadata 在格式化输出、计算 usage_metadata 时崩溃,错误会经由 LangGraph 代理链路向上传播,导致整个运行失败。
报错原文
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'
File ".../langchain_anthropic/chat_models.py", line 3336, in _create_usage_metadata
specific_cache_creation_tokens += cache_creation.get(k, 0)
File ".../langchain_anthropic/chat_models.py", line 2580, in _format_output
msg.usage_metadata = _create_usage_metadata(data.usage)
原因分析
在 _create_usage_metadata 中,ephemeral 缓存 token 通过 specific_cache_creation_tokens += cache_creation.get(k, 0) 累加。dict.get(k, 0) 只在键不存在时返回默认值 0;当键存在但值为 None 时,返回的是 None,于是 0 += None 触发 TypeError。Issue 认为这是下游 provider(如 AWS Bedrock)显式返回 null 导致的兼容性问题。
环境排查
- 确认使用的集成包为 langchain-anthropic,且调用路径经过 ChatAnthropic。
- 确认是否通过 Bedrock 路由调用,这是 Issue 中实际复现的场景。
- 检查 provider 返回的 usage.cache_creation 中是否包含
ephemeral_1h_input_tokens: null这类显式 None 值。 - Issue 未提供可确认的 Python、CUDA、PyTorch、显卡或节点版本,暂不补充。
解决步骤
- 按 Issue 中的最小复现构造 usage 对象:
cache_creation同时包含ephemeral_5m_input_tokens和值为 None 的ephemeral_1h_input_tokens,确认能稳定触发该 TypeError。 - 检查本地
langchain_anthropic/chat_models.py中_create_usage_metadata的累加逻辑,确认为cache_creation.get(k, 0)形式。 - 可优先尝试在求和时将 None 归并为 0,例如改为
specific_cache_creation_tokens += (cache_creation.get(k) or 0),同时不改变 cache_totals 与 detail 的语义。 - 在
test_chat_models.py的test_usage_metadata_cache_creation_ttl中增加回归用例,覆盖字典 payload 含显式 None 值的情况,验证求和正确且不抛异常。 - 使用 mocked 的 usage 响应离线复跑,避免依赖真实 API 调用。
验证方法
重新执行 Issue 中的最小复现脚本,_create_usage_metadata(FakeUsage()) 应正常返回 usage metadata 而不抛出 TypeError;同时确认新增回归测试通过,且原有 cache token 汇总与明细结果保持不变。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


