报错是这么冒出来的。工具 schema 里把 page_size 写进了 required,但它其实可以不传,模型在简单查询时不填该字段,服务端 pydantic 校验报 page_size Field required,整体失败率约三成。
中间走过弯路,把「默认值写在描述里而不是 schema 的 default」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。required 数组与字段的实际可选项不一致。少数情况下是模型按语义判断该字段可以省略。
还有一种情况,服务端二次校验按严格模式执行。
动手时先把可选字段移出 required 并给默认值
python fix_schema.py --optional page_size --default 20
服务端补默认值而不是报错
python server.py --defaults page_size=20
随后用不传该字段的请求验证
curl http://127.0.0.1:8000/tool/search -d '{"query":"退款"}' -H 'Content-Type: application/json'
末了统计一周内的校验失败次数
grep -c 'Field required' app.log
别只看报错消失,验证要多做一步。不传可选字段的调用全部成功,日志里 Field required 计数归零,返回条数符合默认值预期。
这里还有个坑。required 是给模型看的行为约束,不是越严越好,把可省字段标成必填只会换来一批无意义的失败。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
