跳到主内容

dsh-windows-ocr

6Star2Fork2Issue0Watching

让纯文本模型也能"看图":调用 Windows 自带 OCR 在本机把图片识别为文字,只把文字发往模型,图片字节从不出本地。

机审证据5/5方法论数据来源安装命令持续维护DSH 版本风险扫描
机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
JavaScript
License
MIT
分支
main
cordisdeepseek-harnessdshdsh-pluginocrprivacywindows

安装

命令web profile
$ dsh plugin --profile web add dsh-windows-ocr

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 maxwell-feng/dsh-windows-ocr:先查看仓库 https://github.com/maxwell-feng/dsh-windows-ocr 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

给 DSH 上纯文本模型补上"看图附件"的能力:插件在前置环节调用 Windows 系统自带的 OCR 引擎把图片识别成文字,只有文字会随请求发到服务商;不带该插件时文本模型继续拒绝收图片,默认安全。

核心能力

  • 让纯文本模型也能接收图片附件,请求里只会出现识别出的文字而不是图片字节
  • 拦截图片序列化路径,在适配器发出请求前把 image 内容块改写成文字块(含嵌套的 tool-result 内容)
  • 给 llm.resolveModelInfo 与 listModels 打补丁,让模型在"是否支持图片"这一项返回 true,从而通过准入/切换/工具三道闸
  • 自动包装所有已注册和后续热注册的适配器 stream,HMR 替换适配器后会自动重新包装
  • 每张图片的 OCR 结果按附件 id 缓存,重复轮次不重复调用
  • 每次 OCR 用独立临时目录,跑完无论成功/失败/超时都自动清理;启动时还会清扫上一次崩溃遗留的孤儿临时目录

技术实现

  • 语言: TypeScript(编译后输出 lib/index.js)
  • 关键依赖: @deepseek-ai/cordis(宿主插件框架)、node:child_process + PowerShell(执行 OCR 脚本)、lib/ocr.ps1(封装 Windows.Media.Ocr WinRT API)、ctx.attachments.readImage(读本机附件字节)
  • 架构模式: Cordis 插件,cordis.patch.yml 的 bundle.patch 在加载层插入 windows-ocr loader 条目;插件在 apply() 中钩住 llm 服务的两个公开接缝做能力 shim 和请求改写,effect 卸载时再恢复原方法
  • 入口文件: src/index.ts(编译产物 lib/index.js,同时打包 lib/ocr.ps1)

适用场景

日常给文本模型发截图、表格、PDF 截图、代码截图、报错截屏,又不想把图片字节上传到第三方服务商;或者临时不想切到带视觉能力的模型也能让对方"读"图中文本。Windows 用户在 DeepSeek Harness / DSH 里给纯文本对话直接附加图片就能用。

前置依赖与兼容性

依赖最低版本说明
DSH0.1.0-rc.8+(README 声称在该版本验证;package.json 未声明 dsh 字段)宿主需提供 llm / attachments 服务,并在加载时支持 loader-entry 注入
Node>= 20来自 package.json#engines.node
Windows PowerShell5.1+Windows 10/11 自带;插件通过 powershell.exe 调用 WinRT OCR
OCR 语言包视所识别语言而定例如识别中文需装"中文(简体)"语言包(OCR-capable)
平台Windows 10/11调 WinRT 的 Windows.Media.Ocr,无跨平台实现
原生模块无没有 npm 原生依赖;OCR 通过 PowerShell 进程调用完成

安装方式

dsh plugin --profile web add github:maxwell-feng/dsh-windows-ocr

配置项

配置类型说明默认值
language字符串Windows OCR 使用的 BCP-47 语言标签,例如 zh-Hans、en-US;留空用当前 Windows 用户的语言偏好""
passthrough布尔默认 false,所有图片一律 OCR;设为 true 后只有真正的视觉模型才会原样接收图片,文本模型仍走 OCRfalse
ocrScript字符串PowerShell OCR 脚本的绝对路径覆盖,一般无需改自带 lib/ocr.ps1
timeoutMs数字单张图片 OCR 超时(毫秒),超时后会终止子进程并清理临时目录60000
maxCacheEntries数字进程内 OCR 结果缓存(按附件 id)上限200

常见问题

Q: 插件能用在 macOS 或 Linux 上吗?

A: 不能。它依赖 Windows 的 Windows.Media.Ocr(WinRT)引擎并通过 PowerShell 启动 OCR,macOS / Linux 没有等价能力,安装后插件启动会报错或识别不出来。

Q: 默认情况下图片会不会原样发送给模型服务商?

A: 不会。默认 passthrough 为 false,每次出站请求都会先本机 OCR,序列化 payload 里只有 text 内容块,不会出现 image_url 或 data URI;可以在 DevTools → Network 里抓包确认。

Q: 中文识别不出来,怎么处理?

A: 系统需要先装好对应语言的 Windows OCR 语言包(设置 → 时间和语言 → 语言 → 添加语言 → 中文(简体))。装好后可配 language: zh-Hans 强制指定语言,或保持默认让插件跟随当前用户的语言偏好。

Q: 安装后 dsh 启动报 duplicate loader entry id: windows-ocr 怎么解?

A: 同一 id 在 dsh 0.1.0-rc.8(cordis-plugin-loader 1.0.2)只能注册一次。如果之前用 npm bundle 装过,dsh plugin ... add github:... 会再次插入同 id 行就会重复。二选一:要么用 dsh plugin remove 卸掉再装,要么在 profile 的 cordis.patch.yml 里用按 id 覆盖(- id: windows-ocr + config:)而不是 - insert:。

Q: 卸载后会不会留下空窗期?图片会不会既不上传又不被 OCR?

A: 卸载时插件 effect 会把 llm.resolveModelInfo / listModels 和适配器 stream 恢复成宿主原版方法,文本模型仍会按宿主策略拒绝收图片——属于 fail-closed 行为;不会出现"插件卸了但 image 块还在请求里裸跑"的状态。

Q: OCR 失败的图片会不会变成请求报错整条对话?

A: 不会。识别失败的图片会被替换为占位文本块 (OCR: failed to recognize this image);缺失 attachment 的会被替换为 (OCR: missing attachment — image refused)。失败只影响这一张图,不阻断整轮对话。

Q: 我用真正的视觉模型还要这个插件吗?

A: 想让真视觉模型仍接收原图就保留插件但把 passthrough 设为 true;插件会在出站前判断模型本身是否支持图片,支持就放行原始 image 块,不支持才走 OCR。这样可以一套插件同时覆盖纯文本模型和带图模型。

上手难度

入门 — 安装一行命令即可使用,绝大多数场景无需改配置;只有需要切语言或让视觉模型收原图时才动 passthrough / language 两项。

已知问题与限制

  • OCR 语言取决于系统已装的语言包:OCR 脚本退出码 2/3 时插件降级为占位文本而非报错(lib/ocr.ps1:43-55)
  • GIF 动图只识别第一帧:Windows OCR 引擎行为限制,并非本插件 bug
  • 缓存作用域为单 dsh 进程:长会话内 OCR 结果一直驻留直到进程退出,受 maxCacheEntries 上限约束
  • HMR 与 dsh 整体升级建议重启:插件会监听 llm/adapters-updated 自动重新包装新适配器,但彻底升级后完整重启最稳妥
  • 模型选择器 UI 上文本模型可能不带"图片"徽标:listModels 的能力声明已 shim 过,仅模型选择界面的视觉标记存在不一致,纯外观问题
  • 不支持 Windows 之外的平台:Windows.Media.Ocr 调的是 WinRT 接口,macOS / Linux 无等价实现
  • port:3080 占用冲突:dsh web 启动若 3080 被占用会 EADDRINUSE,需用 netstat -ano | findstr :3080 找到 PID 并 taskkill /PID <pid> /F

查看使用指南 →

该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/maxwell-feng/dsh-windows-ocr)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录