LangChain 0.3 里把工具参数模型从 pydantic BaseModel 换成标准库 dataclass,bind_tools 之后调用报 400,提示 parameters 不是合法的 JSON Schema,本地用 from_function 构造工具却能成功。

一开始怀疑是「字段用了 Optional 却没给默认值,生成的 required 不完整」,查了一圈,方向不对。

原因不止一个,得分开看。dataclass 需要 pydantic 的 dataclasses 包装才会生成 schema。另一种情况是args_schema 传的是类而不是实例,字段被当成方法解析。

另外,环境里混装了 pydantic v1 的兼容层,v2 生成的 schema 被改写。

动手时先打印工具生成的 schema 看结构

python schema_dump.py --tool search --out schema.json

随后改用 BaseModel 定义参数并复测

python tool_def.py --style pydantic --name search

再往下跑一遍绑定工具的离线校验

pytest tests/test_tools.py -k schema -q

剩下的就是把实际请求体落盘看服务端收到的 parameters

python dump_request.py --tool search --out req.json

同一份数据我导出了两份,一份留底,一份拿来试。

改完先别撤,确认这几项。工具能正常绑定并调用,服务端不再报 schema 非法,函数收到的参数是 dict 而不是字符串。

提醒一点。工具参数模型换写法时先落盘看 schema,比在异常栈里猜字段快得多。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189