先看现象。用阶跃星辰 step-1v-8k 做票据识别,messages 里按 OpenAI 的 image_url 结构传一张 jpg 的 base64,接口返回 400 invalid parameter,原文说 image content 格式不合法,同一份结构在 gpt-4o 上能通。
这类报错背后常见的原因有几处,逐个排除就行。该接口的图片必须放在 content 数组里且 type 写 image_url。还有一种是base64 缺少 data:image/jpeg;base64, 这段前缀。
另外,图片长边超过 4096 像素被服务端拒绝。
少数情况下是请求里同时留了旧版 image 字段和新版数组,解析取到旧的那个。
上来先把 base64 头部和前 32 位打出来核对前缀
python -c "import base64;s=open('a.jpg','rb').read();print(len(s),base64.b64encode(s)[:32])"
接着按文档重组 content 数组后重新请求
curl https://api.stepfun.com/v1/chat/completions -H "Authorization: Bearer $STEP_KEY" -d @vision_body.json
然后把图片压到长边 2048 再重试
python resize.py --input a.jpg --max-side 2048 --out a_small.jpg
剩下的就是用纯文本与纯图片两个最小请求二分定位
python probe_vision.py --text-only --image-only
怎么算真的好了,看的是同一批现象。返回 200 且 choices 里能读出票面金额,usage 的 prompt_tokens 明显大于纯文本请求。
补一句。多模态字段各家写法差得多,先在纯文本请求上确认通道正常,再单独验证图片结构,能省掉一半排查时间。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
