问题出现得很突然,日志倒是留得挺全。把图片读成 base64 后直接放进 image_url.url,返回 400 invalid_image,提示无法解析该图像数据,可同一张图在网页里能正常打开。
刚开始盯着「图片其实是 webp,前缀却写成 png」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。url 字段需要完整的 data URL,不能只放裸 base64。还有一种是base64 里混入换行导致解码失败。
另外,图片被截断,编码长度不是四的倍数。
拼上正确的 mime 前缀再发送
url = f'data:image/jpeg;base64,{b64}'
编码时去掉所有换行
b64 = base64.b64encode(data).decode().replace('\n','')
然后用 PIL 校验文件头与声明一致
python -c "from PIL import Image;im=Image.open('a.jpg');print(im.format, im.size)"
大图先压缩再编码,减少请求体体积
python -c "from PIL import Image;Image.open('a.jpg').resize((1024,1024)).save('s.jpg')"
那几天正好在做别的变更,先把时间线对齐才敢动手。
别只看报错消失,验证要多做一步。请求返回 200,模型能准确说出图片里的物体数量,不再报图像无效,多图请求也能逐张通过。
补一句。有的网关会限制请求体总大小,图片压缩到 1 MB 以内成功率明显更高,尤其是在同时传多张图的时候。这类问题最好一次改到位,反复小改反而容易把原因搅混。