这个问题在线上不会自己消失,按现象、配置、日志三步走基本能定位。 把手机拍的 PNG 直接 base64 传给 claude-3-5-sonnet,返回 400,提示 image exceeds 5 MB maximum,原图实际 6.2 MB,分辨率 4032×3024,同一张图压成 JPEG 后却能过。

多数情况下不用停机,但涉及重启服务时最好挑低峰期。

先分清是哪一类原因

  1. 原图没有做任何压缩就直接编码上传
  2. 长边超过了模型允许的最大像素尺寸
  3. PNG 无损格式体积远大于同画质 JPEG
  4. 批量请求里多张图合计超出了请求体上限

按顺序处理

1. 用 Pillow 把长边压到 1568 以内并转 JPEG

python -c "from PIL import Image;im=Image.open('a.png');im.thumbnail((1568,1568));im.convert('RGB').save('a.jpg',quality=85)"

2. 确认压缩后的字节数在限制以内

python -c "import os;print(round(os.path.getsize('a.jpg')/1048576,2),'MB')"

3. 编码成 base64 再放进 image 块

python -c "import base64;print(base64.b64encode(open('a.jpg','rb').read()).decode()[:40])"

4. 请求前打印 media_type 与体积做最后检查

print('image/jpeg', len(b64))

怎么确认已经恢复

请求返回 200,不再出现 5 MB 提示,识别结果能读出图片里的表格文字,批量任务也能整批跑完。

容易忽略的地方

限制按原始字节算,base64 会让请求体再涨约三分之一,所以压缩目标最好留在 3.5 MB 以内,多人并发时还要留出余量。 涉及改配置的操作,改完记得做一次完整的回归,别只看当前这个报错有没有消失。

作者 9823189