把 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 会膨胀约三分之一,限流算的是编码后体积,不是原图大小,按原图估算必然超。这类问题最好一次改到位,反复小改反而容易把原因搅混。
