把 40 张商品图一次性放进 content 数组,请求在 SDK 层就被拒,报 413 request_too_large,响应头里 content-length 接近 30MB。

一开始怀疑是「同一批图重复编码了两次,体积翻倍」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。单次请求体积有硬上限,图片是按 base64 膨胀后的字节算。少数情况下是图片分辨率没压缩,单张就占好几 MB。

不容易想到的是,网关自己的 body 限制比官方更低,错误被提前拦下。

量一下请求体的真实大小

python -c "import os;print(os.path.getsize('payload.json')/1048576,'MB')"

再往下把长边压到 1568 像素再编码

python -c "from PIL import Image;im=Image.open('a.jpg');im.thumbnail((1568,1568));im.save('a_s.jpg',quality=80)"

然后按张数分批发送并串行等待

for f in parts/*.json; do python call_claude.py --file "$f"; done

末了确认网关的 body 上限配置

grep -rn client_max_body_size /etc/nginx/

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

恢复的判定其实很直接。每批请求返回 200,单包体积稳定在 5MB 以内,响应里的 stop_reason 为 end_turn,失败计数为零。

补一句。图片走 base64 会膨胀约三分之一,限流算的是编码后体积,不是原图大小,按原图估算必然超。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189