先把当时的情况摆出来。把一段带图片地址的审核请求发给 omni-moderation-latest,返回 400,原文 unsupported input type,纯文本用同一个模型完全没有问题。
排查方向其实有限,先把可能性排一排。图片要放进 image_url 类型的块里,不能塞进 text 字段。还有一种是图片只支持公网可访问地址或者 data URL。
还有一种情况,旧的 text-moderation 系列不认多模态输入。另外,单次请求的输入块数量有上限,超了同样报类型错误。
先跑纯文本确认模型本身可用
curl -s https://api.openai.com/v1/moderations -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d '{"model":"omni-moderation-latest","input":"测试文本"}' | jq '.results[0].flagged'
随后按块结构同时提交文本与图片
curl -s https://api.openai.com/v1/moderations -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d '{"model":"omni-moderation-latest","input":[{"type":"text","text":"描述"},{"type":"image_url","image_url":{"url":"https://example.com/a.png"}}]}' | jq '.results[0].category_scores'
再往下确认模型名不是旧的纯文本版本
curl -s https://api.openai.com/v1/models -H "Authorization: Bearer $OPENAI_API_KEY" | jq -r '.data[].id' | grep moderation
本地图片转成 data URL 再试一次
python -c "import base64;print('data:image/png;base64,'+base64.b64encode(open('a.png','rb').read()).decode()[:50])"
怎么算真的好了,看的是同一批现象。请求返回 200 且 results 里同时给出文本与图片的分类分数,flagged 字段有明确取值,日志里不再出现 unsupported input。
容易忽略的是,审核接口的输入结构和对话接口相似但不同源,块类型写错时报的是类型错误,不是参数缺失,容易误判成模型不支持。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
