在 Bedrock 上用 Converse 接口接 Claude 3.5,工具参数 schema 里用 allOf 复用公共字段,请求直接返回 400,提示 toolConfig 里的 schema 校验失败,同一份 schema 发到 Anthropic 原生接口能通过。
一开始怀疑是「工具名超过 64 个字符或含有点号被拒」,查了一圈,方向不对。
排查方向其实有限,先把可能性排一排。Bedrock 只支持 JSON Schema 的一个子集,allOf 不在其中。少数情况下是schema 里带了 $ref,Bedrock 不做引用解析。
不容易想到的是,toolChoice 指定了工具列表里不存在的名字。
先把 allOf 展开成平铺字段再提交
python flatten_schema.py --in tools.json --out tools_flat.json
然后用 aws cli 复现并拿到完整报错
aws bedrock-runtime converse --model-id anthropic.claude-3-5-sonnet-20241022-v2:0 --tool-config file://tools_flat.json --messages file://msg.json
校验工具名长度与字符集
python -c "import json;print([len(t['toolSpec']['name']) for t in json.load(open('tools_flat.json'))['tools']])"
冒烟一次确认能返回工具调用
python smoke_bedrock.py --expect tool_use
这类问题以前遇到过,但这次的触发条件和上次不一样。
这类改动我都写进变更记录,过两周再出问题时能对上号。
改完先别撤,确认这几项。Converse 返回的 stopReason 是 tool_use,toolUse 里的 input 是完整对象,控制台不再报 schema 错。
补一句。各家的 schema 子集不一样,跨云迁移先用最小 schema 打通,再逐字段加回去,比整体搬过去省事。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
