关于 vision-squeezer
VisionSqueezer 是用于缩减图像以适配视觉模型令牌预算的库、CLI 和 MCP 服务,面向处理代码、文件或工具图像的开发者与 Agent;不处理直接附加到聊天中的图像。
主要功能
- 01按令牌预算缩减图像
- 02按模型估算令牌用量
- 03裁剪和调整图像尺寸
- 04批量处理图像目录
- 05提供 HTTP 图像优化端点
- 06安装器配置受支持的客户端
适用场景
- 01优化截图以供 Agent 分析
- 02准备发送给视觉模型 API 的图像
- 03批量处理图像文件夹
- 04在 HTTP 工作流中加入图像优化
MCP 相关
MCP 服务允许兼容客户端优化 Agent 传入的图像,例如文件或工具输出;不处理直接附加到聊天界面的图像。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
VisionSqueezer
在图像到达模型之前,将其调整到视觉大模型的 token 预算范围内。提供库、命令行工具和 MCP 服务,适用于代码、Agent 和流水线。
它做不到什么。 VisionSqueezer 无法缩小你粘贴、拖入或通过
@附加到聊天窗口(Claude Code、Cursor、ChatGPT 等)的图像。客户端会在任何工具或钩子运行之前附加图像,因此这些图像仍按完整大小计费。它能节省 token 的场景:
- 你的代码发送到模型 API 的图像:Rust crate、Python 绑定和命令行工具。
- Agent 从文件中读取或通过工具获取的图像(屏幕截图、爬虫、浏览器自动化):MCP 服务,或用于处理项目内文件的 Claude Code 图像读取钩子。
确切场景请参阅节省 token 的场景。
MCP 服务可在任何 MCP 客户端(Claude Code、Cursor、Codex、Gemini CLI 等)中运行,但只能看到 Agent 传给它的图像。
安装
每个客户端只需一条命令(推荐)
npx vision-squeezer install # asks for the client and scope
npx vision-squeezer install --client claude --scope user --yes
npx vision-squeezer install --client cursor --yes
每种客户端都只有一种安装方式,安装程序会自动选择:
| 客户端 | install 的操作 |
|---|---|
| Claude Code | 安装 vision-squeezer-mcp 插件:MCP 服务、/vision-stats、/vision-doctor、/vision-upgrade 技能,以及图像读取钩子 |
| Codex CLI、Qwen Code、Kimi CLI | 运行 <cli> mcp add vision-squeezer -- npx -y vision-squeezer@<version> |
| Gemini CLI | 同样运行 mcp add,并在 settings.json 中添加图像读取钩子 |
| VS Code | 运行 code --add-mcp |
| Cursor | 将一个固定版本的条目合并到 mcp.json,并在 hooks.json 中添加图像读取钩子 |
| OpenCode | 将一个固定版本的条目合并到 opencode.json,并添加图像读取插件 |
| Windsurf、Claude Desktop | 将一个固定版本的条目合并到客户端的 JSON 配置中 |
JSON 文件只会合并,不会替换:其他服务和钩子都会保留;无法解析的文件不会被修改;重新运行时会替换我们自己的条目,而不是重复添加。
仅当客户端支持多种作用域(user、local、project)时,才会询问选择哪种作用域。旧版本中的 --method 参数仍可接受,但会被忽略。
下方的手动命令为简洁起见使用 npx -y vision-squeezer。请固定版本,如 vision-squeezer@<version>(安装程序会为你处理):不指定版本的 npx 会继续使用它最初缓存的版本,即使已有新版本发布也是如此。
Claude Code
npx vision-squeezer install --client claude --scope user --yes
此命令会替你运行下面的两条命令(并首先移除旧版 claude mcp add 注册和 settings.json 钩子)。如需手动操作:
claude plugin marketplace add eralpozcan/vision-squeezer
claude plugin install vision-squeezer-mcp@vision-squeezer --scope user
重启 Claude Code,或运行 /reload-plugins,以加载 MCP 服务、技能和钩子。只想安装 MCP 服务,不需要技能和钩子?运行 claude mcp add --scope user vision-squeezer -- npx -y vision-squeezer。
Claude Desktop
npx vision-squeezer install --client claude-desktop --yes
也可以将配置添加到 claude_desktop_config.json(macOS:~/Library/Application Support/Claude/,Windows:%APPDATA%\\Claude\\):
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Cursor
npx vision-squeezer install --client cursor --yes
或者添加到 ~/.cursor/mcp.json(全局)或 .cursor/mcp.json(项目):
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
点击此处查看其他 10 多种 IDE 和 Agent 的安装说明(VS Code、JetBrains、Windsurf、Zed 等)
VS Code Copilot
code --add-mcp '{"name":"vision-squeezer","command":"npx","args":["-y","vision-squeezer"]}'
或者添加到 .vscode/mcp.json:
{
"servers": {
"vision-squeezer": {
"type": "stdio",
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
JetBrains(IntelliJ、WebStorm、PyCharm)
打开 Tools → GitHub Copilot → Model Context Protocol (MCP) → Configure,然后添加:
{
"servers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Windsurf
npx vision-squeezer install --client windsurf --yes
或者添加到 ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Gemini CLI
Google 于 2026-06-18 为免费用户和 Google One 用户用 Antigravity CLI 替代了 Gemini CLI。在 Antigravity 上,请参阅 Antigravity。
gemini mcp add --scope user vision-squeezer -- npx -y vision-squeezer
或者添加到 ~/.gemini/settings.json(用户级)/ .gemini/settings.json(项目级):
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Codex CLI
codex mcp add vision-squeezer -- npx -y vision-squeezer
或者添加到 ~/.codex/config.toml:
[mcp_servers.vision-squeezer]
command = "npx"
args = ["-y", "vision-squeezer"]
Qwen Code
qwen mcp add vision-squeezer -- npx -y vision-squeezer
OpenCode
opencode mcp add 仅支持交互式操作,因此请直接添加到 ~/.config/opencode/opencode.json(全局)或仓库根目录下的 opencode.json(项目):
{
"mcp": {
"vision-squeezer": {
"type": "local",
"command": ["npx", "-y", "vision-squeezer"],
"enabled": true
}
}
}
Kimi CLI
kimi mcp add vision-squeezer -- npx -y vision-squeezer
Zed
添加到 ~/.config/zed/settings.json:
{
"context_servers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Kiro
添加到 .kiro/settings/mcp.json(工作区)或 ~/.kiro/settings/mcp.json(全局):
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
Antigravity
仅需 MCP,无需钩子。通过 Antigravity MCP 设置进行配置:
{
"mcpServers": {
"vision-squeezer": {
"command": "npx",
"args": ["-y", "vision-squeezer"]
}
}
}
手动安装(Rust 二进制文件)
# From crates.io
cargo install vision-squeezer
# Or from source
git clone https://github.com/eralpozcan/vision-squeezer && cd vision-squeezer
make install # builds → ~/.local/bin/
然后在上述任意配置中直接使用二进制文件路径,替代 npx:
{ "command": "vision-squeezer-mcp" }
**提示:**运行
npx -y vision-squeezer --setup可打印包含自动检测路径的即用配置。
CLI 用法
vision-squeezer path/to/image.jpg \
--mode auto|ocr|standard \ # default: auto (= standard, keeps colour; ocr is opt-in)
--format jpeg|webp|avif \ # default: jpeg
--quality 85 \ # output quality 1-100 (default: 75)
--tile-size 256 \ # patch size in px (default: 512)
--no-crop \ # disable padding removal
--smart-crop \ # edge-energy crop (vs corner-tolerance)
--auto-quality 0.95 \ # binary-search quality to hit SSIM target
--bg-tolerance 25 \ # background detection 0-255 (default: 15)
--model <provider-alias> \ # model-aware resizing; see the model catalog
--max-tokens 1600 \ # token budget: downscale until the output fits (0 = off; MCP default 1600)
--max-tiles 20 \ # hard cap on tile count (model-specific unit)
--json \ # machine-readable JSON output
--dry-run # run pipeline, skip disk write
批处理模式
传入目录而非文件:
vision-squeezer ./screenshots --recursive --output-dir ./optimized
vision-squeezer ./screenshots --recursive --json > report.json
HTTP API(n8n、Make、Zapier)
vision-squeezer serve 会运行一个小型 HTTP 服务,因此任何工作流工具都可以通过普通 HTTP 请求,在两个步骤之间压缩图像。无需自定义节点。
vision-squeezer serve # 127.0.0.1:8080
docker build -t vision-squeezer . # or run it in a container
docker run -p 8080:8080 vision-squeezer
将图像字节作为 POST /optimize 的请求体发送。选项通过查询字符串传递:
| 参数 | 默认值 | |
|---|---|---|
model | claude | 用于适配和估算的模型别名(gpt6、gemini 等) |
max_tokens | 1600 | Token 预算,0 表示禁用 |
format | jpeg | jpeg、webp 或 avif |
quality | 75 | 1–100 |
mode | auto | auto、ocr 或 standard |
crop | true | false 表示保留边缘填充 |
response | image | json 会返回报告以及以 base64 编码的图像 |
curl --data-binary @screenshot.png "http://localhost:8080/optimize?max_tokens=1600" -o out.jpg -D -
# X-Tokens-Before: 4674
# X-Tokens-After: 1584
# X-Input-Size: 2400x1670
# X-Output-Size: 1344x924
GET /health 会返回 ok。超过 25 MB 的请求体会返回 413,无效输入会返回 400 和一行错误原因。此服务没有身份验证:默认监听 127.0.0.1,Docker 镜像则在容器内监听所有接口,因此仅应在可信网络上发布其端口。
**n8n。**在获取图像的步骤和视觉模型之间添加一个 HTTP Request 节点:
- 方法
POST,URL 为http://vision-squeezer:8080/optimize?max_tokens=1600(如果两者运行在同一 Docker 网络中,则使用容器名称;否则使用localhost)。 - 开启 Send Body,Body Content Type 选择 n8n Binary File,Input Data Field Name 设为
data。 - 在 Options → Response 中将 Response Format 设为 File,这样下一个节点就会获得优化后的二进制图像。开启 Include Response Headers and Status,以读取
X-Tokens-*值。
这些设置参考了 n8n 文档,但尚未在 n8n 本身中测试。
原理:视觉模型在 2026 年如何计费
如果将原始图像发送给大模型,你就在浪费 Token。现代视觉模型并不关心文件大小(MB/KB),只关心像素尺寸,但每家服务商的成本计算方式都截然不同。vision-squeezer 会模拟这些算法,找出在不丢失视觉上下文的前提下,将 Token 用量降至最低的图像尺寸。
1. OpenAI GPT-6 / GPT-5.6(32px 图块)
当前 OpenAI 视觉模型按 32×32 图块计数,在 2048px 边长和 2500 个图块的预算内容纳高细节图像,然后应用 1.2 倍乘数。
- 解决方法:
--model gpt6会移除填充,满足图块预算,并避免边缘图块只被部分使用。1024×1024 的输入为 1024 个图块 / 1229 个令牌。
2. Claude 4.7+(28px 图块)
Claude 按 ceil(宽度/28) × ceil(高度/28) 计算视觉令牌。Claude 4.7+ 高分辨率视觉功能使用 2576px 边长和 4784 个令牌的预算;claude-standard 则适用于较早的 1568px / 1568 个令牌档位。
- 解决方法: 去除填充,满足所选档位的要求,并将尺寸对齐到 28px 网格。
3. Gemini 3(大图块)
Gemini 使用 768×768 图块系统(图像超过 384px 时)。每个图块固定为 258 个令牌。
- 解决方法: 800×600 的图像会触发 2×1 图块网格(516 个令牌)。
vision-squeezer会略微缩小图像,使其刚好适配 768×768 的方框,将成本降至 258 个令牌(节省 50%)。
4. Llama 3.2 / 3.3 Vision(560px 图块)
Meta 的 Mllama 视觉功能会按 560×560 网格切分图像,最多使用 4 个图块(每个约 1601 个令牌)。
- 解决方法: 将 2400×1670 的截图裁剪至 2400×1200,可将画布从 2×2 缩减为 2×1:6404 → 3202 个令牌(−50%)。(Llama 4 使用不同的视觉编码器,因此未纳入模型计算。)
5. Qwen2-VL / 2.5-VL / 3-VL(28px 图块网格)
Alibaba 的 Qwen-VL 使用 28px 有效网格(14px 图块 × 2×2 合并);tokens = (W/28)·(H/28),范围为 [4, 16384]。
- 解决方法: 图块较小,因此关键在于面积——将 1024×1024 图像的边框去除并裁至 896×896,可将令牌数从 1369 降至 1024(−25%)。
6. DeepSeek Flash / DeepSeek-VL2
DeepSeek Flash 现已通过其兼容 OpenAI 的 API 接受图像,并说明每张图像的上限为 384 个图像令牌。API 配置使用 --model deepseek;精确的 DeepSeek-VL2 开放权重图块计算则使用 --model deepseek-local。
7. Kimi K2.5 / K2.6 / K3
Kimi 通过 Moonshot 兼容 OpenAI 的 API 支持原生图像和视频输入。Moonshot 未公布稳定的图像计费网格,因此 --model kimi 会提供参考性的原生分辨率估算,同时仍会精确优化裁剪和文件大小。
8. DeepSeek-VL2(384px 任意分辨率图块)
SigLIP-384 + 2× 像素重排,在 (m·384, n·384) 画布上每个图块为 196 个令牌(m·n ≤ 9)。
- 解决方法: 将 800×768 的图像对齐为 768×768,可将图块数量从 3×2 减至 2×2:1415 → 1023 个令牌(−28%)。(开放权重——节省的是本地推理上下文,而非 API 计费。)
传统的 gpt4o 和 gpt5 配置仍可用于使用 512px 高细节图块的端点。
查看完整的提供商计算方式和来源:visionsqueezer.com/providers
Pipeline
Input image
→ crop_padding remove solid-color borders
→ calculate_optimal_dims snap to tile boundary (always down)
→ [enforce_max_tokens] token budget (MCP default 1600) / optional tile cap
→ resize_exact Lanczos3
→ [binarize] OCR mode only: Otsu threshold
→ JPEG/WebP encode configurable quality & format
🦀 为什么选择 Rust?
VisionSqueezer 是对性能要求极高的中间件。我们选择 Rust 有三个不容妥协的理由:
- 延迟低到无感: 图像处理绝不应成为瓶颈。Rust 可确保图像对齐、裁剪和编码在毫秒内完成,让开发者在工作流中几乎感受不到优化层的存在。
- 占用空间极小: VisionSqueezer 作为运行在 IDE 后台的 MCP 服务,专为超轻量设计,在空闲时几乎不占用 CPU 和 RAM。
- 支持 Wasm: Rust 对 WebAssembly 的一流支持,让我们能将同样的高性能优化带到浏览器和边缘环境(Cloudflare Workers),在图像发送到网络之前,就能在客户端进行压缩。
基准测试快照
在 data/ 中的示例图像上,使用 vision-squeezer <image> [flags] --dry-run --json 捕获。目标是减少 token,而不是减少兆字节:服务商按像素尺寸计费,因此文件大小只影响上传和延迟。未设置预算时,流水线会对齐到网格并裁剪留白;对于大型照片,节省有限,因为服务商本身就会缩小过大的图像。token 预算(--max-tokens,MCP 服务中的默认值为 1600)才能带来实际节省。
案例研究 1:标准图像(istanbul.jpg)
2400×1670,0.5 MB。
| 运行方式 | 输出 | 文件大小 | Claude 4.7+ tokens | GPT-6 tokens | Gemini tokens |
|---|---|---|---|---|---|
| 无预算(0.7 之前的默认值) | 2048×1536 | −29% | 4,674 → 4,070(−13%) | 2,903 → 2,942 | 3,096 → 1,548(−50%) |
--max-tokens 1600(MCP 默认值) | 1344×924 | −67% | 4,674 → 1,584(−66%) | 2,903 → 1,462(−50%) | 3,096 → 1,032(−67%) |
--max-tokens 1000 | 1064×728 | −79% | 4,674 → 988(−79%) | 2,903 → 939(−68%) | 3,096 → 516(−83%) |
--max-tokens 1600 --model gpt6 | 1408×960 | −65% | 4,674 → 1,785(−62%) | 2,903 → 1,584(−45%) | 3,096 → 1,032(−67%) |
--max-tokens 1600 --model gemini | 2304×1536 | −22% | 4,674 → 4,565(−2%) | 2,903 → 2,880(−1%) | 3,096 → 1,548(−50%) |
vision-squeezer data/istanbul.jpg --max-tokens 1600
Input: 2400×1670 (0.5 MB)
Output: 1344×924 (0.2 MB, JPG q75)
File: 67.5% smaller
── Token Estimates ─────────────────────────────────────────
Model Before After Saved
------------------------------------------
Claude 4.7+ 4674 1584 3090 (66.1%)
GPT-6 2903 1462 1441 (49.6%)
GPT-4o 1105 1105 0 (0.0%)
GPT-5 910 910 0 (0.0%)
Gemini 3096 1032 2064 (66.7%)
────────────────────────────────────────────────────────────
案例研究 2:1200 万像素图像(istanbul2.jpg)
4096×3072,2.2 MB。
| 运行方式 | 输出 | 文件大小 | Claude 4.7+ tokens | GPT-6 tokens | Gemini tokens |
|---|---|---|---|---|---|
| 无预算(0.7 之前的默认值) | 3584×2560 | −40% | 4,661 → 4,698 | 2,942 → 2,924(−1%) | 6,192 → 5,160(−17%) |
--max-tokens 1600(MCP 默认值) | 1288×952 | −88% | 4,661 → 1,564(−66%) | 2,942 → 1,476(−50%) | 6,192 → 1,032(−83%) |
--max-tokens 1000 | 1036×756 | −92% | 4,661 → 999(−79%) | 2,942 → 951(−68%) | 6,192 → 516(−92%) |
--max-tokens 1600 --model gpt6 | 1344×992 | −87% | 4,661 → 1,728(−63%) | 2,942 → 1,563(−47%) | 6,192 → 1,032(−83%) |
--max-tokens 1600 --model gemini | 2304×1536 | −71% | 4,661 → 4,565(−2%) | 2,942 → 2,880(−2%) | 6,192 → 1,548(−75%) |
vision-squeezer data/istanbul2.jpg --max-tokens 1600
Input: 4096×3072 (2.2 MB)
Output: 1288×952 (0.3 MB, JPG q75)
File: 87.9% smaller
── Token Estimates ─────────────────────────────────────────
Model Before After Saved
------------------------------------------
Claude 4.7+ 4661 1564 3097 (66.4%)
GPT-6 2942 1476 1466 (49.8%)
GPT-4o 765 1105 0 (0.0%)
GPT-5 630 910 0 (0.0%)
Gemini 6192 1032 5160 (83.3%)
────────────────────────────────────────────────────────────
如何解读这些数字
- 关闭预算,token 几乎没有变化。 Claude 4.7+ 已将图像上限设为 4,784 tokens,因此原图为 4,661 tokens 时,处理后可能反而达到 4,698。压缩后的文件更小了,但费用没有减少。
- 两张照片使用
--max-tokens 1600,Claude tokens 减少约 66%,GPT-6 减少约 50%,同时保留构图、色彩和大号文字。最先损失的是精细细节(远处的窗户、小标牌)。 - 预算按目标模型衡量,未指定时使用 Claude。使用相同的 1600 并指定
--model gemini,结果会落在 Gemini 的 768px 瓦片网格上(1,032 tokens),文件大小列也会相应变化。 - 根据内容选择预算。 1600 和 1000 能让视网膜屏幕代码截图中的正文保持清晰可读;600 则不行。在命令行中传入
--max-tokens 0(或省略该参数)即可关闭上限。 - 颜色不会被移除。
auto模式的表现与standard相同;只有显式指定--mode ocr时才会输出黑白图像。
当前模型合理性检查
| 配置 | 输入 | 估算 tokens |
|---|---|---|
| GPT-6 / GPT-5.6 | 1024×1024 | 1,229 |
| GPT-6 / GPT-5.6 | 2048×2048 | 超过 2,500-patch 上限后为 3,000 |
| Claude 4.7+ | 1000×1000 | 1,296 |
| 旧版 GPT-5 / 5.1 | 1024×1024 | 630 |
MCP 工具:optimize_image
| 参数 | 类型 | 必填 | 默认值 |
|---|---|---|---|
image_path | string | 二选一 | —(优先从本地读取,优化后的副本也会写入临时文件) |
image_base64 | string | 二选一 | — |
mode | "auto" | "standard" | "ocr" | — | "auto" |
output_format | "jpeg" | "webp" | — | "jpeg" |
quality | integer 1–100 | — | 75 |
tile_size | integer | — | 512 |
crop | boolean | — | true |
bg_tolerance | integer 0–255 | — | 15 |
max_tokens | integer | — | 1600(0 表示不设上限) |
max_tiles | integer | — | — |
target_model | string enum | — | 核心模型以及 glm、pixtral、gemma、internvl、minicpm、molmo、aya、phi4、granite、llava、falcon、minimax、step、ling、voyage |
**响应:**一个包含优化后图像的 MCP image 块,随后是一个简短报告文本块。图像绝不会以 base64 的形式出现在文本中:模型会将其读取为文本 token,成本会高于它所替代的图像。
{
"width": 1344,
"height": 924,
"output_path": "/tmp/vision-squeezer/shot-1a2b3c4d.jpg",
"tokens_before": 4674,
"tokens_after": 1584,
"savings_report": {
"tiles_before": 4674,
"tiles_after": 1584,
"tiles_saved": 3090,
"token_reduction_pct": "66.1",
"size_reduction_pct": "67.5"
}
}
如果输入为 image_path,则会设置 output_path。
节省 Token 的场景
只有更小的图像实际传到模型时,这项优化才有用。具体来说:
| 图像传到模型的方式 | 是否优化? |
|---|---|
Claude Code 读取项目中的图像文件(Read) | 是,由插件自带的图像读取钩子处理(install --client claude) |
Agent 使用 image_path 调用 optimize_image | 是,任何文件夹中的图像都可以。请在 CLAUDE.md / AGENTS.md 中告知 Agent 使用此工具 |
| 将图像粘贴或拖入聊天 | 否。 客户端会在任何工具或钩子运行之前附加图像 |
使用 @path 附加文件 | 否。 不会发生工具调用,因此不会触发钩子 |
基准情况很重要。 Claude Code 在发送大图之前已经会缩小图像:在我们的测试中,一个 2400×1670 的文件传到模型时变成了 1999×1392。在此基础上,1600 Token 的预算在 istanbul.jpg 上节省约 56%,而不是与原始文件相比测得的 66%。
本 README 中的 Token 数量是根据各提供商公布的规则估算得出的。对于 Claude,我们使用 Anthropic 的 count_tokens 端点(claude-sonnet-5-5,仅图像 Token)进行了验证:
发送的 istanbul.jpg | 尺寸 | 估算值 | 实际值 |
|---|---|---|---|
| 原始文件 | 2400×1670 | 4,674 | 4,759 |
| Claude Code 缩小后的副本 | 1999×1391 | 3,600 | 3,603 |
--max-tokens 1600 | 1344×924 | 1,584 | 1,587 |
与 Claude Code 发送的图像相比,实际节省量为 3,603 → 1,587(−56%);与原始图像相比,则为 4,759 → 1,587(−67%)。GPT 和 Gemini 的估算值尚未通过其 API 验证。
| 客户端 | 图像读取钩子 | 状态 |
|---|---|---|
| Claude Code | 是,针对 Read 的 PreToolUse(插件) | 已在实际会话中测试 |
| Cursor | 是,针对 Read 的 preToolUse + updated_input(hooks.json) | 遵循 Cursor 文档,未在应用中测试 |
| Gemini CLI | 是,针对 read_file 的 BeforeTool(settings.json) | 遵循 Gemini 文档,未在应用中测试。Google 于 2026-06-18 为免费用户和 Google One 用户以 Antigravity CLI 替代了 Gemini CLI |
| OpenCode | 是,在 read 的 tool.execute.before 上运行的插件 | 遵循 OpenCode 文档,未在应用中测试 |
| Codex CLI | 否。钩子可以重写调用,但 Codex 文档中没有列出图像读取工具路径 | 仅 MCP 工具 |
| Windsurf | 否。pre_read_code 只能阻止操作 | 仅 MCP 工具 |
| VS Code Copilot | 否。文档中没有说明如何重写工具输入 | 仅 MCP 工具 |
| Kimi CLI | 否。PreToolUse 会显示输入,但文档中没有描述重写方式 | 仅 MCP 工具 |
| Qwen Code、Claude Desktop | 未检查/没有钩子系统 | 仅 MCP 工具 |
“仅 MCP 工具”表示 Agent 必须自行使用 image_path 调用 optimize_image;请在 AGENTS.md 中告知它这样做。Cursor、Gemini CLI 和 OpenCode 的钩子会将副本保存在项目内自动忽略的 .vision-squeezer/ 文件夹中,因为这些客户端限制只能读取工作区内的文件。
将截图保存到项目中(例如 screenshots/),并通过路径引用,即可节省 Token。钩子只会重写项目内的文件:它会返回允许决定,因此不得打开普通 Read 原本会询问是否允许访问的文件。
配置参考
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
quality | u8 1–100 | 75 | JPEG/WebP 输出质量 |
tile_size | u32 | 512 | 自定义网格大小;设置 target_model 时忽略 |
crop | bool | true | 移除纯色填充边框 |
bg_tolerance | u8 0–255 | 15 | 背景检测的最大通道差值 |
output_format | jpeg/webp | jpeg | 输出编码。WebP 文件小约 30-50% |
max_tiles | u32 | — | 瓦片数量上限(渐进式缩小) |
max_tokens | u32 | — | Token 预算,使用 target_model 进行估算(未设置时使用 Claude);持续缩小图像直至符合预算,0 表示禁用 |
target_model | string | — | 感知模型的配置;当前 OpenAI 模型使用 gpt6 |
支持的模型
平台支持
预编译的 MCP 二进制文件支持 Linux x86_64/ARM64、macOS Apple Silicon/Intel 和 Windows x86_64/ARM64。Python wheel 支持 Linux x86_64/ARM64、macOS Apple Silicon/Intel 和 Windows x86_64。不受支持的 Python 架构可通过 pip install --no-binary vision-squeezer vision-squeezer 从源代码安装。
| 模型 | 图块大小 | 预缩放 | Token 公式 |
|---|---|---|---|
| GPT-6 / GPT-5.6 | 32×32 个图块 | 边缘 2048px / 2500 个图块 | ceil(屏块数 × 1.2) |
| Claude 4.7+ 高分辨率 | 28×28 个图块 | 边缘 2576px / 4784 个图块 | 每个图块 1 个 token |
| Claude 标准 | 28×28 个图块 | 边缘 1568px / 1568 个图块 | 每个图块 1 个 token |
| GPT-4o / GPT-4.5(旧版) | 512×512 | 适配 2048px → 短边缩放至 768px | 85 + 图块数 × 170 |
| GPT-5 / GPT-5.1(旧版) | 512×512 | 适配 2048px → 短边缩放至 768px | 70 + 图块数 × 140 |
| Gemini 3 | 768×768 | ≤384×384 时采用固定档位 | 每个图块 258 |
| DeepSeek Flash | 由提供方管理 | 最多 384 个图像 token | 保守上限为 384 个 token |
| Kimi K2.5/K2.6/K3 | 原生分辨率 | 由提供方指定 | 参考性 28px 估算 |
| GLM、Pixtral/Mistral、Gemma、InternVL | 由提供方指定 | 由提供方指定 | 参考性通用配置 |
| MiniCPM、Molmo、Aya、Phi-4、Granite | 由提供方指定 | 由提供方指定 | 参考性通用配置 |
| LLaVA、Falcon、MiniMax、Step、Ling、Voyage | 由提供方指定 | 由提供方指定 | 参考性通用配置 |
高级功能
持久化与分析
VisionSqueezer 会在本地跟踪每次优化,并存储到 ~/.vision-squeezer/stats.db。
vision-squeezer stats
── VisionSqueezer Analytics ────────────────────────────────
Total Optimizations: 42
Total Tokens Saved: 842,500
Total Bytes Saved: 156.40 MB
Estimated USD Saved: $2.11
────────────────────────────────────────────────────────────
Shell 钩子与 Claude Code Skills
添加到 .zshrc / .bashrc:
eval "$(vision-squeezer setup-hook)"
这会一次性安装两项内容:
squeeze别名 — 一步完成优化并捕获输出路径:img_path=$(squeeze data/logo.png --model gemini)- Claude Code Skills — 首次运行时自动写入
~/.claude/skills/
可用 Skills
| Skill | 触发方式 | 功能 |
|---|---|---|
vision-stats | /vision-stats | 显示累计 token 和字节节省量 — 读取本地 stats.db,不产生 MCP 开销 |
vision-doctor | /vision-doctor | 检查已安装版本与最新 npm 发行版的差异;若版本过旧,则显示更新命令 |
vision-upgrade | /vision-upgrade | 检测安装方式(cargo/npm/npx)并运行相应的升级命令 |
输出示例:
/vision-stats
── VisionSqueezer Analytics ────────────────────────────────
Total Optimizations: 42
Total Tokens Saved: 842,500
Total Bytes Saved: 156.40 MB
Estimated USD Saved: $2.11
────────────────────────────────────────────────────────────
/vision-doctor
## VisionSqueezer Doctor
- [x] Binary found: /usr/local/bin/vision-squeezer
- [x] Installed version: 0.1.8
- [x] Latest version (npm): 0.1.8
- [x] Status: Up to date
Marketplace 安装(setup-hook 的替代方式):
添加到 ~/.claude/settings.json:
{
"extraKnownMarketplaces": {
"vision-squeezer": {
"source": { "source": "github", "repo": "eralpozcan/vision-squeezer" }
}
}
}
然后在 Claude Code 中运行 /plugins add vision-stats@vision-squeezer、/plugins add vision-doctor@vision-squeezer 或 /plugins add vision-upgrade@vision-squeezer。
沙盒模式:“用代码思考”
在图像到达大模型之前,先在本地执行原子操作。Agent 决定如何处理图像;中间步骤不消耗任何 token。
CLI:
vision-squeezer screenshot.png --ops '[{"op":"crop","x":10,"y":20,"width":500,"height":500},{"op":"binarize"}]'
MCP 工具 — sandbox_execute:
| 参数 | 类型 | 说明 |
|---|---|---|
image_base64 | string | 输入图像 |
operations | array | 要按顺序应用的操作列表 |
支持的操作:crop、grayscale、binarize、resize、contrast、brightness。
爬虫集成
可在任何 Playwright/Puppeteer 抓取工作流中即时优化图像 — 原始截图不会浪费 API token。
await page.route('**/*.{png,jpg}', async (route) => {
const response = await route.fetch();
const body = await response.body();
const optimized = await squeeze(body); // pipe through vision-squeezer
route.fulfill({ body: optimized });
});
参与贡献
欢迎提交 PR。设置说明和指南请参阅 CONTRIBUTING.md。 请遵守我们的 行为准则。
许可证
Elastic License 2.0(ELv2)— 详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。