先看现象。把 8MB 的手机照片转 base64 塞进 inlineData,gemini-1.5-pro 返回 400,原文 request payload size exceeds the limit,换成 File API 又不知道怎么等就绪。
原因不止一个,得分开看。内联数据走请求体,整体体积有上限。也可能是图片没有降采样,分辨率远超识别所需。
少数情况下是File API 上传后状态还是 PROCESSING 就被引用。
不容易想到的是,同一张图同时用两种方式传,内容重复计算。
压缩到 1024 长边再内联
python -c "from PIL import Image;im=Image.open('p.jpg');im.thumbnail((1024,1024));im.save('p_s.jpg',quality=85)"
接着改走 File API 上传
curl -sS -X POST "https://generativelanguage.googleapis.com/upload/v1beta/files?key=$GEMINI_API_KEY" -H 'X-Goog-Upload-Protocol: raw' -H 'Content-Type: image/jpeg' --data-binary @p_s.jpg
轮询文件状态直到 ACTIVE
curl -sS "https://generativelanguage.googleapis.com/v1beta/files?key=$GEMINI_API_KEY" | jq -r '.files[] | [.name,.state] | @tsv'
隔了一天再看,现象没变,说明不是偶发。
那几天正好在做别的变更,先把时间线对齐才敢动手。
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
怎么算真的好了,看的是同一批现象。文件状态变为 ACTIVE,引用该文件的 generateContent 返回 200 并给出图像描述,单次请求体积落在限制内。
补一句。内联适合小图快验,批量和视频必须走 File API,上传完立刻引用是最常见的失败点。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
