ChatOpenAI (Responses API): create_text_block()’s lc_ id on a synthetic AIMessage causes 400 “Expected an ID that begins with ‘msg'”

该报错发生在 LangChain 使用 ChatOpenAI 的 Responses API( use_responses_api=True )时,如果消息中包含通过 create_text_block() 等工厂方法生成的合成内容块(其 ID 以 lc_ 开头),会被原样转发给 OpenAI 接口

快速结论:该报错发生在 LangChain 使用 ChatOpenAI 的 Responses API(use_responses_api=True)时,如果消息中包含通过 create_text_block() 等工厂方法生成的合成内容块(其 ID 以 lc_ 开头),会被原样转发给 OpenAI 接口,从而触发 400 错误。优先排查消息中是否存在这类合成 ID,并升级到包含修复的 langchain-openai 版本。

适用环境:Issue 中已确认涉及 langchain-openai 包,使用 ChatOpenAI 并启用 Responses API(use_responses_api=True),复现环境为 Python 3.13,OpenAI Python SDK 抛出的 openai.BadRequestError

最快修复方案:暂无确认的一步修复方案。讨论中提出的修复方式是修改 _construct_responses_api_input,在转发消息时仅保留以 msg_ 开头的 ID,其余 ID 一律剥离;但该修复尚未被确认为已合并版本,建议优先检查并升级 langchain-openai 到最新版本,或等待包含该修复的发布版本。

注意事项:该修复方案来自 Issue 讨论,并非官方已验证的最终结论。若你完全无法升级依赖,可优先尝试在构造 AIMessage 时不使用 create_text_block() 生成合成内容块,或手动移除其中的 lc_ 前缀 ID,但需注意这可能影响消息在 Responses API 中的存储和追踪行为。

问题场景

用户在使用 LangChain 的 ChatOpenAI 模型,并启用了 OpenAI Responses API(use_responses_api=True)。在构造对话消息时,使用 create_text_block()SystemMessageHumanMessageAIMessage 创建内容块。当调用 llm.invoke(messages) 发送包含这种合成 AIMessage 的对话时,OpenAI 返回 400 错误。

报错原文

ChatOpenAI (Responses API): create_text_block()'s lc_ id on a synthetic AIMessage causes 400 "Expected an ID that begins with 'msg'"

openai.BadRequestError: ...

原因分析

可能原因:langchain-openai 内部在构造 Responses API 请求时(_construct_responses_api_input),会把消息内容块(content block)的 id 字段原样转发给 OpenAI。但 create_text_block() 这类工厂方法会自动生成以 lc_ 开头的合成 ID,而 OpenAI Responses API 严格要求 assistant item 的 ID 必须以 msg_ 开头,导致请求被拒绝。

Issue 讨论中还提到,另一个相关 Issue(#39100)描述了同样的 ID 转发问题在 Anthropic 集成中的表现,说明这是 LangChain 序列化路径中的一类通用问题。

环境排查

  • 确认 langchain-openailangchain-core 的版本,尝试升级到最新稳定版,确认问题是否仍然存在。
  • 确认使用的 Python 版本(复现环境为 Python 3.13)。
  • 确认是否启用了 Responses API(use_responses_api=True)以及 output_version='v1' 参数。
  • 检查消息对象中是否存在非 msg_ 开头的 ID,尤其是通过 create_*_block() 工厂方法生成的内容块。

解决步骤

  1. 可优先尝试将 langchain-openai 升级到最新版本,并重新运行代码,确认是否已包含修复。
  2. 如果升级后仍报错,可检查你的 AIMessage 是否使用了 create_text_block();若是,将其替换为普通字符串内容(如 AIMessage(content="...")),避免生成 lc_ 前缀 ID。
  3. 如果必须保留 content block 结构,可尝试在发送前手动移除或改写块中的 id 字段,使其以 msg_ 开头或直接删除该字段。
  4. 关注 Issue <a href="https://github.com/langchain-ai/langchain/issues/39116" target="_blank" rel="nofollow no

    参考来源

    langchain-ai/langchain #39113

    GamsGo AI

    AI 工具推荐

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

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

    了解 GamsGo AI

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

    这个方案解决了吗?

celebrityanime
celebrityanime
文章: 16780

发表回复

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