快速结论:当你使用 LangChain 的 create_agent 并传入原始 JSON Schema 字典作为 response_format(例如 ToolStrategy(schema_dict))时,模型返回的非法结构化输出(如类型错误、缺少必填字段)不会被校验,导致重试机制失效。优先排查你是否使用的是 Pydantic 模型而非原始 JSON Schema 字典——Pydantic 模式不存在此问题。
适用环境:Issue 确认的环境为 langchain 1.3.11、langchain-core 1.4.8、pydantic 2.13.4(干净 venv 下执行 pip install langchain)。问题复现于 master 分支(提交 fca0a977a)。
最快修复方案:暂无确认的一步修复方案。截至 Issue 关闭时,修复未合并到发布版本;讨论中提出的方案(在 _parse_with_schema 的 json_schema 分支中加入校验)仍处于 PR 提案阶段。
注意事项:Issue 中明确说明校验原始 JSON Schema 需要引入 jsonschema 依赖(该包当前不是 langchain 的依赖,也不存在于 uv.lock 的传递依赖中)。是否添加依赖属于维护者决策,评论区未达成最终结论。
问题场景
用户使用 LangChain 的 create_agent 创建 Agent,并通过 response_format=ToolStrategy(REPORT_JSON_SCHEMA) 直接传入一个 Python 字典形式的原始 JSON Schema。当模型调用结构化输出工具时,返回了不符合 schema 的参数(例如:key_findings 字段应为对象数组,模型却返回字符串 "[]")。用户期望 LangChain 校验失败后触发 handle_errors 重试机制,但实际结果是非法参数被直接作为 structured_response 返回,重试从未发生。
同等的错误参数在 Pydantic schema 模式下会正常抛出异常并触发重试,因此问题特定于原始字典 schema。
报错原文
ValueError: If parsing fails
原因分析
根据 Issue 中多位维护者及贡献者的分析,问题定位于 _parse_with_schema() 函数。当 schema_kind == "json_schema"(即传入原始字典)时,该函数直接返回数据而不进行任何校验。
这意味着:
- 非法输出不会经过
parse()的验证流程,因此不会触发StructuredOutputValidationError。 - 由于
factory.py中的错误处理和重试机制依赖StructuredOutputValidationError才能启动,所以ToolStrategy.handle_errors的重试逻辑永远无法被触发。 - 相比之下,Pydantic、TypedDict 和 dataclass schema 在解析时已执行校验,因此不存在此问题。
注意:以上分析基于 Issue 中贡献者的代码审查与复现结果,属于确认的根因,而非推测。
环境排查
- 确认
langchain版本是否为 1.3.11 或更新(问题在master分支仍存在)。 - 确认
langchain-core版本是否为 1.4.8 或更新。 - 确认
pydantic版本是否为 2.13.4 或相近版本。 - 检查
jsonschema是否为已安装依赖(Issue 确认它当前不是 langchain 的依赖,但修复方案可能将其变为可选或必需依赖)。 - 确认
response_format传入的是原始字典,而不是 Pydantic 模型类。
解决步骤
- 临时规避方案:将原始 JSON Schema 字典转换为 Pydantic 模型,然后使用该模型作为
response_format。这样可立即启用输出校验与重试机制,绕开当前 bug。 - 跟踪修复进度:关注 Issue #38719 及其关联 PR。截至 Issue 关闭,修复尚未合并。
- 可优先尝试:Issue 评论中提出的最小修复方案是在
_parse_with_schema()的json_schema分支中增加校验,并在校验失败时抛出ValueError,使错误流入现有StructuredOutputValidationError和重试流程。若你愿意使用非官方补丁,可基于此思路自行修改源码,但请注意这不是官方推荐路径。 - 依赖注意:若采用“可选
jsonschema导入”方案,未安装该包时行为不变(直接返回不校验),仅产生一次性警告;若采用“硬依赖”方案,则需要新增jsonschema依赖。两种方案均处于讨论阶段,未获维护者最终批准。
验证方法
复现 Issue 提供的测试脚本:
- 若传原始字典 schema,模型返回
key_findings="[]"(字符串)时,structured_response会直接输出该非法值,且不会发起第二次调用(重试请求缺失)。 - 若传等价 Pydantic schema,相同错误参数会触发
handle_errors重试,第二次调用成功后返回正确的数组类型。
修复生效的验证标准:字典 schema 的非法输出同样会触发重试,并最终返回符合 schema 的结果(如 key_findings=[{"finding": "ok"}])。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。

![[langchain-deepseek] Missing `reasoning_content` in request payload when using deepseek-reasoner with tool calling](https://www.chat-gpts.plus/wp-content/uploads/2026/08/34166-e1df8dd1-768x403.jpg)
