core: AIMessage.content_blocks mutates message.content in the Anthropic, Bedrock and Google translators

这个 bug 发生在 LangChain 的 AIMessage.content_blocks 属性被读取时,Anthropic、Bedrock、Google GenAI 和 Vertex AI 的翻译器会直接修改原始消息内容,导致数据静默丢失或增加。优先检查你使用的 provider 是否属于这四

快速结论:这个 bug 发生在 LangChain 的 AIMessage.content_blocks 属性被读取时,Anthropic、Bedrock、Google GenAI 和 Vertex AI 的翻译器会直接修改原始消息内容,导致数据静默丢失或增加。优先检查你使用的 provider 是否属于这四类,以及消息内容中是否包含 index 键或 annotations 字段。

适用环境:LangChain langchain-core 包;涉及 provider 为 Anthropic、Bedrock(复用 Anthropic 翻译器)、Google GenAI、Vertex AI(复用 Google GenAI 翻译器)。issue 中未提供 Python 版本、操作系统或显卡等环境信息。

最快修复方案:暂无确认的一步修复方案。该 issue 对应的修复 PR #39997 已被自动关闭,需要等待官方合入修复;在修复发布前,建议避免在读取 content_blocks 后继续依赖原始 message.content 的完整性。

注意事项:该问题不会抛出异常,属于静默数据损坏;一旦消息被持久化(checkpointer、对话存储、dumps()),损坏的数据会永久丢失,无法恢复。

问题场景

在使用 LangChain 处理 Anthropic、Bedrock、Google GenAI 或 Vertex AI 模型的输出时,读取 AIMessage.content_blocks 属性会导致原始 message.content 被修改。具体表现为:

  • Anthropic/Bedrock:消息内容中自定义块(custom block)的 index 键被删除。
  • Google GenAI/Vertex AI:消息内容中被添加了 annotations 字段(来自 grounding metadata)。

此问题在流式输出、非流式输出以及手动构造 AIMessage 时均可触发,尤其是当消息内容包含翻译器无法识别的块类型时。

报错原文

core: AIMessage.content_blocks mutates message.content in the Anthropic, Bedrock and Google translators

No exception is raised. The message is silently modified by reading a property.

# content changed: True
# content now:     [{'type': 'custom', 'payload': 'value'}]      <-- `index` gone
# reads differ:    True

# content changed: True
# content now:     [{'type': 'text', 'text': 'hello', 'annotations': [...]}]

原因分析

AIMessage.content_blocks 被设计为派生视图属性,负责将 provider 特有的内容格式转换为标准块。但 Anthropic 和 Google GenAI 的翻译器在构建输出时,直接使用了调用方传入的字典引用,并对这些字典执行了写入操作:

  • Anthropic 翻译器_convert_to_v1_from_anthropic):在将未知块类型包装为 non_standard 块时,使用 pop 从原始块中提取 index,导致该键从 message.content 中被删除。Bedrock 复用此函数,因此同样受影响。
  • Google GenAI 翻译器:将 grounding metadata 中的 annotations 字段直接写入调用方的文本块字典中。

issue 提交者审计了全部九个翻译器,确认 anthropicbedrockgoogle_genaigoogle_vertexaibedrock_converse 存在此问题;openaigroqlangchain_v0 不受影响。

环境排查

  • 确认 langchain-core 是否为最新稳定版本(issue 提及 bug 在最新版本中仍存在)。
  • 确认使用的 provider 类型:model_provideranthropicbedrockgoogle_genaigoogle_vertexai 时均可能受影响。
  • 检查消息内容是否包含自定义块类型(如 {"type": "custom", ...})或 grounding metadata。
  • 检查是否有持久化层(checkpointer、数据库、dumps())存储了 AIMessage,一旦内容被修改,重新加载后会永久丢失数据。

解决步骤

  1. 在读取 content_blocks 之前,使用 deepcopy 备份 message.content,确保原始数据不被修改。
  2. 如果要长时间保存消息,请先备份完整内容(包括 index 键、annotations 字段),再调用 content_blocks
  3. 关注 issue #39997 和 #40008 的修复进展;在官方修复发布前,不要在生产环境中直接依赖读取 content_blocks 之后的 message.content 数据。
  4. 如果问题严重影响使用,可考虑手动构造标准块或绕过 content_blocks 属性,直接处理原始 message.content

验证方法

使用 issue 中的复现代码,在修复前后分别运行:

  • 读取 content_blocks 前后对比 message.content 是否发生变化。
  • 连续读取两次 content_blocks,确认两次结果是否一致(第一次读取后数据已损坏,第二次结果会不同)。
  • 检查持久化数据(如 checkpointer 存储的消息)在重新加载后是否丢失了 index 键或增加了 annotations 字段。

参考来源

langchain-ai/langchain #40001

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21419

发表回复

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