mcpField
V
vision-squeezer

vision-squeezer

本地服务
github.com/eralpozcanAI 与智能体26 天前更新

关于 vision-squeezer

VisionSqueezer 是用于缩减图像以适配视觉模型令牌预算的库、CLI 和 MCP 服务,面向处理代码、文件或工具图像的开发者与 Agent;不处理直接附加到聊天中的图像。

主要功能

  1. 01按令牌预算缩减图像
  2. 02按模型估算令牌用量
  3. 03裁剪和调整图像尺寸
  4. 04批量处理图像目录
  5. 05提供 HTTP 图像优化端点
  6. 06安装器配置受支持的客户端

适用场景

  1. 01优化截图以供 Agent 分析
  2. 02准备发送给视觉模型 API 的图像
  3. 03批量处理图像文件夹
  4. 04在 HTTP 工作流中加入图像优化

MCP 相关

MCP 服务允许兼容客户端优化 Agent 传入的图像,例如文件或工具输出;不处理直接附加到聊天界面的图像。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"eralpozcan-vision-squeezer": {
"command": "npx",
"args": [
"-y",
"vision-squeezer"
]
}
}
}
启动命令npx -y vision-squeezer

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmvision-squeezer0.9.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

VisionSqueezer 徽标

VisionSqueezer

构建 crates.io npm 许可证

在图像到达模型之前,将其调整到视觉大模型的 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 传给它的图像。

Vision Squeezer MCP 服务


安装

每个客户端只需一条命令(推荐)
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 的请求体发送。选项通过查询字符串传递:

参数默认值
modelclaude用于适配和估算的模型别名(gpt6、gemini 等)
max_tokens1600Token 预算,0 表示禁用
formatjpegjpeg、webp 或 avif
quality751–100
modeautoauto、ocr 或 standard
croptruefalse 表示保留边缘填充
responseimagejson 会返回报告以及以 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+ tokensGPT-6 tokensGemini tokens
无预算(0.7 之前的默认值)2048×1536−29%4,674 → 4,070(−13%)2,903 → 2,9423,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 10001064×728−79%4,674 → 988(−79%)2,903 → 939(−68%)3,096 → 516(−83%)
--max-tokens 1600 --model gpt61408×960−65%4,674 → 1,785(−62%)2,903 → 1,584(−45%)3,096 → 1,032(−67%)
--max-tokens 1600 --model gemini2304×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+ tokensGPT-6 tokensGemini tokens
无预算(0.7 之前的默认值)3584×2560−40%4,661 → 4,6982,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 10001036×756−92%4,661 → 999(−79%)2,942 → 951(−68%)6,192 → 516(−92%)
--max-tokens 1600 --model gpt61344×992−87%4,661 → 1,728(−63%)2,942 → 1,563(−47%)6,192 → 1,032(−83%)
--max-tokens 1600 --model gemini2304×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.61024×10241,229
GPT-6 / GPT-5.62048×2048超过 2,500-patch 上限后为 3,000
Claude 4.7+1000×10001,296
旧版 GPT-5 / 5.11024×1024630

MCP 工具:optimize_image

参数类型必填默认值
image_pathstring二选一—(优先从本地读取,优化后的副本也会写入临时文件)
image_base64string二选一—
mode"auto" | "standard" | "ocr"—"auto"
output_format"jpeg" | "webp"—"jpeg"
qualityinteger 1–100—75
tile_sizeinteger—512
cropboolean—true
bg_toleranceinteger 0–255—15
max_tokensinteger—1600(0 表示不设上限)
max_tilesinteger——
target_modelstring 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×16704,6744,759
Claude Code 缩小后的副本1999×13913,6003,603
--max-tokens 16001344×9241,5841,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 原本会询问是否允许访问的文件。

配置参考

参数类型默认值说明
qualityu8 1–10075JPEG/WebP 输出质量
tile_sizeu32512自定义网格大小;设置 target_model 时忽略
cropbooltrue移除纯色填充边框
bg_toleranceu8 0–25515背景检测的最大通道差值
output_formatjpeg/webpjpeg输出编码。WebP 文件小约 30-50%
max_tilesu32—瓦片数量上限(渐进式缩小)
max_tokensu32—Token 预算,使用 target_model 进行估算(未设置时使用 Claude);持续缩小图像直至符合预算,0 表示禁用
target_modelstring—感知模型的配置;当前 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.632×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 → 短边缩放至 768px85 + 图块数 × 170
GPT-5 / GPT-5.1(旧版)512×512适配 2048px → 短边缩放至 768px70 + 图块数 × 140
Gemini 3768×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_base64string输入图像
operationsarray要按顺序应用的操作列表

支持的操作: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。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。