这个坑值得记一笔。boto3 1.35 调 Bedrock Converse,toolSpec 里的 inputSchema 直接用 Pydantic 的 model_json_schema 输出,带 $schema 和 title,返回 400,原文 The json schema is invalid。

刚开始盯着「嵌套模型带出的 $defs 没有展开」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。Bedrock 不接受 $schema 与 $id 这两个键;required 被写成空数组;additionalProperties 的写法与规范不一致。

动手时先把生成的 schema 原样打印出来

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

递归删掉 $schema、$id、title 等展示用键

python clean_schema.py --drop '$schema,$id,title'

接着用 aws cli 或 boto3 发一次最小 converse 请求

aws bedrock-runtime converse --model-id anthropic.claude-3-5-sonnet-20241022-v2:0 --messages file://msg.json --tool-config file://tool.json

剩下的就是把嵌套模型拍平成单层对象再试

python flatten_schema.py --input schema.json --out flat.json

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

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

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

改完先别撤,确认这几项。Converse 返回 200 并给出 toolUse,schema 里只剩 type、properties、required 三类键,400 不再出现。

补一句。各家对 JSON Schema 的支持是子集,Pydantic 生成的 schema 适合本地校验,直接拿去当接口参数往往要裁剪,最好维护一份精简版。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189