# Desktop Vision

> Desktop 版识图能力——通过 vision.mjs 间接调用智谱 GLM-4V-Flash 免费视觉模型识别图片。当用户在 Claude Desktop（Cowork）中发送图片时触发，因 Desktop 环境无法走网关代理层，需通过沙箱 bash 执行本地脚本完成识别。触发词：识图、看图片、图片识别、这是啥、看图、识别图片、图片里是什么、[Unsupported Image]。

- Skill: `shaobin666/desktop-vision` (Agent Skill)
- Install (CLI): `npx skillmds@latest add shaobin666/desktop-vision`
- Raw SKILL.md: https://api.skillmd.com/api/skills/shaobin666/desktop-vision/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: shaobin666 (https://skillmd.com/u/shaobin666)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/shaobin666/desktop-vision

---


# Desktop 版识图（智谱 GLM-4V-Flash）

## 一句话架构

```
Claude Desktop（纯文本模型 Fable 5）
    │  用户发图 → 图片落入沙箱 uploads 目录
    │  agent 检测到图片 → 在沙箱 bash 中执行 vision.mjs
    │  vision.mjs → 智谱 GLM-4V-Flash API（免费视觉模型）
    │  识别结果文本 → agent 回复用户
    └── 注意：Desktop 不走 ANTHROPIC_BASE_URL 代理，网关拦截方案无效
```

## 为什么 Desktop 环境不同

网关（`gateway.mjs`）的设计依赖 Claude Code CLI 的 `ANTHROPIC_BASE_URL` 代理机制——CLI 发起的 API 请求会先经过 `127.0.0.1:8787`，网关判断最新消息是否有图来决定路由。但 **Claude Desktop（Cowork）的 API 调用直连后端服务器**，不经过本地代理，所以网关对该环境无效。

Desktop 下的替代方案是：agent 在沙箱的 Linux VM 中直接执行 `vision.mjs` 脚本，绕过代理层，直调智谱视觉 API。

## 前置条件

| 条件 | 说明 |
|---|---|
| Node.js ≥ 18 | 沙箱环境自带，无需额外安装 |
| `.env` 文件 | `D:\shaobin-codex\激素检测\deepseek-vision-gateway\.env`，含 `VISION_API_KEY`（智谱 key）和 `VISION_MODEL`（默认 `glm-4v-flash`） |
| 智谱 API key | [open.bigmodel.cn](https://open.bigmodel.cn) 免费申请，`glm-4v-flash` 免费用 |

## 工作流

用户发送图片后，agent 执行以下步骤：

### 1. 检测图片

图片上传后自动存入沙箱的 uploads 目录，路径形如：
```
/sessions/<session-id>/mnt/uploads/<uuid>_image.png
```

agent 通过检查对话中的 `[Unsupported Image]` 标记或直接 `ls` uploads 目录确认有新图到达。

### 2. 执行识图脚本

```bash
node /sessions/<session-id>/mnt/激素检测/deepseek-vision-gateway/vision.mjs "/sessions/<session-id>/mnt/uploads/<图片文件名>"
```

`vision.mjs` 位于 `D:\shaobin-codex\激素检测\deepseek-vision-gateway\vision.mjs`，是一个零依赖、纯 Node 脚本。

### 3. 返回结果

脚本输出：
- 标准输出：自然语言描述的图片内容
- 用量信息：`prompt_tokens` 和 `completion_tokens`

agent 将识别结果直接回复用户。

## vision.mjs 核心逻辑

```javascript
// 1. 从同目录 .env 读取 VISION_API_KEY 和 VISION_MODEL
// 2. 读取图片文件，转 base64
// 3. 构造 OpenAI 格式请求：
//    POST https://open.bigmodel.cn/api/paas/v4/chat/completions
//    { model: "glm-4v-flash", messages: [{ role: "user", content: [
//      { type: "text", text: "请仔细观察这张图片..." },
//      { type: "image_url", image_url: { url: "data:image/png;base64,..." } }
//    ] }], max_tokens: 1024 }
// 4. 原生 fetch，无第三方依赖
```

## 已知限制

| 限制 | 说明 |
|---|---|
| **免费档精度** | `glm-4v-flash` 大类稳、小类看运气、被追问会编造。需要高精度可改 `.env` 中 `VISION_MODEL=glm-4v-plus`（付费） |
| **输出上限** | 智谱 API 限制 `max_tokens=1024`，复杂图片可能截断 |
| **免费限流** | 约 100 RPM，超限报错 |
| **不上传环境变量** | `vision.mjs` 从 `.env` 读取密钥，不依赖环境变量，确保沙箱隔离下仍可工作 |
| **图片路径** | 必须使用沙箱内的 Linux 路径（`/sessions/...`），不能使用 Windows 路径（`D:\...`） |
| **不能自动触发** | Desktop 下 agent 无原生识图能力，每次需手动检测上传目录并执行脚本 |

## 运维

```bash
# 检查智谱 API 是否可达（沙箱内执行）
node -e "
const resp = await fetch('https://open.bigmodel.cn/api/paas/v4/chat/completions', {
  method: 'POST',
  headers: { 'content-type': 'application/json', authorization: 'Bearer <key>' },
  body: JSON.stringify({ model: 'glm-4v-flash', messages: [{ role: 'user', content: 'hi' }], max_tokens: 5 }),
});
console.log(resp.status);
"

# 手动测试识图
node <网关目录>/vision.mjs <图片路径>
```

## 备选方案

如果要对精度要求高的场景，推荐切到 Claude Code CLI 模式——它通过 `ANTHROPIC_BASE_URL` 走网关代理，支持流式 SSE、工具调用转换等高级特性，整体体验更无缝。详见网关仓库的原始 README：`D:\shaobin-codex\激素检测\deepseek-vision-gateway\README.md`。

