Image "reading" for text-only models: downscale + reduce color depth + structure/color fingerprints into text grids fed back to the conversation, letting the model zoom, sample and OCR autonomously like a multimodal model; fully local with zero external model dependency, ships an image-reading methodology skill and optional PaddleOCR.
Install
# from npm (prebuilt)
dsh plugin --profile web add picturereader
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:jing-hy/picturereader
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
This plugin publishes its README in Chinese only.
v3.4.0 — 给纯文本模型(DeepSeek / text-only)的全能「看图 / 读文档 / 修图」能力。 融合 视觉孪生 adapter(把任意文本模型原位包装成「支持图片」→ DSH 原生缩略图 + 图片块自动分析)、三模式路由、本地像素级工具链(scan / OCR×4 引擎 / crop / palette / compare / batch)、文档转图片(pdf / word / excel / ppt)、本地修图工具
image_edit(Pillow/OpenCV 纯 CPU:缩放 / 旋转 / 滤镜 / 合成 / 水印 / 去背景 / 超分等)与可选外部 VLM 桥。一个插件全包。v3.4.0 新增:原生识图能力感知。插件现在从模型能力元数据(
inputModalities,与 DSH 内核的图片门控同源)判断当前会话的模型是否自己就能看图:命中时在系统提示词里明确说明「不要用image_scan/image_sample这类"伪多模态"替代路径,但image_ocr仍应正常使用」,并让粘贴/读取的图片直通该模型、不再降级成文本引导;纯文本模型与元数据缺失(未知)时行为与 v3.3.3 完全一致。判定走未包装的原始 adapter,因此不会被本插件自己的视觉孪生误判成原生识图。v3.3.0 新增:macOS 原生 Vision OCR 引擎(
engine="macos",scripts/setup-macos.mjs一键编译,PR #4 合入);OCR 引擎选项按平台条件显示(macos 仅 macOS、windows 仅 Windows,paddle/rapid 跨平台始终显示);修复 PaddleOCR 新环境首次调用三个缺陷(stdout 污染 / w/h→width/height / 缓存路径写死,issue #2);设置卡 UI 重做(settings-panel 设计语言);调试日志门控(llm/stream 桥不再刷屏);peerDependencies 兼容 DSH 0.1.1-rc.2(issue #3)。
定位
DeepSeek 等纯文本模型没有视觉编码器,无法直接看图片;DSH 原生缩略图也需要模型被声明为「支持图片」才会渲染。
⭐ 已支持外部视觉 API(OpenAI 兼容端点 / LM Studio / 云端 VLM),由 LLM 自行按需调用:配置好端点后,模型会在智能/严谨模式下自主判断"这张图值不值得外呼视觉模型",需要时用
vision_analyze调外部 API 做语义理解,简单内容则本地像素/OCR 搞定——外部 API 是即插即用的增强能力,不是必须依赖。
picturereader 现在解决三件事:
- 把「看图/读文档」翻译成纯文本模型能理解的结构化证据(像素级 hue/结构/材质分析 + OCR 实读 + 可选 VLM 语义描述),并沉淀为读图方法论 skill。
- 通过「视觉孪生 adapter」让纯文本模型在 DSH 里获得原生缩略图体验:勾选模型即生成「(视觉)」变体,粘贴图片显示原生缩略图、图片块进会话、并被自动分析成文本路径 + 本地证据再交给模型。即使上游先降级为
attachment sha256文本,图片桥也会仅从本机附件对象库恢复经过文件头校验的图片并注入本地工具路径;模型拿到的永远是纯文本,不会触发UNSUPPORTED_CONTENT。 - 本地直接修图 / 批量处理图片:
image_edit提供缩放、旋转、滤镜、合成、水印、去背景、拼接、透视校正等纯 CPU 动作,图片不出本机。
版本兼容性:本版本专门兼容 dsh 0.1.3-alpha.1 / dsheac 5.4.0,同时向后兼容 dsh 0.1.1-rc.2 与 dsheac 5.1.0,以及 DeepSeek Harness EAC 4.2.0 与
@deepseek-ai/dsh-client-ui-workspacerc.7。peerDependencies采用^0.1.0-rc.6 || ^0.1.1-rc.2 || ^0.1.3-alpha.1联合区间,覆盖三条 0.1.x 发布线。⚠️ 升级到 dsh 0.1.3 必须使用 v3.3.2 之后的版本:内核 0.1.3 起
@deepseek-ai/dsh-settings不再导出settingsNamespace()品牌函数(命名空间校验收进register()内部)。ESM 静态导入不存在的符号会让模块整体加载失败,进而拖垮整棵插件树、触发 EAC 的 guard 安全模式(表现为「一对话就报错」+ 插件大范围消失)。v3.3.3 已适配。
🚀 后续将作为 DeepSeek Harness EAC 的内置视觉插件:本插件计划替换内置的
dsh-tool-vision,随 DSH EAC 桌面版直接捆绑发布,开箱即用。作为独立包发布的目的,是让非 EAC / 旧版用户也能通过dsh plugin add picturereader或 Git/npm 安装获得同等「看图 / 读文档」能力。
功能总览
① 视觉孪生 adapter(原生缩略图 + 自动分析)
- Proxy 原位包装:对被勾选的模型所属 provider,用
Proxy把其 adapter 包装成「孪生」并原位替换(registerTwinAdapters,卸载经ctx.effect还原),不重复注册。 listModels/resolveModel:对被勾选模型声明inputModalities: ['text','image']、名称加「(视觉)」后缀 → DSH 认为它支持图片 → 原生缩略图渲染、图片块进会话、粘贴准入全部解锁。stream拦截:捕获请求里的imageblock → 导出到~/.dsh/picturereader-vision/images/→ 替换成文本路径 + 本地工具链引导 → 转发给原始 adapter。pi-ai 收到的是纯文本,不会报UNSUPPORTED_CONTENT;opencode-go等走@earendil-works/pi-ai的 provider 同样经此孪生获得原生缩略图能力。- 隐私模式下分析只走本地工具,绝不外发。
② 智能路由(隐私 / 智能 / 严谨 三模式)
这是 picturereader 的"大脑":统一在 routing.js + runtime.js 收敛「什么时候走外部 VLM、什么时候只用本地、要不要交叉验证」,供各工具 / 图片桥 / 视觉孪生 stream / vision_analyze 共享,保证整条图链都遵守同一套路由策略。
路由决策原理
每次看图,模型面对的问题其实是同一个:「这张图,值得花什么成本、用哪条路线读懂它?」picturereader 把答案预置成三种策略,模型据此自主决策,同时 host 侧做硬约束兜底:
图片进来 → 孪生 stream 拦截 / 工具被调用
→ 读入当前「模式」→ 得到该模式的路由策略
→ 模型 / 工具按策略选路线:
本地像素分析(image_scan / image_sample)
本地文字识别(image_ocr:windows / macos / paddle / rapid)
外部语义理解(vision_analyze include_vlm=true → VLM)
交叉验证(多路证据对照)
核心决策函数 visionAnalyzeDefaults(mode) 定义各模式"默认的证据组合":
| 模式 | 默认 include_scan | 默认 include_ocr | 默认 include_vlm | allow_low_info |
|---|---|---|---|---|
| 隐私(privacy) | ✅ | ✅ | ❌(硬禁) | ❌ |
| 智能(smart) | ✅ | ❌(按需) | ✅(值得才调) | ❌ |
| 严谨(strict) | ✅ | ✅ | ✅ | ❌ |
三种模式的路线策略
🕶 隐私模式(Privacy)——零外呼硬门禁
- 绝不调用任何外部视觉端点,即使你在设置卡配了 API。
- 约束是 host 侧强制:
runtime.js使isVlmConfigured()恒为false,vision_analyze强制include_vlm=false,视觉孪生stream的降级文本也明确"只用本地工具"。 - 模型只能用本地工具:
image_scan/image_ocr/image_sample/image_crop/image_palette/image_compare/image_edit。图片字节不出本机。 - 适用:敏感图片(身份证、合同、私人截图)、离线、零外部流量审计场景。
⚡ 智能模式(Smart)——省轮数、省时间(默认)
- 目标:先把成本压到最低,复杂内容才值得外呼。
- 决策流程:先
image_scan快速看整体 → 自行判断:- 图片以文字为主 →
image_ocr读文字即可,不必调 VLM; - 普通图表 / 界面 / 简单内容 →
image_scan+image_sample自己看就能说清,不必调 VLM; - 仅当内容复杂、需语义理解(照片、抽象画面)且配置了端点时,才
vision_analyze(include_vlm=true)走外部 VLM。
- 图片以文字为主 →
- 视觉孪生死活都会先把图片导出成本地路径,模型可随时本地深挖,不会被困在"必须外呼"的死路。
🎯 严谨模式(Strict)——交叉验证、细看细节
- 目标:可靠性优先,不贪省。
- 决策:先
image_scan了解整体 → 必要时image_ocr读文字、image_sample细看细节 → 对关键判断做交叉验证(把像素证据、OCR 证据、(可选)VLM 语义描述相互对照,不轻信单一来源)。 - 允许使用外部 VLM(需配置),但强度更高、可追溯。
- 适用:需要高准确率与可复现结论的场景(审图、校对、数据分析)。
隐私硬门禁贯穿所有入口:无论走哪个工具/桥,
runtime.js的模式快照都会在调用点做校验,routePolicyText(mode)还会把当前策略注入给模型的提示里,双保险。
与视觉孪生 adapter 的协同
三模式不仅约束 vision_analyze,也约束视觉孪生 registerTwinAdapters 的 stream 拦截:图片块总是被无条件替换成文本(路径 + 本地证据引导,这是模型能读懂的前提),但是否/何时进一步外呼 VLM 由当前模式决定——隐私模式恒不透传图片、不发起外部调用;智能/严谨模式在需要且已配置时才走外部语义理解。因此"原生缩略图"与"隐私零外呼"可以同时成立,互不冲突。
③ 本地工具链(纯本地读取)
| 工具 | 作用 |
|---|---|
image_scan |
全局/区域扫描:颜色网格 + regions 色块 + shade diversity + texture + structure + hue families;支持 focus/region/px_per_cell 定向放大 |
image_ocr |
文字识别四引擎:windows(内置)/ macos(macOS 原生 Vision,免装第三方,首次一条命令编译)/ paddle(选装,发光/弯曲/游戏字更强)/ rapid(选装,轻量快速);paddle/rapid 缺失自动降级不崩溃 |
image_sample |
N×N 精确像素取样,判断材质/纹理 |
image_crop |
按 region 裁剪并导出 PNG |
image_palette |
颜色提取:主色列表(hex + 命名单 + 占比)+ 色相家族 |
image_compare |
两图/两区域像素对比:mean_diff / diff_ratio / diff_box / verdict,可选差异可视化预览 |
image_batch |
批量规模/上下文验证:批量扫描 + 类型判定 + 自动全量 OCR + 是否值得深入建议 |
vision_analyze |
统一入口:低信息拦截 + 可选像素扫描 / OCR / VLM,按模式路由,返回多路证据 |
OCR 引擎平台说明:
windows引擎仅在 Windows 平台可用、macos引擎仅在 macOS 平台可用(设置卡按平台条件显示对应选项);paddle/rapid为跨平台选装引擎,任何平台都可使用。未配置时默认跟随当前平台原生引擎(Windows→windows、macOS→macos、其他→paddle),跨平台迁移的旧配置会自动回落到平台默认值。
④ 文档转图片 document_to_image
把 pdf / docx / doc / xlsx / xls / pptx / ppt 逐页转成 PNG(LibreOffice headless → PDF → PyMuPDF),供模型逐页 OCR / 扫描分析。纯本地、零网络;支持 dpi / max_pages / out_dir / 批量 file_paths。
⑤ 外部 VLM 桥(已支持,由 LLM 自行调用)
已支持外部视觉 API,且调用时机完全交给 LLM 自主判断:配置好 OpenAI 兼容端点后(LM Studio / llama-server / 云端网关 / GLM-4V-Flash 免费模型),模型在智能 / 严谨模式下会自行判断"这张图是否值得外呼视觉模型"——简单内容用本地像素/OCR 就够,复杂内容(照片、抽象画面、需语义理解)才通过 vision_analyze(include_vlm=true) 调 sendVisionRequest 以 data URI 送图给外部 VLM,取回语义描述。baseURL 自动补 /v1/chat/completions(无需手写完整路径)。
- LLM 自行调用 = 你不用手动切模型/手动发图,模型按模式策略在该外呼时自己调外部 API。
- 隐私模式仍为硬门禁:即使配置了外部 API 也绝不调用、绝不外发图片字节。
⑥ 设置卡片「图片阅读」
Web 设置页注册「图片阅读」卡片(settings-panel 设计语言:卡片分组 + 胶囊按钮 + 折叠高级项):使用模式、外部视觉 API、视觉桥模型多选、OCR 引擎(平台条件显示)、高级设置(详见「设置卡字段」)。改动写 ~/.dsh/settings.yaml 即时生效。
⑦ 粘贴即用 + 缩略图
开启视觉孪生并选择「(视觉)」模型变体后:粘贴/拖入图片 → 原生缩略图 → 图片块进会话 → 被孪生 stream 拦截 → 导出文本路径 + 本地证据 → 纯文本模型拿到结果,可继续用 image_scan / image_ocr 深挖。
⑨ 原生识图能力感知(v3.4.0)
给"自己就能看图"的模型让路:picturereader 的本地工具链是为没有视觉编码器的模型准备的替代路径,而原生多模态模型用它们只会更慢更不准。插件因此从底层元数据判断能力,并据此调整提示词与图片链路。
- 判定与内核同源:读
llm适配器的inputModalities('text' | 'image'),三态语义与内核一致 —— 显式含image= 原生识图;显式不含 = 纯文本(negative capability);字段缺失 = 未知(不注入、不改变行为,零回归)。 - 提示词注入:以
ctx.systemPrompt.section()注册动态 section(namepicturereader:image-capability,order3000)。原生识图时注入:不建议用image_scan/image_sample这些把图片降采样成像素网格的替代手段(信息损失大、易把结论建立在残缺数据上),image_ocr仍应正常使用(原生视觉对小字/发光字/艺术字会幻觉,文字以 OCR 实读为准),image-readingskill 的 5 步扫描流程也不必遵循。 - 图片直通:判定为原生识图(或命中
multimodal_models白名单)时,llm/stream图片桥不再降级图片块,粘贴的图直达模型;read_image返回的图片块同样不再被替换成文本说明。 - 不被孪生污染:能力判定用
realAdapterOf()取未包装的原始 adapter —— 本插件的视觉孪生会把被勾选模型的inputModalities改写成['text','image'],若直接读llm.listModels(),会把「伪识图(孪生)」误判成「真·原生识图」。 - 当前模型跟踪:
system-prompt/assemble(内核每轮写入的variables.provider/model)→ agent 级缓存(WeakMap,多会话/子代理互不干扰)→llm/stream兜底;模型切换后最迟下一轮生效。 - 可回退:高级开关
native_vision_auto(默认true)。关闭后提示词注入与图片直通全部回到 v3.3.3 的行为(只认multimodal_models白名单)。
⑧ 本地修图工具 image_edit
一个工具、多个 action 分发,后端为隔离的 image_venv Python(Pillow + OpenCV-headless,可选 rembg / rawpy / realesrgan CLI),纯 CPU、无需 GPU / 大模型。所有图片字节不出本机。
依赖安装:
node scripts/setup-image-venv.mjs(核心)/node scripts/setup-image-venv.mjs --full(再加 rembg + rawpy)。详见下方专门章节。
image_edit 本地修图工具
本地批量 / 单张修图。调用示例:
用 image_edit 把 <路径> 缩放到宽 800:action=resize, file_path=<路径>, width=800, height=600
给 <路径> 加左下角文字水印:action=watermark, file_path=<路径>, type=text, text="©2026", position=bottom_left, font_size=40
把 <背景> 和 <前景> 合成(贴图):action=composite, file_path=<背景>, file_paths=[<前景>], position=bottom_right, alpha=0.8
把 <IMG1>、<IMG2> 水平拼接:action=stitch, file_path=<IMG1>, file_paths=[<IMG2>], direction=horizontal
支持的 action(P0 / P1 / P2)
| 分级 | action | 说明 | 依赖 |
|---|---|---|---|
| P0 | resize |
缩放:width,height + mode(stretch/fit/fill) |
Pillow |
| P0 | rotate |
旋转:angle(度)+ expand + fill |
Pillow |
| P0 | flip |
翻转:axis(horizontal/vertical/both) |
Pillow |
| P0 | convert |
格式互转:png/jpg/webp/bmp/tiff/gif(由 out 扩展名决定) | Pillow |
| P0 | adjust |
亮度/对比度/饱和度:brightness,contrast,saturation(1.0=不变) |
Pillow |
| P0 | blur |
模糊:type(gaussian/box/motion)+ radius |
Pillow |
| P0 | sharpen |
锐化:radius,percent,threshold(UnsharpMask) |
Pillow |
| P0 | composite |
合成/叠加(贴图):主图叠加 file_paths[0] 于 position 与 alpha |
Pillow |
| P0 | watermark |
水印:type=text(text,color,font_size)或 type=image(file_paths[0]) |
Pillow |
| P0 | thumbnail |
缩略图:width,height(保持比例) |
Pillow |
| P1 | edges |
边缘检测/描边:low,high(Canny) |
OpenCV |
| P1 | equalize_hist |
直方图均衡化(增强对比度):mode(auto/clahe) |
OpenCV |
| P1 | denoise |
降噪:strength(fastNlMeansDenoisingColored,纯 CPU) |
OpenCV |
| P1 | perspective |
透视校正(矫正歪斜文档/建筑照):points(8 数)+width,height |
OpenCV |
| P1 | stitch |
多图拼接:direction(horizontal/vertical)+ file_paths |
Pillow |
| P1 | remove_background |
背景移除:U²-Net(--full 装 rembg,约 35MB,CPU 几十秒) |
rembg |
| P2 | exif_read |
读取 EXIF(Make/Model/曝光等) | Pillow |
| P2 | exif_write |
写 EXIF:fields(标签名→值) |
Pillow |
| P2 | raw_convert |
RAW 转图:rawpy(基于 libraw,--full 装) |
rawpy |
| P2 | upscale |
超分辨率放大 2–4x:realesrgan-ncnn-vulkan 独立 CLI(Vulkan,无需 PyTorch) | 外部 CLI |
| P2 | colorspace |
色彩空间:target(rgb/hsv/lab/gray/cmyk) |
OpenCV |
| P2 | morphology |
形态学:op(erode/dilate/open/close/gradient)+size |
OpenCV |
依赖与降级策略
- P0 全部仅需 Pillow;P1 除 remove_background 外仅需 OpenCV-headless。
remove_background需要 rembg(--full);raw_convert需要 rawpy(--full);upscale需要外部 realesrgan-ncnn-vulkan CLI(环境变量DSH_REALESRGAN_EXE)。- 可选依赖缺失时,不是崩溃,而是返回清晰的中文提示("请先运行
node scripts/setup-image-venv.mjs [--full]" / "请设置 DSH_REALESRGAN_EXE")。 image_venvPython 未搭建时,工具返回node scripts/setup-image-venv.mjs安装提示(与 document_to_image 的 doc_venv 一致)。- 全部动作默认超时 120s;
remove_background300s;upscale/denoise更长,避免后台阻塞。
与主流多模态插件的差异 / 优势
对比常见方案(dsh-tool-vision、dsh-image-paste、dsh-vision-bridge 等):
- 不绑定单一厂商:视觉孪生对任意 provider 生效(含
opencode-go/ xiaomi / qiu 等 pi-ai 系),不是只适配某一家 API。 - 全链路可离线:隐私模式零外呼;本地纯 JS 像素工具 + 4 引擎 OCR(含平台原生引擎),不依赖云端。
- 工具链完整:裁剪 / 取色 / 对比 / 批量 / 文档转图 / 本地修图 image_edit,一个插件全覆盖。
- 原生缩略图:真正 DSH 原生图片块(
inputModalities声明),非文本路径模拟。 - 快:本地工具毫秒级;可控 VLM 调用(低信息拦截 + 智能模式"值得才调")省轮数与耗时。
- 只写不读 key、隐私硬门禁:API Key 以
role:'secret'保存、只写不读不回显;隐私模式经runtime.js强制isVlmConfigured()=false。
| 能力 | picturereader | dsh-tool-vision | dsh-image-paste | dsh-vision-bridge |
|---|---|---|---|---|
| 原生缩略图(文本模型) | ✅ 视觉孪生 adapter | ❌ | ⚠️ 部分 | ❌ |
| 任意 provider(含 pi-ai 系) | ✅ | 绑定厂商 | — | — |
| 隐私模式硬门禁 | ✅ | — | — | ❌ |
| 本地像素工具链(scan/ocr/crop/palette/compare) | ✅ 全内置 | ⚠️ 基础 | ❌ | ❌ |
| 本地修图(缩放/滤镜/水印/去背景等) | ✅ image_edit | ❌ | ❌ | ❌ |
| 文档转图片(pdf/word/excel/ppt) | ✅ | ❌ | ❌ | ❌ |
| 批量/上下文验证 | ✅ | ❌ | ❌ | ❌ |
| 外部 VLM 桥(可选,OpenAI 兼容) | ✅ | ✅ | ❌ | ✅ |
| 全离线可用 | ✅ | ⚠️ | ✅ | ❌ |
快速上手
# 1. 安装插件
dsh plugin --profile web add picturereader # npm 包;或从源码: dsh plugin --profile web add .
dsh plugin --profile headless add picturereader
# 2.(推荐)安装读图方法论 skill
copy skills\image-reading.md %USERPROFILE%\.dsh\skills\ # Windows
# cp skills/image-reading.md ~/.dsh/skills/ # macOS / Linux
# 3.(可选)增强 OCR 引擎
node scripts/setup-ocr.mjs # PaddleOCR(发光/弯曲/游戏字更强;跨平台选装)
node scripts/setup-rapid.mjs # RapidOCR(轻量快速;跨平台选装)
node scripts/setup-macos.mjs # macOS 原生 Vision OCR(仅 macOS,需 Xcode 命令行工具)
# 4.(可选)文档转图片依赖(需已装 LibreOffice)
node scripts/setup-doc-venv.mjs # 建 doc_venv 装 PyMuPDF
# 5.(可选)本地修图 image_edit 依赖
node scripts/setup-image-venv.mjs # 建 image_venv 装 Pillow + OpenCV-headless + piexif
node scripts/setup-image-venv.mjs --full # 再加 rembg(背景移除)+ rawpy(RAW)
重启 DSH Desktop 后:模型工具列表出现全部工具(含 image_edit),设置页出现「图片阅读」卡片。
启用视觉孪生(原生缩略图)
- 在设置页「图片阅读」勾选要作为视觉孪生的文本模型,保存后重启 DSH。
- 模型选择器中选择对应模型的「(视觉)」变体(如
deepseek-v4-flash (视觉))。 - 粘贴 / 拖入图片 → 原生缩略图 → 图片块自动分析为文本证据。
使用示例
用 image_scan 看一下 <路径> 这张图,细看感兴趣的部分
(复杂场景可接着用 vision_analyze;如有文字先 image_ocr;一批图用 image_batch;
文档用 document_to_image 逐页转成图片再看;
要修改图片用 image_edit,如 action=resize / watermark / remove_background)
Code Mode(工具折叠)兼容说明
DSH 的 tools 呈现有三种 mode:native(默认,模型可直呼所有工具)、code(只允许模型直呼 run_code,其它工具折叠进 run_code 的生成 SDK 内调用)、both(两种都能用)。
- picturereader 所有工具与 mode 无关:
native/both下全部可直呼;code下也完全可用,只是要经run_code程序内调用(await tools.image_scan(...)/await tools.image_edit(...)/await tools.vision_analyze(...))。工具会被自动投影进run_code生成的 SDK,一个都不少。 - 若报错
Error: unknown tool "vision_analyze" ... only run_code is callable directly ...——这不是插件坏了,而是当前会话处于code模式、仍以直呼方式发起了调用。两种情况任选其一:- 把该部署的
tools.mode设为both(最省心:直呼 + run_code 都能用,不会降速); - 保持
code模式,改用run_code程序调用(见下方示例)。
- 把该部署的
- 推荐:日常使用直接保持
native或both;code是平台级的"只留 run_code"硬化模式,对本地看图工具是净亏(更多轮数、更多 token),非必要不开。
在 code 模式下用 run_code 调用示例(Python):
async def main():
r = await tools.image_scan({"file_path": r"C:\path\to\img.png"})
return r
await main()
三模式(使用模式)
在 Web 设置 →「图片阅读」卡片顶部选择,修改即时生效。
| 模式 | 是否调用外部视觉 API | 模型行为引导 | 适用场景 |
|---|---|---|---|
| 隐私模式 | 绝不调用(即使配置了 API) | 只走本地工具:image_scan / image_ocr / image_sample / image_crop / image_palette / image_compare / image_edit | 敏感图片、离线、零外部流量 |
| 智能模式(默认) | 允许,但先本地看图再决定 | 先 image_scan 快速看,文字→OCR、简单图→本地、复杂图才 vision_analyze 外呼 |
日常,省轮数与耗时 |
| 严谨模式 | 允许 | 自行选择路线 + 多证据交叉验证 + 细看细节 | 需要高准确率与可追溯的场景 |
隐私模式约束是 host 侧硬门禁(
runtime.js):isVlmConfigured()在此模式下恒返回false,vision_analyze强制include_vlm=false,图片桥引导也明确「只用本地工具」。
设置卡字段(图片阅读)
设置卡片采用 settings-panel 设计语言(卡片分组 / 胶囊按钮 / 折叠高级项),包含:
- 使用模式:隐私 / 智能 / 严谨(
mode)。 - 启用外部视觉 API(选配):勾选后才显示并允许调用外部视觉端点;不勾选一律走本地,图片绝不外发(
vlm_enabled)。 - 勾选后显示:
- 视觉 API Base URL(
vlm_base,如https://api.openai.com/v1或http://127.0.0.1:1234;留空=禁用外部 VLM) - 视觉模型(
vlm_model) - 视觉 API Key(
vlm_key,password+secret:只写不读,留空保持当前,填写保存即覆盖、不回显) - Key 环境变量(
vlm_key_env,apiKey 为空时回退读取) - 默认 OCR 引擎(
ocr_engine:按平台条件显示——Windows 显示 windows/paddle/rapid,macOS 显示 macos/paddle/rapid,其他平台显示 paddle/rapid;未配置时默认跟随平台原生引擎)
- 视觉 API Base URL(
- 视觉桥模型多选(
vision_models):勾选即生成该模型的「(视觉)」变体;改动需重启 DSH 生效;已勾选模型会被兜底并入列表保持打钩,与孪生注入一致。 - 高级设置(折叠):
| 字段 | 默认 | 说明 |
|---|---|---|
vlm_timeout_ms |
300000 |
外部视觉请求超时(毫秒) |
vlm_max_tokens |
8192 |
外部视觉最大输出 Tokens |
bridge_export_dir |
空(系统临时目录) | 图片桥导出目录 |
max_image_bytes |
52428800 (50MB) |
单张图片读取大小上限(字节) |
scan_default_size |
32 |
image_scan 默认格子大小 |
scan_palette |
auto |
image_scan 默认色板(auto/full/basic/gray) |
scan_mode |
auto |
image_scan 默认模式(auto/ascii/color) |
ocr_language |
空 | OCR 默认语言(BCP-47,如 zh-Hans / en-US) |
multimodal_models |
空 | 多模态白名单(逗号分隔,这些模型直收图片不降级) |
request_guard |
true |
请求保护(llm/stream 最后防线降级 image block) |
native_vision_auto |
true |
按底层模型元数据(inputModalities)自动判定原生识图:命中时提示词不建议 image_scan/图片直通该模型;关闭即回退旧行为 |
batch_probe_first |
3 |
image_batch 探测前几张(判断是否文字密集) |
batch_ocr_limit_chars |
800 |
image_batch 每张 OCR 截断字符数 |
doc_dpi |
150 |
document_to_image 渲染 DPI |
doc_max_pages |
50 |
document_to_image 最大页数 |
debug |
false |
调试日志(llm/stream 图片桥与模型缓存读取的诊断输出) |
环境变量
以下 venv 解释器默认路径指向作者开发环境,普通用户请按本机实际 venv 路径设置对应环境变量(或仅使用平台原生引擎:Windows 的
windows/ macOS 的macos零依赖)。
本地修图 image_edit(选装,Pillow+OpenCV)
| 变量 | 默认值 | 作用 |
|---|---|---|
DSH_IMAGE_PYTHON |
C:\Users\Administrator\image_venv\Scripts\python.exe |
image_edit 后端 venv 解释器路径(Pillow/OpenCV) |
DSH_REALESRGAN_EXE |
realesrgan-ncnn-vulkan |
超分 CLI 可执行路径(upscale 用,Vulkan) |
OCR(选装)
| 变量 | 默认值 | 作用 |
|---|---|---|
DSH_PADDLE_PYTHON |
C:\Users\Administrator\paddle_venv\Scripts\python.exe |
PaddleOCR 解释器路径 |
DSH_PADDLE_CACHE |
~/.paddlex-cache |
PaddleX 模型缓存目录(v3.0.x 曾默认到作者开发机路径 D:/coding/.../.paddlex-cache,已修复为 HOME) |
DSH_RAPID_PYTHON |
C:\Users\Administrator\rapid_venv\Scripts\python.exe |
RapidOCR 解释器路径 |
DSH_MACOS_OCR_BIN |
~/.dsh/cache/picturereader/macos-ocr |
macOS Vision OCR 可执行文件路径(setup-macos.mjs 编译产物) |
文档转图片(选装)
| 变量 | 默认值 | 作用 |
|---|---|---|
DSH_SOFFICE |
C:/Program Files/LibreOffice/program/soffice.exe |
LibreOffice headless 可执行路径 |
DSH_DOC_PYTHON |
C:\Users\Administrator\doc_venv\Scripts\python.exe |
文档转换 venv 解释器路径(PyMuPDF) |
外部视觉 API / VLM(可选,也可在设置卡填)
| 变量 | 默认值 | 作用 |
|---|---|---|
SEE_API_KEY / GLM_API_KEY |
空 | 视觉 API Key(设置卡 vlm_key 优先级更高) |
SEE_BASE |
智谱或设置卡 vlm_base |
OpenAI 兼容视觉端点 |
SEE_MODEL |
glm-4v-flash 或设置卡 vlm_model |
视觉模型名 |
SEE_SERVER_EXE / MODEL / MMPROJ |
空 | 本地 llama-server 自启路径(可选) |
SEE_SERVER_PORT / NGL / CTX |
8080 / 20 / 16384 |
本地服务器参数 |
设置卡
vlm_base / vlm_model / vlm_key优先于环境变量;隐私模式下即使配置也不调用。端点未写/v1时自动补/v1/chat/completions。
已知限制
- DSH attachment 单图默认约 5MB:超大图片可能被宿主上传限制拦截;工具端的
max_image_bytes(默认 50MB)是读取上限。 - 原生缩略图需启用视觉孪生:文本模型默认不被 DSH 视为「支持图片」,需在设置卡勾选生成「(视觉)」变体并重启。
- WebP 暂不支持:
image_scan/vision_analyze等对 WebP 报错,请先转成 PNG / JPEG;image_edit的convert可把 WebP 转成 PNG/JPEG。 - 平台引擎不可跨平台:
windows/macosOCR 引擎分别限定对应平台(设置卡按平台显示);跨平台迁移后旧配置会自动回落到当前平台默认引擎。 image_edit部分动作需可选依赖:remove_background(rembg)、raw_convert(rawpy)、upscale(realesrgan CLI)需--full安装或外部 CLI;缺失时返回安装提示而非崩溃。- rembg 首次运行需联网下载 U²-Net 模型:约 35–176MB,缓存于
~/.u2net;之后离线可用。 - paddle 引擎首次调用会下载模型(多源 fallback,缓存于
~/.paddlex-cache):下载过程可能打印干扰行,插件已做防御过滤,首次调用不再失败(issue #2 已修复)。 - 视觉桥模型勾选需重启 DSH 生效(
vision_models的改动不会热加载)。 dsh-file-drop需停用:其「拖入图片即注入文本」与视觉孪生/图片桥的自动分析可能冲突(重复/竞争注入),建议在对应 profile 停用;原生缩略图 + 图片桥自动分析已覆盖该需求。- 外部 VLM 依赖网络/端点:未配置端点或离线时自动跳过并给出提示;隐私模式恒不调用。
拖拽上传问题排查
如果遇到图片拖拽上传不工作的问题,请按以下步骤排查:
检查
dsh-file-drop插件状态:在 DSH 设置中检查dsh-file-drop插件是否启用。如果启用,请尝试禁用它,因为该插件可能与 picturereader 的图片桥冲突。检查视觉孪生配置:确保在设置页「图片阅读」中已勾选需要视觉桥的模型,并重启 DSH。
检查浏览器控制台:打开浏览器开发者工具,查看控制台是否有
[picturereader]相关的日志输出。如果有错误信息,请记录并反馈。检查网络请求:在开发者工具的 Network 标签中,查看是否有
/picturereader/models等请求。如果没有,可能是插件未正确加载。重启 DSH:某些配置更改需要重启 DSH 才能生效。
测试情况
v3.4.0
node --test全量 162 通过 / 0 失败,其中新增:tests/vision-capability.test.js(11 例):三态判定与内核inputModalities语义一致(含[]= 显式省略、undefined= 未知)、能力缓存读写、seedCapabilityFromAdapter三条路径(resolveModel/listModels/ 抛错退化为未知)、agent 级当前模型跟踪的优先级、白名单覆盖、提示词文案(native 注入且明确"不用 scan、ocr 照用";text-only 与 unknown 不注入)、section 名/order 常量稳定。tests/prompt-injection.test.js(3 例集成冒烟):用最小ctx桩真跑一遍apply(),验证 ① 原始 adapter 扫描 → 能力缓存;②system-prompt/assemble→ section 注册并注入原生识图说明;③ native 模型图片原样放行、纯文本模型仍降级为image_scan引导、native_vision_auto=false完全回退。
v3.3.0
node --test全量 146 通过 / 0 失败:tests/macos.test.js:macOS Vision OCR 引擎套件(Windows 平台自动跳过,需编译macos-ocr二进制后实跑)。tests/image-edit.test.js:8 项单测(action 校验、参数构造、超时、错误透传)。tests/ocr.test.js:paddle 引擎真实用例(本机 paddle_venv 实测image_ocr(engine="paddle")通过,验证 w/h→width/height 修复)。- 其余读图工具链、三模式、视觉孪生、document_to_image、batch、decode、sample 等全部通过。
- 后端
scripts/image-edit.py端到端冒烟(Pillow + OpenCV):24/24 通过。
v3.1.0 集成测试
内置 node:test 单测(工具、三模式、桥)+ 真实素材集成测试通过:本地工具链、文档转图片(pdf/docx/pptx/xlsx)、外部 VLM 真调通路(LM Studio)、三模式路由、视觉孪生 Proxy 均验证通过(24/24)。
v3.0.3 集成测试(2026-08-20)
132/132 单元测试通过 + 13/13 文档转换测试通过 + 全功能集成测试:
| 功能 | 状态 | 说明 |
|---|---|---|
| image_scan | ✅ | 4 种格式、region/focus/px_per_cell/palette/mode 全部正确 |
| image_ocr (windows) | ✅ | 中英文识别正常 |
| image_ocr (rapid) | ✅ | 带 confidence score |
| image_ocr (paddle) | ✅ | v3.0.3 修复字段名后正常 |
| image_sample | ✅ | 8×8 精确像素取样 |
| image_crop | ✅ | 裁剪导出 PNG |
| image_palette | ✅ | 主色提取 + hue families |
| image_compare | ✅ | 相同/不同图片判定正确 |
| image_batch | ✅ | v3.0.3 修复 cordis inject 后正常 |
| document_to_image | ✅ | PDF/DOCX/PPTX/XLSX 全部正常 |
| vision_analyze (本地) | ✅ | scan + OCR 证据返回正常 |
| 三模式路由 | ✅ | privacy/smart/strict 逻辑全部正确 |
| 视觉孪生 adapter | ✅ | 3 个 provider 激活 |
| 设置持久化 | ✅ | vision_models / ocr_engine / mode 全部保留 |
版本更新日志
v3.4.0(本次)
- 原生识图能力感知(新功能):新增
src/vision-capability.js,从模型能力元数据inputModalities(与内核图片门控同源)做三态判定native / text-only / unknown。- 提示词:经
ctx.systemPrompt.section()注入动态段落(namepicturereader:image-capability,order3000,空串自动丢弃)。原生识图时明确:不要用image_scan/image_sample这类伪多模态替代路径,但image_ocr仍应正常使用(原生视觉对小字/发光字会幻觉,文字以 OCR 实读为准)。image_scan/image_sample/image_ocr的工具描述也各补了一句能力前提。 - 图片链路:判定为原生识图(或命中
multimodal_models白名单)时llm/stream桥不再降级图片块,粘贴图片直达模型。 - 不被孪生污染(关键):能力判定走新增的
realAdapterOf()取未包装的原始 adapter —— 孪生会把被勾选模型的inputModalities改写成['text','image'],直接读llm.listModels()会把「伪识图」误判成「真识图」;拿不到原始 adapter 时宁可记unknown,也不用可能被污染的数据。 - 当前模型跟踪:
system-prompt/assemble读内核每轮写入的variables.provider/model→ agent 级WeakMap缓存(多会话/子代理隔离)→llm/stream兜底 + 冷启动异步补种;模型切换后最迟下一轮生效。 - 设置项:新增高级开关
native_vision_auto(默认true,设置卡同步显示)。未知(无元数据)不注入、不改变任何行为,保证零回归。
- 提示词:经
- 修复
read_image拦截从未生效:tools/post-execute的处理器原先只改了局部result却没返回PostToolDecision(应为{ kind:'accept', content }),替换实际从未发生。现已修正,并且比原逻辑更保守:只在明确判定为纯文本时才替换成image_scan/image_ocr引导,原生识图与未知一律放行。 - 测试:
npm test全量 162 通过 / 0 失败(新增 11 例单测 + 3 例apply()集成冒烟)。
v3.3.3
- 适配 dsh 0.1.2 / 0.1.3 的破坏性变更(关键修复,含 @FreyHsia 贡献):
- settings 命名空间 API:内核移除
settingsNamespace()导出(校验收进register()内部,见内核parseSettingsNamespace),原先顶层import { settingsNamespace } from '@deepseek-ai/dsh-settings'在 ESM 链接期即失败 —— 模块整体加载失败会拖垮整棵插件树,在 EAC 上表现为「一对话就报错」并触发 guard 安全模式(配套插件行被大范围剥离)。现改为把裸NS直接交给sctx.settings.register(NS, Config, { base: config }),返回的 scope 仍具备get / watch / update / replace,行为不变。 - 设置页重新打开后写入失效(0.1.2+ 回归):卸载时只退订、不
dispose()scope —— scope 属于插件 fiber 生命周期,组件卸载销毁它会导致关闭设置页再打开后所有写入静默失败、必须重启 DSH 才能改设置。 - 视觉孪生链路:适配
dsh-llm的流调度变更(prepareCall(...).stream,不再走adapter.stream),并在设置变更时refreshTwinAdapters()热更新孪生包装,避免「勾选模型后仍需重启」。 - WebP 附件可分析:
dsh-attachment会把带 alpha 的 PNG 归一化为 WebP,而本地工具链只读 png/jpg/gif/bmp —— 现以webp-wasm(纯 WASM,全平台零安装)解码 +pngjs落盘转为 PNG,分析链不再因格式中断。 - 设置页模型勾选交互:
vision_models改为草稿态由「保存」按钮统一提交(空列表走unset回落 schema 默认),不再在每次勾选时立即写盘。
- settings 命名空间 API:内核移除
peerDependencies补齐 0.1.2 / 0.1.3 线:^0.1.0-rc.6 || ^0.1.1-rc.2 || ^0.1.2-rc.1 || ^0.1.3-alpha.1(@deepseek-ai/dsh-settings与@deepseek-ai/dsh-llm),避免新环境安装时被旧的版本区间误导。- 逐项复核其余
@deepseek-ai/*导入:contentHasImage(dsh-llm)与schemastery默认导出在 0.1.3 上均仍存在,无需改动。 - 兼容性保持不变:0.1.1-rc.2 / dsheac 5.1.0 及更早内核下行为与 v3.3.2 一致。
v3.3.2
- 修复文本模型附件降级链路:当模型入口将图片改写为
[image omitted ...; attachment sha256:…]时,图片桥会在本地附件对象库中按 SHA 前缀查找唯一对象,验证 PNG/JPEG/GIF/BMP/WebP 文件头后导出并注入image_scan/image_ocr引导;找不到、前缀歧义或非图片对象时保持原文本,不猜测路径。 - 修复全局 SHA 匹配正则的状态残留,避免同轮多次检测后遗漏附件。
- 新增 SHA 降级恢复与无效 SHA 保持原文本的回归用例;
npm test全量 148 通过 / 0 失败。
v3.3.1
- 元数据修正:npm
description中 OCR 引擎数量更正为 ×4(windows / macos / paddle / rapid)。
v3.3.0
- 新增 macOS 原生 Vision OCR 引擎:
engine="macos"(scripts/macos-ocr.swift+scripts/setup-macos.mjs一键编译,默认中文优先、BCP-47 language 参数、像素坐标框契约与 paddle/rapid 一致),供 macOS 用户零第三方依赖使用(PR #4 合入)。 - OCR 引擎按平台条件显示:设置卡
windows引擎仅 Windows、macos引擎仅 macOS(paddle/rapid 跨平台始终显示),未配置时默认平台原生引擎;跨平台迁移旧配置自动回落。 - 修复 PaddleOCR 新环境首次调用必失败(issue #2):① AI Studio 下载源的
<Response [404]>stdout 污染 → 解码前过滤非 base64 行;② paddle 输出w/h→ 改为 schema 要求的width/height;③paddleCacheHome()默认路径从作者开发机改为~/.paddlex-cache。 - peerDependencies 兼容 DSH 0.1.1-rc.2(issue #3):
^0.1.0-rc.6 || ^0.1.1-rc.2联合区间。 - 设置卡 UI 重做:settings-panel 设计语言(卡片分组、胶囊按钮、32px 输入框、chevron 下拉、折叠箭头);
scope.load()兼容无 load 宿主(EAC 桌面壳)。 - 调试日志门控:llm/stream 图片桥诊断日志改由
debug设置项控制,默认不再刷屏。
v3.2.0
- 新增
image_edit本地修图工具:22 种纯 CPU 动作(Pillow + OpenCV-headless,可选 rembg / rawpy / realesrgan CLI)——P0 基础(resize/rotate/flip/convert/adjust/blur/sharpen/composite/watermark/thumbnail)、P1 进阶(edges/equalize_hist/denoise/perspective/stitch/remove_background)、P2 高级(exif_read/write/raw_convert/upscale/colorspace/morphology)。 - 新增
scripts/setup-image-venv.mjs(--full装 rembg+rawpy)与scripts/image-edit.py后端。 - 新增环境变量
DSH_IMAGE_PYTHON/DSH_REALESRGAN_EXE。 - 新增
tests/image-edit.test.js单测 8 项 + 后端 24/24 冒烟,全部通过。
v3.1.x(前版)
- v3.1.0:新增
read_image工具拦截(避免 image block 触发UNSUPPORTED_CONTENT);内置image-reading技能注册;内置依赖安装完整性修复落地。
v3.0.x(前版)
- v3.0.6:修复依赖安装完整性(
jpeg-js/omggif/pngjs随插件预装),图析功能不再静默失败。 - v3.0.5:修复
scope.load()兼容(设置页「图片阅读」空白)。 - v3.0.4:Code Mode 工具折叠兼容说明。
- v3.0.3:设置持久化修复、PaddleOCR 字段名、本地 VLM 端点检测、cordis4 兼容。
- v3.0.0:视觉孪生 adapter、三模式路由、本地工具链、文档转图片、3 引擎 OCR、设置卡。
开发 / 仓库布局
# 本仓库 main(DSH 版,源码位于仓库根目录)
npm install
npm test # node:test
node scripts/setup-ocr.mjs # 可选(PaddleOCR)
node scripts/setup-rapid.mjs # 可选(RapidOCR)
node scripts/setup-macos.mjs # 可选(仅 macOS Vision OCR)
node scripts/setup-doc-venv.mjs# 可选(文档转换)
node scripts/setup-image-venv.mjs # 可选(本地修图 image_edit,--full 加 rembg/rawpy)
node scripts/preview.mjs # 生成 fixtures 并预览渲染
- 热插拔:业务逻辑集中在
src/core.js单文件,工具每次执行按 mtime 动态加载;工具定义(schema/描述)与设置卡改动需重启桌面端。 - ZCode 版:位于本仓库 zcode 分支(源码在
zcode/),经 MCP server 暴露工具,安装npm install picturereader-zcode。两版共用src/core.js与读图方法论 skill。
License
MIT
Links
More in this category
liustack/modlens★ 4076
Vision bridge for text-only models: paste an image, get structured JSON evidence (OCR, layout, semantics).
ysr666/dsh-vision-router★ 1129
Free vision for text-only agents: built-in keyless vision chain plus pixel tools (Q&A, grounding, crop, pixel diff, colors, OCR, SVG trace, cutout, screenshots); paste an image to use it.
Anionex/dsh-vision-toolkit★ 885
Vision for text-only models: paste an image and the model switches to a Vision Toolkit variant for image Q&A, multi-image comparison, long-screenshot OCR, screenshot-to-UI reproduction, element grounding, and pixel diff. No API key by default — images are processed by the author-hosted free service, 100 per machine per day; configurable to your own provider.
dickpy/dsh-imagegen★ 96
AI image generation for the DSH Web GUI: text-to-image and image-to-image through a configurable OpenAI-compatible endpoint (gpt-image-2 / gpt-image-1 / dall-e-3), with an api_url/api_key settings card and a sidebar split-pane generation studio.
fandc520/dsh-comfyui★ 89
Drive a local or remote ComfyUI server from DeepSeek Harness: comfyui_run / comfyui_object_info / comfyui_workflow tools generate and edit images and videos, with a workflow library (graph extraction: per component / main flow / all), a load area with resolution auto-match, a live queue, SDXL and Wan 2.1 templates, a companion skill, and a same-origin media proxy.
sunxin-ai/dsh-design-qa★ 44
Design-fidelity QA for text-only models: a `deepseek_vision` tool borrows an eye from any OpenAI-compatible vision route, so the model can judge whether an implementation matches its mock — shipped with the benchmark behind that judgement (four fixtures, 23 injected defects, raw transcripts) and the questioning discipline it depends on.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.