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 免费申请,glm-4v-flash 免费用 |
工作流
用户发送图片后,agent 执行以下步骤:
1. 检测图片
图片上传后自动存入沙箱的 uploads 目录,路径形如:
/sessions/<session-id>/mnt/uploads/<uuid>_image.png
agent 通过检查对话中的 [Unsupported Image] 标记或直接 ls uploads 目录确认有新图到达。
2. 执行识图脚本
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 核心逻辑
// 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 无原生识图能力,每次需手动检测上传目录并执行脚本 |
运维
# 检查智谱 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。