TypeError: unsupported operand type(s) for +=: ‘int’ and ‘NoneType’ when cache_creation contains an explicit None value

该报错出现在通过 AWS Bedrock 等下游服务调用 ChatAnthropic 时,provider 的 usage.cache_creation 中显式返回 ephemeral_1h_input_tokens: null ,导致 _create_usage_metadata 在累加缓存 to

快速结论:该报错出现在通过 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、显卡或节点版本,暂不补充。

解决步骤

  1. 按 Issue 中的最小复现构造 usage 对象:cache_creation 同时包含 ephemeral_5m_input_tokens 和值为 None 的 ephemeral_1h_input_tokens,确认能稳定触发该 TypeError。
  2. 检查本地 langchain_anthropic/chat_models.py 中 _create_usage_metadata 的累加逻辑,确认为 cache_creation.get(k, 0) 形式。
  3. 可优先尝试在求和时将 None 归并为 0,例如改为 specific_cache_creation_tokens += (cache_creation.get(k) or 0),同时不改变 cache_totals 与 detail 的语义。
  4. 在 test_chat_models.py 的 test_usage_metadata_cache_creation_ttl 中增加回归用例,覆盖字典 payload 含显式 None 值的情况,验证求和正确且不抛异常。
  5. 使用 mocked 的 usage 响应离线复跑,避免依赖真实 API 调用。

验证方法

重新执行 Issue 中的最小复现脚本,_create_usage_metadata(FakeUsage()) 应正常返回 usage metadata 而不抛出 TypeError;同时确认新增回归测试通过,且原有 cache token 汇总与明细结果保持不变。

参考来源

langchain-ai/langchain #41526

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 30946

发表回复

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