Skip to main content
Glama
Jsliu28
by Jsliu28
README.md
# opencode-vision-mcp

给**不支持多模态的模型**(如 DeepSeek)提供"看图"能力的完整解决方案:**vision MCP server + opencode 粘贴落盘插件**。

让 DeepSeek 等纯文本模型也能直接看懂你粘贴/引用的图片:

```
你在对话框粘贴图片
  ↓ 插件 vision-paste.js 拦截(chat.message hook)
图片自动落盘到本地文件
  ↓ 插件把图片 part 改写为"仅模型可见"的路径指引
模型读到路径 → 调用 vision_analyze_image 工具
  ↓ vision MCP server 读取图片 → 转发给多模态后端
通义千问 Qwen-VL / 豆包 / GLM-4V 返回文字描述
  ↓
模型把识别结果转达给你
```

**图片字节全程不进入主模型上下文**——主模型只接触"路径字符串"和"文字描述",不会被 base64 污染。

---

## 功能特性

- 🖼️ **粘贴即识别**:opencode 对话框直接粘贴图片,自动落盘并识别,无需手动保存路径
- 🔄 **多后端可切换**:通义千问 Qwen-VL / 豆包 / GLM-4V,环境变量切换或单次调用覆盖
- 🧮 **结果缓存**:同图同参数重复识别直接命中缓存,节省 API 费用(默认 128 条 / 1 小时)
- 🔁 **自动重试**:429 限流 / 5xx 服务端错误指数退避重试(默认 2 次)
- 🖼️ **多图对比**:一次传入多张图片做对比分析
- 🔒 **Key 安全**:API key 仅存本地 `.env`,不进入代码库

---

## 目录结构

```
opencode-vision-mcp/
├── server.py              # vision MCP server 主程序(stdio 传输)
├── plugins/
│   └── vision-paste.js    # opencode 插件:粘贴图片自动落盘
├── requirements.txt       # Python 依赖
├── .env.example           # 环境变量模板
├── README.md              # 本文件
└── LICENSE                # MIT
```

---

## 安装

### 1. 环境要求

- Python >= 3.10
- opencode(仅插件需要)
- 至少一个多模态后端的 API key(见下表)

### 2. 克隆并安装 MCP server

```bash
git clone https://github.com/Jsliu28/opencode-vision-mcp.git
cd opencode-vision-mcp

# 创建虚拟环境并安装依赖
python -m venv .venv
# Windows:
.\.venv\Scripts\Activate.ps1
# macOS/Linux:
source .venv/bin/activate

pip install -r requirements.txt

# 配置 API key
cp .env.example .env
# 编辑 .env,填入你的 key(见下节)
```

### 3. 配置 API key

复制 `.env.example` 为 `.env` 后填写。**至少配置一个后端**即可;配置多个后可用 `provider` 参数切换。

| 标识 | 名称 | API key 环境变量 | 默认模型 |
|------|------|-----------------|----------|
| `qwen` | 通义千问 Qwen-VL | `DASHSCOPE_API_KEY` | qwen-vl-max |
| `doubao` | 火山方舟豆包 | `ARK_API_KEY` | doubao-1-5-vision-pro-32k-250115 |
| `zhipu` | 智谱 GLM-4V | `ZHIPU_API_KEY` | glm-4v-plus |

Key 申请地址:
- 通义千问:<https://bailian.console.aliyun.com/>
- 火山方舟:<https://console.volcengine.com/ark>
- 智谱:<https://open.bigmodel.cn/>

### 4. 安装 opencode 插件

把 `plugins/vision-paste.js` 复制到 opencode 插件目录:

```bash
# Windows
copy plugins\vision-paste.js %USERPROFILE%\.config\opencode\plugins\

# macOS/Linux
cp plugins/vision-paste.js ~/.config/opencode/plugins/
```

重启 opencode 生效。

---

## 配置到 opencode

编辑 `~/.config/opencode/opencode.json`:

```json
{
  "mcp": {
    "vision": {
      "type": "local",
      "command": ["python", "C:/你的路径/opencode-vision-mcp/server.py"],
      "enabled": true,
      "environment": {
        "VISION_DEFAULT_PROVIDER": "qwen"
      }
    }
  }
}
```

> 说明:API key 在 `.env` 中,server 启动时会自动读取,无需重复配置在 `environment` 里(如同时存在,`environment` 优先)。
> 如果 `python` 不在 PATH 中,使用虚拟环境解释器绝对路径,如 `C:/你的路径/opencode-vision-mcp/.venv/Scripts/python.exe`。

---

## 使用示例

### 在 opencode 对话框中

```
你:粘贴一张图片(或拖拽文件生成 @ 路径)
    "这张图里有什么?"

opencode:自动识别并返回图片描述
```

```
你:粘贴两张图片
    "对比这两张截图有什么不同?"

opencode:多图对比分析
```

### 直接传路径 / URL

```
你:分析 C:/Users/me/photo.png
你:识别 https://example.com/cat.jpg
```

### 指定后端 / 模型

```
你:用豆包分析这张图 C:/Users/me/photo.png
```

---

## 工具说明

### vision_analyze_image
分析一张或多张图片,返回文字描述。参数:

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `images` | `string[]` | ✅ | 图片引用**列表**(1 张或多张),每项为本地**绝对路径**或 http(s) URL |
| `prompt` | `string` | ❌ | 对图片的问题/指令,默认"详细描述图片内容,多张时对比分析" |
| `provider` | `string` | ❌ | `qwen` / `doubao` / `zhipu`,覆盖默认后端 |
| `model` | `string` | ❌ | 具体模型名,留空用该后端默认模型 |
| `temperature` | `number` | ❌ | 0~2,默认 0.3 |

### vision_list_providers
列出当前各后端配置状态(是否已填 API key)与可用模型。

---

## 环境变量

| 变量 | 默认值 | 说明 |
|------|--------|------|
| `VISION_DEFAULT_PROVIDER` | `qwen` | 默认后端:qwen / doubao / zhipu |
| `DASHSCOPE_API_KEY` | - | 通义千问 key |
| `ARK_API_KEY` | - | 火山方舟 key |
| `ZHIPU_API_KEY` | - | 智谱 key |
| `VISION_CACHE_ENABLED` | `true` | 是否启用结果缓存 |
| `VISION_CACHE_SIZE` | `128` | 缓存最大条数 |
| `VISION_CACHE_TTL` | `3600` | 缓存有效期(秒) |
| `VISION_MAX_RETRIES` | `2` | 失败重试次数 |
| `VISION_RETRY_BASE_DELAY` | `1.0` | 首次重试等待秒数(之后指数翻倍,上限 10s) |

---

## 常见问题

**Q: 粘贴图片后没有任何反应?**
A: 确认插件已放入 `~/.config/opencode/plugins/` 并重启 opencode;确认 vision MCP 已启用(`/mcp` 查看)。

**Q: 提示"后端未配置"?**
A: 检查 `.env` 中对应 key 是否填写正确,`vision_list_providers` 可查看配置状态。

**Q: 图片能上传但识别失败?**
A: 单张图片限制 20MB;本地路径必须是绝对路径;URL 需可公开访问(部分网站有防盗链)。

**Q: 识别结果能缓存吗?**
A: 默认开启。同图同参数(含 prompt/temperature)重复调用直接命中缓存。

**Q: API key 会泄露到代码库吗?**
A: 不会。`.env` 已被 `.gitignore` 排除,key 仅存本地。

---

## License

[MIT](./LICENSE)