Read 工具不再整块吞图片:超过 128 MB 直接拒绝
让 Claude「看一眼这张截图」时,用的是 Read 工具。文本文件早就有大小保护(详见大文件读取与 allow-large),图片这边却一直有个漏洞:不管多大,都会被整个读进内存。
CLI 2.1.302 把这个口子堵上了,这也是这一版发布时被重点提到的改动之一。
以前会出什么事
旧版本里,Read 处理图片的逻辑大致是「后缀像图片,就整份读进来」。这带来两类问题:
- 超大图片:几百 MB 的扫描件、未压缩 TIFF、卫星图或设计导出图,读进来会让进程内存猛涨,严重时直接把 Claude Code 撑崩;
- 名字像图片、其实不是文件的东西:比如一个叫
frame.png的命名管道,或某个设备文件。它们可能没有尽头,Read 会一直读下去。
后者听起来少见,但在做视频截帧、跑流式处理脚本的项目里,确实会有这类特殊文件躺在工作目录里。
现在的规则
| 情况 | 2.1.302 起的行为 |
|---|---|
| 图片源不超过 128 MB | 照常读取 |
| 图片源超过 128 MB | 拒绝读取 |
| 名字像图片的管道或设备 | 不再整个读进内存 |
拒绝之后 Claude 会拿到一个错误结果,而不是让整个会话卡死或崩掉。你能继续对话,告诉它换个办法就行。
遇到大图怎么办
128 MB 的上限对普通截图、照片、设计稿来说绰绰有余。真碰到超限,通常意味着这张图本来就不适合原样喂给模型——模型看图时也会缩放,原图里的大部分像素用不上。几种实用做法:
先缩小再读:让 Claude 用命令行工具生成一份缩略图再看,例如:
bashmagick huge-scan.tif -resize 2048x2048 -quality 85 preview.jpg只看关心的区域:裁出需要的那一块,比整张图更省上下文,也更容易让模型看清细节;
换格式:未压缩的 TIFF、BMP 转成 PNG 或 JPEG,体积往往能降一个数量级。
如果你要的不是「看图」,而是图片的元数据(尺寸、EXIF、色彩空间),直接让 Claude 用 identify 或 exiftool 之类的工具读,根本不必把像素加载进来。
小结
- 2.1.302 起 Read 工具拒绝超过 128 MB 的图片源;
- 名字像图片的管道、设备也不会再被无限读入内存;
- 碰到超限,先缩放、裁剪或转格式,再让 Claude 看。
这是个「平时感觉不到、出事时救命」的修复。项目里有大体积素材的话,升级到 2.1.302 或更新版本会稳不少。