READMESource: main@1831133e
dsh-vision-relay
零修改、零切换的 DeepSeek Harness 视觉能力插件 —— 让纯文本模型(如 DeepSeek-V4-Flash)直接"看见"聊天里的图片:粘贴即读、无需切换模型、不修改任何核心代码。
📌 插件已添加
dsh-plugin主题标签,欢迎在 GitHub Discussions 反馈问题。
✨ 功能
| 能力 | 说明 |
|---|---|
| 粘贴即读 | 聊天里粘贴图片 → 模型自动调用 vision_analyze 读取,无需保存文件、无需手动传路径 |
| 零切换 | 注册包装 provider opencode-go-vision(声明图片输入),默认模型直接指向它——用户永远不用手动切换模型选择器 |
| 零核心修改 | 纯插件 + 配置补丁实现,不碰任何 DSH 核心代码 |
| 双后端自动切换 | 优先内网 OpenAI 兼容 API(qwen3.6-35b-a3b),无 key 时自动回退本地 Ollama(qwen3.5:4b / 0.8b) |
| 结构化证据输出 | 默认返回 ModLens v2 风格结构化 JSON:summary / ocr(逐字转录)/ layout(区域+阅读顺序)/ semantics(场景+实体+关系)/ visual(颜色+风格)/ uncertainty(不确定项) |
| 深度校验 | 六字段嵌套类型全部校验,不合格自动降级为原始文本并标记 structured: false,绝不把坏 JSON 当证据 |
image-recognition 技能 |
自动注册技能目录,内置"结构化证据消费指南",主模型知道如何引用各字段 |
🏗️ 架构
DSH 智能体 (Agent)
│ 调用 vision_analyze 工具
▼
Cordis 插件 (plugin.mjs, Host 端)
│ subprocess.spawn(node)
▼
Node 桥接脚本 (webtools/vision_bridge.js)
├── 云端: OpenAI 兼容 API (VISION_API_KEY) → qwen3.6-35b-a3b
└── 本地: Ollama (/api/generate, format: 'json') → qwen3.5:4b / qwen3.5:0.8b
同时注册包装 provider opencode-go-vision:
用户发图 → DSH 准入检查(wrapper 声明支持 image)→ 放行
→ 请求时图片块转换为「本地路径 + 调用 vision_analyze」文本
→ 主模型调用 vision_analyze → 双后端识别 → 结构化证据 → 回答
主模型(纯文本)全程不接触图片字节,图片内容只发给视觉后端。
📋 依赖
| 依赖 | 用途 | 必选 |
|---|---|---|
| DeepSeek Harness(运行环境) | 插件载体 | ✅ |
| Node.js 18+ | 桥接脚本运行时 | ✅ |
| 视觉后端(二选一或都配) | 图片识别 | ✅ |
VISION_API_KEY / VISION_BASE_URL / VISION_MODEL 环境变量 |
云端内网 OpenAI 兼容 API | 走云端时 |
Ollama(ollama serve + qwen3.5:4b 等视觉模型) |
本地识别兜底 | 走本地时 |
无 key 时自动回退 Ollama,纯本地运行,零 API 成本。
🚀 快速开始
1. 获取代码
git clone https://github.com/junhongchashui/dsh-vision-relay.git
2. 配置 plugin.mjs
打开 plugin.mjs,把开头的 CONFIG.bridgeDir 改成你 clone 下来的 webtools 目录绝对路径:
const CONFIG = {
upstream: 'opencode-go', // 被包装的上游模型路由(你的 DSH 配置里已有的 provider)
providerId: 'opencode-go-vision', // 包装 provider 的 id
bridgeDir: 'D:/你的路径/dsh-vision-relay/webtools', // ← 必改
nodePath: 'node',
}
3. 挂载插件
在 $DSH_HOME/profiles/web/cordis.patch.yml(或部署对应的补丁层)追加:
- insert:
- id: vision-relay
name: 'file:///D:/你的路径/dsh-vision-relay/plugin.mjs'
config: {}
保存即热加载(或重启 dsh web)。
4. 指向包装模型
在 DSH 的 settings.yaml 把默认模型指向包装 provider(用户无需任何手动切换):
agent-default-model:
provider: opencode-go-vision
model: deepseek-v4-flash
5. 验证
问智能体:请描述我发的这张图
粘贴一张图片发送——模型应自动调用 vision_analyze 并返回结构化证据 + 基于证据的回答。
🛠️ 配置
plugin.mjs 顶部
| 配置项 | 说明 | 默认 |
|---|---|---|
CONFIG.upstream |
被包装的真实模型路由 | opencode-go |
CONFIG.providerId |
包装 provider 的 id | opencode-go-vision |
CONFIG.bridgeDir |
vision_bridge.js 所在目录绝对路径 |
必改 |
CONFIG.nodePath |
Node 可执行文件,'node' 自动解析 |
'node' |
环境变量(vision_bridge.js)
| 环境变量 | 说明 |
|---|---|
VISION_API_KEY |
云端 OpenAI 兼容 API 密钥(也接受 OPENAI_API_KEY / SILICONFLOW_API_KEY) |
VISION_BASE_URL |
云端 base URL,如 http://172.16.14.240:1234/v1 |
VISION_MODEL |
云端默认模型,如 qwen3.6-35b-a3b |
后端选择逻辑:provider 参数显式指定 > auto(有 key 走云端,无 key 走 Ollama)。
vision_analyze 工具参数
| 参数 | 说明 |
|---|---|
image_path / image_url |
二选一:本地绝对路径 / 网络 URL |
prompt |
可选,对图片的具体问题 |
provider |
auto(默认)/ ollama / openai |
model |
模型名,云端默认 qwen3.6-35b-a3b,本地默认 qwen3.5:4b |
📄 结构化证据输出契约
默认返回(ModLens v2 风格,深度校验通过时 structured: true):
{
"summary": "一句话总结",
"ocr": { "full_text": "全部文字逐字转录", "lines": [{"text": "每行文字", "language": "可选"}] },
"layout": { "regions": [{"type": "title|table|chart|...", "reading_order": 1, "text": "区域文字"}] },
"semantics": {
"scene": "场景", "intent": "用途(可选)",
"entities": [{"name": "实体", "type": "类型", "evidence": "依据(可选)"}],
"relations": [{"subject": "主语", "predicate": "关系", "object": "宾语"}]
},
"visual": { "dominant_colors": ["主色"], "style": "风格", "notes": ["视觉备注"] },
"uncertainty": ["看不清的内容,如实列出"]
}
- 六字段必填(
summary/ocr/layout/semantics/visual/uncertainty),嵌套类型深度校验 - 校验失败自动降级:
structured: false+ 原始文本 +warning,不阻塞流程 uncertainty强制诚实:模型必须列出看不清的内容,机制上杜绝编造- 刻意不含像素
bbox坐标与confidence分数——视觉模型会编造这两者(ModLens v2 同样移除)
🧪 兼容性
| 项 | 说明 |
|---|---|
| DSH 版本 | 0.1.x(Cordis 插件机制,cordis.patch.yml 补丁挂载) |
| Node.js | 18+(桥接脚本运行时) |
| 已验证环境 | Windows 11 + Node + DSH(2026 实测) |
| 视觉后端 | 内网 OpenAI 兼容 API(qwen3.6-35b-a3b)+ 本地 Ollama(qwen3.5:4b / qwen3.5:0.8b) |
💡 设计取舍
- 不修改核心代码:DSH 升级无忧,插件失效最坏情况是静默禁用
- 主模型不接触图片:图片字节只到视觉后端,纯文本模型请求永远干净
uncertainty优先:宁可说"看不清"也不编造,证据质量高于故事性描述
📄 许可
🤝 社区
- 使用与反馈:官方 GitHub Discussions
- 发现更多插件:
dsh-plugin主题
No comments yet. Be the first to write one.