事情本身不复杂,线索都在日志里。把商品标题放在图片前面拼 content 数组发给 gpt-4o,返回 400,原文 invalid content type for this message,同一份内容把图放前面就正常,用的是 openai 1.51。
第一反应是「content 传成了字符串与数组混用的结构」,验证下来不成立。
原因不止一个,得分开看。部分模型对图文块顺序有隐含要求,文本块后置更稳。还有一种是image_url 块里缺 detail 字段的默认值被网关改坏。
不容易想到的是,图片数超过单条消息上限,被整体判为非法。
第一件事是改成数组形式并让图在前
python -c "import json;print(json.dumps([{'type':'image_url','image_url':{'url':'https://x/a.jpg'}},{'type':'text','text':'这张图卖什么'}]))"
再往下用最小结构确认接口可用
curl -sS https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $OPENAI_API_KEY" -H 'content-type: application/json' -d @mm.json
等前面都确认过,再统计每条消息里的图片数量
python -c "import json;d=json.load(open('mm.json'));print(sum(1 for b in d['messages'][0]['content'] if b['type']=='image_url'))"
恢复的判定其实很直接。返回 200 且模型回答与图片内容相关,content 数组结构固定为图在前文在后,400 不再出现。
补一句。顺序不是玄学,多模态块按顺序进入视觉编码,把说明文字放后面能显著提高指代准确率。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
