这个坑值得记一笔。用 dashscope 1.20 调 qwen-vl-plus 做票据识别,把 3MB 的 jpg 转成 base64 直接放进 image_url,接口返回 400,原文是 InvalidParameter: url error,换成公网 http 地址就正常。

刚开始盯着「单张图片编码后超过接口的体积上限」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。image_url 的字段要求完整 data URI 前缀,只给裸 base64 不认;base64 编码时带了换行,长度校验直接失败;图片是 CMYK 色彩模式,解码端不支持。

先确认字符串开头是否带 data 前缀

python -c "import base64;s=base64.b64encode(open('bill.jpg','rb').read()).decode();print(('data:image/jpeg;base64,'+s)[:40])"

去掉换行并统计编码后长度

python -c "import base64;s=base64.b64encode(open('bill.jpg','rb').read()).decode().replace('\n','');print(len(s))"

压缩图片后再对比请求体大小

python -c "from PIL import Image;im=Image.open('bill.jpg').convert('RGB');im.thumbnail((1600,1600));im.save('bill2.jpg',quality=85)"

等前面都确认过,再用最小请求验证字段拼写

curl https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions -H "Authorization: Bearer $KEY" -d @vl.json

别只看报错消失,验证要多做一步。同样的图片以 data URI 形式提交后返回 200,票据上的金额与编号都能正确读出,日志里不再出现 InvalidParameter。

这里还有个坑。不同厂商对 image_url 的接受形式不一样,有的要完整 data URI,有的要可访问地址,先按文档拼最小请求验证。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189