问题出现得很突然,日志倒是留得挺全。把本地截图读成 base64 直接填进 image_url.url,调 doubao-vision 返回 400,提示 InvalidParameter,图片地址格式不合法,换成公网链接就正常。

刚开始盯着「图片格式不在支持列表里,比如 webp 未开启」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。base64 必须带 data:image/png;base64, 前缀。也可能是直接把本地路径当成 url 传了进去。

还有一种情况,base64 里带换行,服务端解析到一半就失败。

拼上完整的 data URL 前缀再发送

url = 'data:image/png;base64,' + b64

随后用 curl 发最小报文确认字段位置

curl https://ark.cn-beijing.volces.com/api/v3/chat/completions -H "Authorization: Bearer $ARK_KEY" -d '{"model":"doubao-vision-pro","messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"data:image/png;base64,iVBOR..."}}]}]}'

然后确认图片编码与真实格式一致

python -c "from PIL import Image;print(Image.open('a.png').format)"

去掉 base64 中的换行再拼接

b64 = base64.b64encode(data).decode().replace('\n','')

别只看报错消失,验证要多做一步。请求返回 200,模型能描述图片内容,不再出现参数不合法的提示,批量图片也能逐张通过。

前缀里的格式必须和真实文件一致,把 jpg 写成 png 有时不报错但识别结果会明显变差,比直接报错更难发现。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189