Ctrl+V 粘贴截图: Claude Code + DeepSeek 直接烂对话?这个开源项目把坑填了
在AI CLI工具与不支持多模态的模型配合使用时,直接粘贴剪贴板中的图片会引发系统硬编码指令,导致对话中断。本项目的两层防线设计——图片整流器与图片分析技能——能巧妙拦截并处理图片输入,保障对话流程的顺畅。
为什么需要本项目?
AI CLI工具搭配第三方模型时,常因模型不支持多模态而出现图片理解真空地带。这是Claude Code、OpenCode等工具使用DeepSeek等不支持多模态模型时最令人困扰的问题。
传统方案的困境
常见的应对方式是在全局CLAUDE.md中制定规则,强制要求调用特定Skill或MCP处理图片。然而,Claude Code在系统层面硬编码了相关指令——每当粘贴图片时,必定调用read工具直接将图片发送给模型。这个系统指令的优先级高于CLAUDE.md,因此用户制定的规则无法阻止这一行为。
结果就是:通过Ctrl+V粘贴一张截图后,模型接收到base64图片数据,随即报错或输出混乱信息,导致整段对话无法继续。更糟糕的是,调试过程中我们通常不会先将截图保存为本地文件再上传——直接截图、粘贴到剪贴板、再通过Ctrl+V发送才是自然的工作流。传统方案仅适用于“先保存文件,再提供路径”的场景,与实际使用习惯完全脱节。
本项目的解决方案
图片整流器与图片分析技能共同构建了两层防线,有效应对这一问题。
| 场景 | 传统方案 | 本项目 |
|---|---|---|
| Ctrl+V粘贴剪贴板图片到Claude Code | ❌ 系统硬编码read,直接发送给模型,对话崩溃 | ✅ 整流器在袋里层拦截,替换为文本提示,引导模型调用Skill |
| 给定图片文件路径 | ⚠️ CLAUDE.md规则勉强可用,但不同CLI行为不一致 | ✅ 整流器统一拦截,不依赖MD文件规则 |
| OpenCode粘贴剪贴板图片 | ❌ OpenCode不生成临时文件,无法获取路径 | ✅ Skill脚本自动检测:有路径则读取文件,无路径则从剪贴板直接读取 |
| 多Provider切换 | ❌ 单个模型故障后对话中断 | ✅ Fallback机制,支持30多个Provider自动切换 |
两层防线的分工
图片整流器(袋里层)在请求发出前进行拦截。它检测messages中的base64图片块,移除原始数据并替换为文本提示,引导模型调用Skill。这一过程在模型收到请求之前已完成。
图片分析技能(CLI工具)被模型调用后,智能判断图片来源:若传入本地路径则读取文件,若无路径则从系统剪贴板直接读取。该技能兼容Claude Code(粘贴生成临时文件)和OpenCode(粘贴不生成临时文件)两种行为模式。
原项目简介
CC Switch是一款管理AI CLI工具(Claude Code、Codex、Gemini CLI、OpenCode、OpenClaw、Hermes)的桌面应用,提供供应商管理、袋里/故障转移、MCP/Skills管理和用量统计等功能。本分支在其基础上新增了图片输入处理功能,解决了大量第三方API供应商不支持多模态(视觉理解)的问题。
本分支新增功能
1. 图片整流器
解决的问题:大量第三方API供应商(中转站、非官方接口)不支持多模态输入。当请求的messages数组中出现type: "image"的base64图片块时,这些供应商会报错或行为异常。
解决方案:图片整流器是袋里层的拦截器,在请求转发之前运行。它扫描messages[*].content,检测type: "image"块,移除base64数据(通常数MB),并替换为文本提示,引导模型调用指定skill处理图片。
关键特性:
- 自动检测并替换messages中的
type: "image"块 - 存在图片缓存引用时自动提取文件路径拼入提示
- 可配置调用的skill名称(默认:
image-analysis) - 与下方的图片分析技能无缝配合
配置方式:路由设置→整流器区域→图片整流器。打开开关,可按需修改skill名称。
2. 图片分析技能
一个独立的Python命令行图片视觉识别工具,兼容任何能执行Shell命令的AI CLI。
核心能力:
- 支持本地图片(jpg/png/gif/webp/bmp)、网络图片URL、系统剪贴板(macOS AppleScript)
- 多图对比(多次
--image) - Fallback机制:按配置顺序依次尝试所有provider,失败时自动切换,第一个成功的结果标注
[provider名]后返回
预置30多个AI Provider:
| 平台 | 代表模型 |
|---|---|
| 火山引擎 | 豆包Seed 2.0 Pro/Lite/Mini、Vision 250815 |
| 硅基流动 | Qwen3.6-35B-A3B、Qwen3.6-27B |
| 阿里百炼 | Qwen3.6 Plus/Flash、Qwen3.5 Omni、Kimi K2.6、MiniMax M2.5 |
| 智谱 | GLM-4.6V-Flash |
| 商汤 | SenseNova-6.7-Flash-Lite |
与图片整流器的联动:当某模型不支持图片时,整流器会将图片块替换为文本提示,引导模型调用Skill,模型自动通过CLI完成实际视觉分析。整个过程对用户透明,无需手动执行Python脚本。
3. dev.sh — 开发启动脚本
封装pnpm tauri dev / pnpm tauri build的便捷脚本:
./dev.sh # Debug模式(默认)
./dev.sh debug # Debug模式(含请求体打印)
./dev.sh release # Release模式
./dev.sh build # Release编译
预置了CARGO_HTTP_PROXY,方便国内网络环境下编译Rust依赖。
安装
从源码编译:
git clone https://github.com/piaomiaoguying/cc-switch.git
cd cc-switch
./dev.sh build
使用流程
第一步:注册AI Provider并获取API Key
本Skill预置了多个平台的视觉模型,均有免费额度,挑选自己习惯的平台注册即可:
| 平台 | 代表模型 |
|---|---|
| 阿里百炼 | Qwen3.6 Plus/Flash、Qwen3.5 Omni等 |
| 智谱 | GLM-4.6V-Flash |
| 硅基流动 | Qwen3.6-35B-A3B等 |
| 火山引擎 | 豆包Seed 2.0 Pro/Lite/Mini |
| 商汤 | SenseNova-6.7-Flash-Lite |
注册后获取API Key,填入Skill配置文件:
cp skills/image-analysis/scripts/config.example.json skills/image-analysis/scripts/config.json
# 编辑config.json,将各个平台的API Key填入对应字段
第二步:配置全局CLAUDE.md
在你的全局CLAUDE.md(~/.claude/CLAUDE.md)中加入以下规则,禁止直接使用read工具读取图片:
## 图片处理规范
禁止使用 read 工具读取任何图片文件(如 .png, .jpg, .jpeg)
必须使用 image-analysis 这个 skill 来分析图片
当模型返回不支持直接接收图片输入时,自动调用 image-analysis 这个 skill 来分析图片
第三步:导入Skill到AI CLI
推荐通过CC Switch统一管理Skill,避免手动复制文件夹:
- 将
skills/image-analysis配置文件夹放在CC Switch目录下 - 打开CC Switch→Skills管理
- 在Claude Code和OpenCode对应的Skill开关处,开启
image-analysis
这样CC Switch会自动将Skill同步到各CLI的Skill目录。
第四步:配置CC Switch路由与整流器
这是最关键的一步,需要打开三层开关:
① 打开本地路由
进入CC Switch→路由设置:
- 打开本地路由总开关
- 打开Claude Code的路由开关(常见漏掉:总开关开了但Claude Code开关没开)
② 配置图片整流器
在路由设置界面往下滑,找到整流器区域:
- 打开整流器总开关
- 打开图片整流器开关
- 在Skill名称输入框中填入
image-analysis
完成
以上配置完成后,正常的Claude Code实例通常会立即生效。如果老的实例没有生效,重新启动一个新的Claude Code实例即可。此时模型的网络请求会经过CC Switch袋里,CC Switch会对会话数据进行拦截修改:
之后的整体流程为:
Ctrl+V粘贴图片 → CC Switch袋里拦截 → 移除base64,替换为文本提示→ 模型收到文本,调用image-analysis Skill → Skill读取图片并返回分析结果
通过上述配置,CC Switch能够自动拦截所有图片请求,将其转换为文本提示并引导模型调用图片分析技能,从而在不支持多模态的模型环境下顺利实现图片分析功能。用户无需手动干预,即可在多种CLI工具中享受流畅的图片处理体验。