报错是这么冒出来的。工具 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 是给模型看的行为约束,不是越严越好,把可省字段标成必填只会换来一批无意义的失败。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189