这个坑值得记一笔。在 Anthropic SDK 0.42 里用 messages.create 传一张截图给 claude-3-7-sonnet-20250219,接口直接返回 400,原文是 messages.0.content.0.image.source.base64: image exceeds 5 MB maximum,PNG 是截图工具导出的,本地看着只有 1.8MB,把导出质量从 100 降到 80 重新存,体积反而涨到 2.4MB。

刚开始盯着「base64 编码会让长度膨胀约三分之一,超限判的是编码后的长度」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。PNG 是无损格式,调低「质量」参数根本不会改变编码体积;截图里有大面积渐变背景,PNG 编码后体积比原图还大;请求里同时塞了多张图,单张没超但整体触发了网关的请求体上限。

量出 base64 之后的真实字节数

python -c "import base64,os;p='shot.png';print(os.path.getsize(p), len(base64.b64encode(open(p,'rb').read())))"

随后把 PNG 转成 JPEG 并压到 2MB 以内

magick shot.png -resize 1600x -quality 82 shot.jpg

接着确认转换后的文件确实变小了

python -c "import os;print(os.path.getsize('shot.jpg'))"

末了用同一请求验证是否还报 400

curl https://api.anthropic.com/v1/messages -H "x-api-key: $KEY" -H "anthropic-version: 2023-06-01" -d '{"model":"claude-3-7-sonnet-20250219","max_tokens":256,"messages":[{"role":"user","content":[{"type":"image","source":{"type":"base64","media_type":"image/jpeg","data":"..."}},{"type":"text","text":"描述图片"}]}]}'

改完先别撤,确认这几项。同一张图返回 200 且 content 里有正常描述,请求体长度降到 3MB 以内,日志不再出现 image exceeds 5 MB。

容易忽略的是,PNG 的「质量」是个伪参数,截图类图片转 JPEG 或者用 pngquant 压色深才有效,体积按 base64 后长度算,本地文件看着没超也会被拒。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189