先看现象。把 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,上传完立刻引用是最常见的失败点。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189