现场是这样的。baichuan4 接口返回 1002,原文 parameter missing,请求里 model、messages 都带了,换成 openai 兼容路径 /v1/chat/completions 才报,用官方原生路径正常。
中间走过弯路,把「请求头缺 Content-Type 被当成表单解析」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。兼容路径要求显式带 stream 字段;messages 里的 role 用了 developer,该模型不认;SDK 把 top_p 和 temperature 同时置空传了过去。
上来先用官方原生路径发一条最小请求
curl -s https://api.baichuan-ai.com/v1/chat/completions -H "Authorization: Bearer $BAICHUAN_KEY" -H "Content-Type: application/json" -d '{"model":"Baichuan4","messages":[{"role":"user","content":"hi"}]}'
接着把请求体原样打印出来核对字段
python -c "import json;print(json.dumps(json.load(open('req.json')),ensure_ascii=False))"
补上 stream 和 Content-Type 再试
curl -s https://api.baichuan-ai.com/v1/chat/completions -H "Authorization: Bearer $BAICHUAN_KEY" -H "Content-Type: application/json" -d '{"model":"Baichuan4","stream":false,"messages":[{"role":"user","content":"hi"}]}'
剩下的就是在客户端统一过滤空值参数
python -c "d={'top_p':None};print({k:v for k,v in d.items() if v is not None})"
同样的操作我在测试机上先走了一遍,线上只做验证过的部分。
这台环境是别人交接的,不少默认值被动过,只能一项项核。
怎么算真的好了,看的是同一批现象。同一请求返回 200,错误码不再是 1002,请求体里没有 null 值的可选参数。
国内厂商的错误码文档更新慢,报参数缺失时先把完整请求体打出来看,比猜字段快。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
