Renji004/dsh-omni-vision
dsh-omni-vision
Local eyes for text-only DSH models: render/paste/OCR/analyze images
Install
npx @deepseek-ai/dsh plugin --profile web add link:<你的工作区>\dsh-omni-visionRestart `dsh web` after install. Bundle APIs can change during the developer preview.
README badge
[](https://dshhub.dev/plugins/dsh-omni-vision)Paste this into your README. The star count updates with every catalog sync.
From the README
Excerpt from Renji004/dsh-omni-vision, cleaned of badges and images.
dsh-omni-vision
本插件全由 DeepSeek v4 Flash(
deepseek-v4-flash)编写。
让 Agent 自己"看见"文字与图形的 DSH 插件,全程本地、不依赖视觉模型:
eyes_render— 在 Web GUI 对话流里渲染画布(文字、线条、矩形、圆形、椭圆),PNG 落盘到工作区renders/(读完即焚),并一式两份另存永久副本到pics/。eyes_paste— 让用户把剪贴板图片(截图/照片)直接 Ctrl+V 粘贴或拖进页面:浏览器捕获图片、归一化为 PNG 存到工作区,供本地 OCR/像素分析读取。只写renders/(读完即焚,不留pics/永久副本)。全本地读图路径(不限流、离线),独立于 DSH 原生发图链路(DSH 输入框本身支持图片粘贴/拖放,但发图需要选择支持图片的模型,见"限制")。eyes_ocr— 用 Windows 自带 OCR(Windows.Media.Ocr,完全离线)把 PNG 里的文字读回成文本。这是 Agent "看见文字"的途径:DeepSeek 是纯文本模型,但识别出的文本可以原样喂回给模型引用。eyes_analyze— 把 PNG 解码成像素数据(N×N 颜色网格、主色占比、内容包围盒)。这是 Agent "看见图形/颜色"的途径:无需视觉模型,图形以结构化数据呈现。
全程本地闭环:浏览器 canvas → 本机 HTTP → 本机磁盘 → Windows OCR / 像素分析。所有下载均按需、不盲目下载(详见"下载策略");出网环节仅限:模型推理本身,以及(可选)首次渲染 Mermaid 图且本地无副本时按需获取一次 Mermaid 库。
平台要求
仅支持 Windows。 eyes_ocr 通过 PowerShell 调用 Windows 自带 OCR 引擎(Windows.Media.Ocr,完全离线);eyes_render / eyes_paste / eyes_analyze 本身不依赖 Windows 特性,但整个插件在非 Windows 上无法提供"读字"能力,按 Windows 平台维护。
下载策略:全部按需,不盲目下载
安装与启动阶段零下载;所有获取均按需发生:
- 插件本体:本地
link:/file:安装,无任何下载。 - Mermaid 库:唯一可能发生的运行时下载——仅在首次实际渲染 Mermaid 图且本地无副本时,浏览器按需从 CDN 获取一次(成功后缓存);不渲染 Mermaid 就完全不会下载。
- 其余全部本地:渲染、OCR、像素分析、图片接收,均不产生任何网络下载。
工作原理
模型 ──eyes_render──▶ 服务端工具 execute
│ │ 按 callId 注册"待渲染"承诺(15s 超时)
│ ▼
│ 会话事件流(tool/call 事件实时推送浏览器)
│ ▼
│ 浏览器 keyed tool.call.toolview 卡片
│ │ 解析命令 → canvas 绘制 → toBlob → PNG base64
│ ▼
│ POST /eyes/render(同源校验,按 callId 匹配)
│ ▼
│ 工具恢复:写 <workspace>/renders/eyes-<callId>.png(读完即焚)
│ + 永久副本 <workspace>/pics/eyes-<callId>.png
│ + attachments.saveImage(内容寻址存储)
│ ▼
│ 工具结果 = 文本信封(路径/尺寸/命令数/OCR 文本)
└──────────────────────(模型声明支持图片时,结果额外带 image 图片块)
模型 "看见"文字:eyes_render(或任意 PNG)→ eyes_ocr ──▶ 行文本
模型 "看见"图形:PNG → eyes_analyze ──▶ 颜色网格 / 主色 / 内容包围盒
用户图片进来:模型 ──eyes_paste──▶ 粘贴卡片(Ctrl+V 提示)
│ │ 浏览器捕获剪贴板图片 → canvas → PNG base64
│ ▼
│ POST /eyes/paste(同源校验,按 callId 匹配)
│ ▼
│ 写 <workspace>/renders/paste-<callId>.png(读完即焚,无永久副本)
└────────── 之后 eyes_ocr / eyes_analyze 读取
- 图片能力探测 + 降级:执行时探测当前模型路由是否声明
image输入(llm.resolveModelInfo().inputModalities)。支持 → 结果带{type:'image', attachment}图片块,模型下一轮起能看见;不支持(如 DeepSeek API,适配器声明["text"]且遇图片块抛UNSUPPORTED_CONTENT)→ 只返回文本信封,会话绝不报错。画布仍渲染在 GUI 里,用户可见。 - 本地感知(文字):
eyes_ocr通过 PowerShell 5.1 调用 Windows 自带 OCR 引擎,离线识别,支持已安装的语言包(如zh-Hans-CN中文简体)。识别结果按行返回文本。 - 本地感知(图形):
eyes_analyze自带纯 Node PNG 解码器(zlib + 反滤波,支持 8-bit RGB/RGBA 非交错 PNG),输出网格平均色、主色直方图、内容包围盒。 - 渲染匹配:客户端把工具调用的
callId随 PNG 一起 POST 回来,服务端按exec.callId匹配待渲染条目,天然支持并行调用与多标签页(先到先得,其余 404 被客户端静默忽略)。 - 重放:刷新页面后,历史会话里的卡片从工具参数(
block.call.argsRaw)重放绘制,不再上传。 - 读完即焚 + 一式两份:
eyes_render每次产出都写两份——renders/下的临时副本在eyes_ocr/eyes_analyze读取成功后自动删除(返回结果带fileDeleted标记,renders/不会越积越多);pics/下的永久副本(返回结果带keptPath)不会被删除,用户随时可以打开查看。eyes_paste只写renders/(读完即焚),不保留pics/永久副本。用户放在其他目录的图片(截图、照片等)绝不会被删除。
安装
cd <你的工作区>
dsh plugin --profile web add link:<你的工作区>\dsh-omni-vision
# 若链接失败:dsh plugin --profile web add file:<你的工作区>\dsh-omni-vision
…


