这类问题我又碰上了一次。instructor 1.5 用 from_anthropic(mode=Mode.ANTHROPIC_TOOLS) 抽发票字段,报 400,原文 tools.0.input_schema: Extra inputs are not permitted,换成 ANTHROPIC_JSON 模式能跑。

第一反应是「工具名超过 64 个字符」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。Pydantic v2 生成的 schema 带 $defs;字段上的 default 被写进了 schema;嵌套模型没有展开成内联对象。

动手时先打印最终提交的 input_schema

python -c "import json;from models import Invoice;print(json.dumps(Invoice.model_json_schema(), ensure_ascii=False))"

随后把嵌套模型拍平并去掉默认值

python flatten_invoice.py --drop-defaults true

接着改用 JSON 模式做对照验证字段本身没问题

python smoke_instructor.py --mode anthropic_json

升级 instructor 后重试工具模式

pip install -U instructor

报错是间歇性的,我蹲守了半小时才抓到一次完整现场。

白天有业务在跑,能验证的部分都压到了晚上做。

当时还开着另一个排查窗口,两边日志对照着看才定位到。

恢复的判定其实很直接。工具模式返回 200,抽取结果能通过 Pydantic 校验,input_schema 里只剩允许的键。

容易忽略的是,模式和 schema 是两套约束,JSON 模式宽松所以能过,工具模式会把 schema 原样交给模型服务,报错时先精简 schema 而不是改业务模型。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189