Repository navigation
Releases
v1.0.1
主题:把 49 项配置从「一股脑平铺」改成「按类别渐进披露」(用户反馈:把所有东西都堆给用户看了)。
1. 设置页重排:8 个可折叠分组,默认只展开「常用」
| 分组 | 项数 | 默认 |
|---|---|---|
| 常用(模型 / API 地址 / 密钥 / OCR 引擎 / 切块边长 / 输出目录) | 6 | 展开 |
| 接口与端点(含 5 项「高级」) | 10 | 收起 |
| 识别策略 | 3 | 收起 |
| 切块与输出 | 9 | 收起 |
| 性能与缓存(含 2 项「高级」) | 10 | 收起 |
| GPU 加速(含 2 项「高级」) | 4 | 收起 |
| 设备适配(含 2 项「高级」) | 4 | 收起 |
| 调试与自检 | 3 | 收起 |
- 分组只是展示维度,不影响配置读写:字段键、数量(仍是 49 项)、保存语义全部未变。
- 「高级」= 需要看文档才敢改的项(
image_detail/thinking_mode/max_tokens_field/
extra_headers/extra_body/ 缓存清理参数 / GPU 路径 / 设备基准),在组内另起次级区块,与主字段视觉分层。
2. 新增的界面能力
- 搜索框:跨分组按关键词过滤(匹配字段名 / 标签 / 提示 / 选项文案),命中组自动展开、整组无命中则不占位置。
- 组头徽标:
已自定义 N 项(绿)/未保存 N 项(橙)—— 分组收起时也能一眼看出哪组被动过。 - 保存按钮显示待保存条数(
保存改动(3));字段改回原值会自动撤销「未保存」标记(旧版改回原值仍显示有改动)。 - 「全部恢复默认」改为两段式点击确认 + 危险色(先上膛、再点一次才执行),防误触清空 49 项。
- 「全部展开 / 全部收起」一键切换;改动过的字段标签变橙色高亮。
3. 修复
- 动作栏吸底导致文字重叠:
.vet-actions原用position: sticky; bottom: 0,而宿主插件页的滚动容器在卡片之外,
滚动时后续分组会从按钮下方穿过去,加上卡片背景半透明 → 看上去像印刷重影(用户真机截图发现)。
现改为回到文档流末尾 + 上分隔线收尾。 - 「视觉 API 地址」的提示文案过长导致换行两行,已精简。
4. 工具链
- 新增
scripts/client-preview.mjs(npm run preview:client):把 client.js 在 node:vm 里真实执行一遍,
取渲染树导出成离线预览 HTML —— 改界面不必先同步到生产再刷新页面才能看效果。
预览容器带滚动模拟(max-height + overflow:auto),用于照出吸底 / 绝对定位类错位。
5. 验证
npm test:286/286;冒烟三套(标准 facet / Cordis 入口 / 客户端设置页)全过。- 结构断言(
scripts/client-settings-smoke.mjs)仍守「界面字段 ≡ 配置字段」双向一致(49 项)。 - 真机确认:刷新插件页后新界面生效(分组折叠、组头徽标、搜索框均正常)。
v1.0.0
主题:从「一次一张图的工具」升级为「可跑的识别流水线」,并解除对单一端点的绑定。
1. 批量/目录级识别流水线(新工具 vision_batch_recognize)
- 一次处理一个目录:逐图跑与单图工具同一套识别链路(默认
strategy=pipeline),
产出report.md(人读汇总 + 失败清单)/report-full.md(每图全文)/report.json(机读)三件套。 - 可续跑:进度写
index.jsonl,重复调用(同一input_dir+batch_id)只补未完成项、自动重试失败项;
resume=false可强制全量重跑。 - 失败隔离:单图失败只记
failed并继续,不会让整批报废。 - 可控耗时不超时:
limit(默认 5 张)与time_budget_ms(默认 4 分钟)到点即收工,返回剩余张数供继续调用。 - 省钱:批内相同内容的图片只识别一次(报告标注"内容相同,已复用");命中结果缓存的图不再发请求。
2. 多模态端点泛化(不再写死 DeepSeek)
- 新增端点画像层
src/api-profile.js:路径 / 认证头 / detail / thinking / token 字段名 / 附加头与 body
全部由画像描述,vision-client只按画像发请求。 - 可接任意 OpenAI 兼容端点:本地 vLLM / Ollama / LM Studio(允许无 API key)、以及各厂商兼容端点;
配置示范见 README「接入其他视觉端点」。 - 默认只发最小通用集合(
model/messages/max_tokens/stream:false),
thinking/detail/reasoning_effort等专有字段按画像显式开启(已确证多家端点"发了就 400")。 - 三类自动回退:404/405 切一次
/v1前缀(用户显式给路径则不猜);400 提示max_completion_tokens时自动换字段重试;
端点不认识某专有字段时剔除该字段重试。 - 不把 HTTP 200 当成功:响应解析会识别
base_resp.status_code类业务错误,并区分空正文的五种成因
(撞 token 上限 / 只有思维链 / 内容安全拦截 / 结构化内容为空 / 原因未判定)。 - 新增配置:
provider、api_key、api_path、extra_headers、extra_body、image_detail、thinking_mode、max_tokens_field。
3. 性能改造(并发 + 缓存 + 算力预算)
- 分层聚合组间并发:原先 3 组串行 → 现按算力预算并发(
api_concurrency,0=自动),结果保持组序,聚合不受影响。 - 视觉结果缓存(
src/result-cache.js):键 = 图片内容哈希 + 参数指纹(模型 / 端点 / 提示词版本 / 提问…),
落盘~/.vision-exp-tile-result-cache,支持 TTL 与体积上限自动清理。只缓存成功结果(错误与空正文不缓存,避免把错误固化)。 - 全局 API 闸门:并发额度跨调用共享,防止「批量图级并发 × 图内并发」叠乘把端点打成 429。
- 算力预算表(
src/concurrency.js):按性能档位与逻辑核数给出 API / 图级 / OCR 池并发基线,显式配置优先、带上限保护。 - 新增配置:
api_concurrency、result_cache、result_cache_ttl_hours、result_cache_max_mb。
4. 其它修复与改进
- 修复静默错数据:批量链路拿不到图片尺寸而传
width:0,会让「相对坐标→像素坐标」全部钳成 0;
现由pipeline自行探测尺寸(probeImageSize),并在stages里记录尺寸来源。 - 修复自动回退的双 URL:404 切
/v1时曾把完整 URL 当路径二次拼接,现统一为「换 baseURL」。 - 修复
api_key泄露面:设置页直填的 key 不再写入process.env(消费侧直接读配置对象)。 - 设置页字段由 37 项扩至 49 项(新增 12 项全部可在 Web 设置页编辑)。
- 工具总数由 3 个增至 4 个;
dsh-plugin.json的x-tools声明同步。 - 代码精简:删 6 处零引用导出(其中
toSettingsBase()内引用了未导入的符号,一旦调用即 ReferenceError);
清理 7 处未使用 import / 死变量;4 份过程文档(123KB)合并为 1 份;历史版本、旧回滚备份、历史发布快照
与项目外的适配目录移出/删除,项目目录由 ~830MB 降到 ~48MB。
5. 验证
npm test:286/286;冒烟三套(标准 facet / Cordis 入口 / 客户端设置页)全过。- 新增测试:端点画像 15 项、端点接线 8 项、批量编排 10 项、批量端到端 3 项、批量报告 17 项、
并发与闸门 19 项、结果缓存 15 项、缓存接线 5 项、尺寸探测回归 3 项。 - 顺带把两处历史漏登记的测试文件纳入
npm test(smart.test.js、pipeline-size.test.js)——
Node 20 不支持 glob,漏登记 = 从来没跑过。 - 真机实测(DSH 0.2.0-rc.2,2026-10-02 01:04):
- 新增的第 4 个工具
vision_batch_recognize在册可调用(能调用即证明宿主加载的是新代码); - 批量端到端:2 张真图全成功(5 秒;报告头显示「并发:图级 2 · API 3」,说明算力预算生效),
产出index.jsonl+report.md/report-full.md/report.json+ 每图answer.md/
precheck.json/result.json/区域 PNG; - 续跑:同批次再次调用 → 本次处理 0 张 / 0 秒,历史结果完整保留在重建的报告里;
- 结果缓存:相同参数强制重跑 → 0 秒(首次 4.8s / 3.6s),缓存目录 16 条;
换成不同question则结果不同 ⇒ 缓存键确实包含提问,不会串答案; - 旧工具回归:
vision_tile_split(3200×2000 → 3×4=12 块 + overview)正常; - 真机还暴露并修复了一个可观测性缺口(pipeline 丢弃缓存命中标记 → 报告恒显示「缓存命中 0 张」,
且 0 命中时的括号文案误导),已补断言锁住。
- 新增的第 4 个工具
v0.5.0
本版汇总 v0.5.0-rc.1 ~ rc.4 的全部内容(各 rc 的详细记录见下方历史段落)。
主题:适配 DSH 0.2.0 · 设置界面回归 · 完全独立运行
- 适配 DSH 0.2.0(插件装载):0.2.0 的插件机制为 Cordis bundle——按
dsh.profile.bundles[]顺序叠加各 bundle 包dsh.bundle.patch指向的 patch 文件。本版恢复dsh.bundle.patch(→cordis.patch.yml)并把main/exports["."]指回src/index.js(导出apply/name/inject/Config),插件可在 0.2.0 上被识别与装载;同时保留 dsh-std 标准形态(dsh-plugin.json+std-facet.js,子导出./std-facet)以备 DSH 主线将来内置该装载器。 - Web 设置页回归:0.2.0 移除了旧的
settingsScope客户端接口(旧设置页因此失效),本版按新机制重写——服务端导出Config(37 个.volatile()字段),客户端以ctx.configForms.get('vision-exp-tile')读写、把卡片注册进插件页plugins.itemslot,控件全部自绘(官方劝阻第三方插件 require 宿主 UI 包)。设置页覆盖全部 37 项配置,按六组呈现:识别与接口 / 切块与输出 / 性能与 OCR 池 / GPU 加速 / 设备适配 / 调试与测试;保存后即时热生效,支持「放弃改动」与「全部恢复默认」。 - 配置来源三级(留空即回落):设置页 > 配置文件
~/.dsh/vision-exp-tile.json> 环境变量 > 内置默认。 - 设置文件化:设置从宿主
settings.yaml迁移到~/.dsh/vision-exp-tile.json(首次自动迁移旧分区、读取热生效、原子写回)。 - 取消 picturereader 适配:移除共存探测、工具描述分工引导、其配置继承(
vlm_base/vlm_model)与 venv 复用(经实证 own≡peer 为死逻辑),插件完全独立运行。 - 其它:相对
out_dir基准改为「源图所在目录」;清理历史模块;inject = ['tools']服务声明修复(缺失会导致插件启用失败)。
验证:npm test 176/176;冒烟三套全过(标准 facet 入口 15 / Cordis 入口 20 / 设置页 19,含「界面字段 ↔ 配置字段双向一致性」防漂移断言)。真机实测(DSH 0.2.0-rc.2):三个工具装载可用;vision_tile_split(509×953 → 2 块落盘 + overview)、vision_region_crop(落盘 255×286)、vision_tile_recognize(pipeline:预检→本地 OCR→像素网格→4 区域识别→汇总,14 块/14 请求)端到端通过;设置页可编辑保存并持久化到 profile 的 cordis.patch.yml。
发布资产:vision-exp-tile-v0.5.0.zip(完整版)与 vision-exp-tile-v0.5.0-nopython.zip(零配置版,剔除 src/ocr-worker.py,自动降级 Windows OCR);两包均不含 node_modules。
安装(两种包)
- 完整版
vision-exp-tile-v0.5.0.zip:含本地 Python OCR 引擎支持(paddle/rapid venv 可选,未装则自动降级 Windows OCR)。 - 零配置版
vision-exp-tile-v0.5.0-nopython.zip:不含src/ocr-worker.py,本地识别直接用系统 Windows OCR,零依赖开箱可用。
挂载:解压到 ~/.dsh/plugins/vision-exp-tile(或任意目录),在目标 profile 的 package.json 里加:
{
"dependencies": { "vision-exp-tile": "link:C:/Users/<你>/.dsh/plugins/vision-exp-tile" },
"dsh": { "profile": { "bundles": [ "...现有项...", "vision-exp-tile" ] } }
}然后在该 profile 目录执行 pnpm install,重启 DSH。工具出现在工具目录、设置页出现在 Web 侧栏「插件」页即为成功。
校验值(SHA256 · Release 资产)
d4227e7882b8a579cdba94a5195518c7d0f0d7749078a4613979be3eeb8c6091 vision-exp-tile-v0.5.0.zip
6239a957b8dd19cfe4829060a9892d6cf83fc469cdaa477318ead23080f14eb2 vision-exp-tile-v0.5.0-nopython.zip
核对方法:下载附件后在本机算一次 SHA256 与上面比对(PowerShell:Get-FileHash .\vision-exp-tile-v0.5.0.zip -Algorithm SHA256)。
v0.4.3 — 仓库元数据修复 / 计费表述诚实化 / 隐私与数据说明 / 过期临时产物清理
vision-exp-tile v0.4.3
仓库迁移说明:本仓库由原账号
Nicholas023(已被 GitHub 停用)迁移至Nicholaskin重新发布。
v0.4.3 是迁移后发布的第一个版本,包内package.json/ README 的仓库地址已指向新账号,开箱可用。
本次更新完全由 DeepSeek Harness 自主完成。
背景与目标
v0.4.2 之后进入「仅本地同步、暂不发布」收尾:把工作区已新增/修正的代码与文档同步到 v0.4.3 版本号,完成 README/CHANGELOG 更新块对齐。内容包括:修正 package.json 仓库元数据、统一计费表述(避免「不统计」等易误读措辞)、补充「隐私与数据说明」、为 pipeline/region_crop 增加过期临时产物清理。
新功能与改动
- 仓库元数据修复:
package.json的repository/homepage/bugs由占位作者/仓库地址改为实际仓库地址;随仓库迁移至Nicholaskin/vision-exp-tile。 - 计费表述诚实化:README、工具描述、脚本注释统一为「不代为统计/不显示 token 与费用,实际以 DeepSeek 官方 API 平台账单为准」,替换旧的「不统计 token / 不计算费用」表述。
- 新增「隐私与数据说明」:图片以 base64 直连 DeepSeek 官方视觉 API、按官方账单计费;pipeline/smart 过程明细落盘系统临时目录(可用
out_dir指定);插件默认清理超过 24 小时的旧临时目录/区域图(仅插件自身前缀,不触碰用户指定out_dir)。 - 过期清理模块:新增
src/temp-cleanup.js(cleanupOldTempArtifacts:扫描系统临时目录,按 mtime 清理 >24h 的vision-tile-pipeline-*目录与region-*.png/vision-tile-ocr-*.png文件;支持注入now/ttlMs/tmpRoot/excludePaths;异常静默容错),并在src/pipeline.js/src/index.js(region_crop 路径)结束时调用。 - 测试:新增
tests/temp-cleanup.test.js(5 项:默认不删新鲜文件、过期前缀清理且非前缀保留、注入 now/ttlMs 可控、excludePaths 保护、异常路径不抛),并加入package.json的test显式列表。
验证
npm test:168/168 全绿(原 163 + temp-cleanup.test.js 5 项);- 打包:完整版
vision-exp-tile-v0.4.3.zip+ 零配置版vision-exp-tile-v0.4.3-nopython.zip(附件已附在本 Release)。
安装
- 下载附件
vision-exp-tile-v0.4.3.zip(或零配置版-nopython.zip),解压到任意目录; - 在该目录执行
npm install(零配置版同样需要,仅少了本地 Python OCR 引擎); - 按 README 的「安装与挂载」章节把插件挂到 DSH profile;
- 需要本地 OCR 时可再装 rapid/paddle venv;不装也行——本地识别自动降级为 Windows OCR 常驻池,识别仍可走视觉 API。
本插件不代为统计、不显示 token 与费用;实际计费以 DeepSeek 官方 API 平台账单为准。
v0.4.2
本次更新完全由 DeepSeek Harness 自主完成。
背景与目标
vision-exp-tile 与上游 picturereader(github.com/jing-hy/picturereader)常同挂载于同一 DSH 实例。二者都做图像识别,若不分工会让模型被两套近似工具搞晕、多空转轮数。本版做"picturereader 适应性优化":两插件共存/协作的工具调度适配,并复用其已配视觉端点与已建 OCR venv,顺带省模型空转。
新功能
- 共存探测 + 工具分工引导(A):新增
src/picturereader-detector.js——isPicturereaderPresent(双通道:dsh-tools 注册表ctx.tools.get('image_scan')/ 插件目录<DSH_HOME>/plugins/picturereader存在性;全部 try/catch,异常=不在场)、collabGuideText(在场返回 ≤220 字中文分工引导)、withCollabIfPresent。src/index.js注册三个工具时按探测结果在 description 末尾追加分工段(大图切块/批量/区域→本插件;小图/像素级/整页文档→picturereader 的image_scan/image_ocr/image_batch/document_to_image);首个 apply 探测 + setTimeout 500/1500ms 复查(防插件注册顺序竞态,结果变化才 dispose+重注册一次)。picturereader 不在场时工具描述与 v0.4.1 逐字节一致(零回归);不在工具结果尾部加任何文本。 - peer 配置复用(B):新增
src/peer-config.js——readPeerSettings读 settings.yaml 的picturereader:分区(文本行匹配,去引号/去注释;文件/分区缺失=null);applyPeerDefaults在本插件 baseURL/model 等于默认(未显式)时以vlm_base/vlm_model覆盖(用户显式 > peer > 默认);apiKeyEnv 仍用本插件自身DEEPSEEK_API_KEY链(不读 vlm_key 密钥)。 - peer venv 复用(C):
src/ocr-local.js的rapidPython/paddlePython增加 peer venv 候选——优先级:本插件显式 env(DSH_RAPID_PYTHON/DSH_PADDLE_PYTHON)> 本插件默认 venv(存在)> picturereader 已建 venv($HOME/<venv>/Scripts/python.exe)> 本插件默认(兜底失败安全回退);resolveVenvPython为纯函数(可注入 exists 便于单测)。venv 路径常量经实证:picturereader/src/core.js 用join(homedir(),'<venv>','Scripts','python.exe')。 - 测试:新增
tests/peer.test.js(16 项):探测双通道/异常、分工引导在场/不在场、三个真实工具描述回归(不在场不含分工段)、peer 配置读取(临时 YAML:正常/缺键/畸形/无分区)、applyPeerDefaults 优先级、resolveVenvPython 优先级、rapid/paddle venv 集成(临时目录 mock 路径存在性)。 - 无新增依赖、不改动 picturereader:全部用 Node 内置 + 现有依赖;不写 picturereader 任何文件。
验证
npm test:163/163 全绿(原 147 + peer.test.js 16 项);VISION_TEST_TIMEOUT_FACTOR=8 npm test:163/163 仍全绿;VISION_TEST_SKIP_TIMING=1 npm test:162 通过 + 1 跳过(超时/时序敏感用例),0 失败;node scripts/probe-device.mjs:输出合法 JSON(不受本版影响)。
致谢与兼容性说明
本版与 picturereader(MIT,作者 @jing-hy)做了共存协作适配——感谢上游作者与社区。两个插件都装时,模型会自动按分工选工具(大图/批量走 vision-exp-tile,小图/像素级/整页文档走 picturereader);视觉端点与 OCR 环境可共享复用。不安装 picturereader 也完全不影响使用:本插件保持完全独立,所有协作探测失败自动回退,双方互不修改。
v0.4.1
本次更新完全由 DeepSeek Harness 自主完成。
背景与目标
解决"较差机型全量测试时 OCR 池超时导致测试不通过":慢机(核少/内存小)跑 OCR 池单测时,因时序抖动偶发超时失败。按用户三条建议实现——① 设置项可调超时判定;② 测试前先问用户是否测试;③ 安装时自动识别设备、较差机型特别处理。
新功能
- 设备档案模块(新增
src/device.js):probeDevice(CPU 核数/内存/GPU 名,GPU 用 nvidia-smi 1.5s 超时、失败返回 null,可 mock)、classifyTier(slow/normal/fast)、applyTierRecommendations(slow 放宽池超时到 240s、池并发降到 2、关 GPU、测试倍率×4;性能较好机器 ×2 不足以体现慢机差异,×4 给慢机留足余量,可手动到最保守的 ×8;normal/fast 保持默认)、deviceProfileText。 - 设置项新增 4 字段 + 1 只读:
ocr_pool_timeout_ms(20000..1200000,默认 120000,envDSH_OCR_POOL_TIMEOUT)——OCR 池单请求超时,可调;performance_tier(auto/fast/normal/slow,默认 auto,envDSH_OCR_PERF_TIER)——auto=自动探测,非 auto=用户强制;test_timeout_factor(1..8,默认 1,推荐 4=slow 档默认,手动最保守 8,envVISION_TEST_TIMEOUT_FACTOR)——测试超时判定倍率;test_skip_timing(boolean,默认 false,envVISION_TEST_SKIP_TIMING)——跳过时序敏感断言;device_profile(text,只读)——运行时设备画像摘要,自动填充。- 设置/运行时 4 层全链同步(settings-schema / config / runtime / client.js 双语 label),并保持"用户显式值 > 档位推荐 > 默认"。
- 慢机测试自适应:
- 新增
tests/helpers/suite-env.mjs(poolTimeoutMs/timingFactor/skipTiming); tests/ocr-pool.test.js默认超时与超时用例改按倍率放大,时序敏感用例用{ skip: skipTiming() }声明跳过(跳过时打印原因与建议);- 新增
tests/device.test.js(档位/推荐/注入/auto 应用)与tests/suite-env.test.js(边界:非法回退/clamp/布尔解析),并加入package.json的test显式列表。
- 新增
- 交互式自检入口(新增
scripts/self-check.mjs,npm run selfcheck):调probeDevice+档位打印设备画像与推荐;交互询问"是否运行全量测试?(Y/T/N)"(仅 TTY;参数--yes/--skip-timing/--no无人值守);以子进程跑node --test(读 package.json 显式列表),注入DSH_OCR_POOL_TIMEOUT/VISION_TEST_TIMEOUT_FACTOR/VISION_TEST_SKIP_TIMING,汇总退出码并给出慢机改善建议。 - 安装即优化(
scripts/install-to-web-profile.ps1):安装/更新流程末尾自动探测设备(调用node scripts/probe-device.mjs,输出 JSON),slow 档把调优键(ocr_pool_timeout_ms/ocr_pool/gpu_provider/test_timeout_factor)写入~/.dsh/settings.yaml的vision-exp-tile分区——仅未显式设置的键(幂等)、写入前备份到同目录.bak-时间戳、参数-NoDeviceTune跳过;无论与否都打印设备画像与推荐。找不到分区则提示不创建(不越权改其他文件)。 - 超时收敛:
ocr-local.js的gpuPoolTimeoutMs改读DSH_OCR_POOL_TIMEOUT(并导出ocrPoolTimeoutMs,兼容旧DSH_OCR_GPU_POOL_TIMEOUT);pipeline.js两处写死120000改由ocrPoolTimeoutMs()提供;index.js注册设置后异步设备探测,完成后重应用 env(auto+slow 无感简化)并回写只读画像。 - 设备微基准算力评级(A):
src/device.js新增cpuWorkload/runCpuBenchmark(纯 JS 轻量基准,预算 ~0.4s,归一化 0..2、1.0=参考机);probe增加benchScore/benchOpsPerSec;classifyTier用基准修正档位(<0.5 不判 fast、<0.3 且无 GPU 判 slow、基准不可用不影响原规则)。设置项device_benchmark(默认 true)可关。校准依据:本机 16 核 normal 基准约 3e8 ops/s(参考分 ~1.0),弱阈值 0.5/0.3 按经验分档。 - 电池/低功耗探测(B):新增
detectPowerState(win32 CIM 一次性查询BatteryStatus/ linux sysfs / mac pmset,1s 超时);probe增加onBattery;放电中且档位 fast/normal 自动应用省电推荐(池并发 2、测试倍率×2、gpuProvider off;slow 推荐不变),经computeRecommendations合并。设置项device_power_probe(默认 true)可关。 - ARM/WSL/容器降级(C):新增
detectPlatformInfo(os.arch + /proc/version 判 WSL + /.dockerenv|cgroup 判容器)与isPlatformDegraded;受限环境自动应用保守默认(块格式 jpeg、池并发 2、gpuProvider off),经normalizeFromSettings落地cfg.format。设置项platform_fallback(auto/on/off,默认 auto)。 - 慢网适配(D):slow 档自动把兴趣点并发降到 1(
DSH_INTEREST_CONCURRENCY)、视觉 API 单请求超时放大到 600s(normalizeFromSettings落地cfg.timeoutMs,默认 300s×2);仅未显式设置时生效(用户显式 > 推荐 > 默认)。设置项slow_net_adapt(默认 true)可关。 - 新设置字段汇总:
device_benchmark(bool)、device_power_probe(bool)、platform_fallback(enum auto/on/off)、slow_net_adapt(bool),设置/运行时/设置页双语全链同步;probe-device.mjs输出新增onBattery/platformInfo/benchScore/detectMs字段,self-check.mjs设备画像行新增 电池/平台/基准 三段。
验证
npm test:147/147 全绿(原 111 + device.test.js 32 项(本轮从 13 扩展,含档位/推荐/基准/省电/平台/慢网等)+ suite-env.test.js 4 项 + client-bundle 清单补 performance_tier/platform_fallback);VISION_TEST_TIMEOUT_FACTOR=2 npm test:147/147 仍全绿(倍率放宽窗口);VISION_TEST_TIMEOUT_FACTOR=8 npm test:147/147 仍全绿(模拟最保守慢机 ×8,性能较好的本机也无超时误报);VISION_TEST_SKIP_TIMING=1 npm test:146 通过 + 1 跳过(超时/时序敏感用例),0 失败;node scripts/self-check.mjs --yes:设备画像(本机 16 核/15.6GB/RTX 3050 Ti → normal,电池 交流 / 平台 x64 / 基准 0.96)→ 注入 120000/×1 → 147/147 通过;node scripts/probe-device.mjs:输出合法 JSON(含 onBattery/platformInfo/benchScore/detectMs);本机 tier=normal、onBattery=false、platformInfo={x64,WSL否,容器否}、benchScore≈0.96,detectMs 总耗时 440ms(≤2s)、微基准 402ms、GPU 439ms、电源 416ms、平台 0ms;install-to-web-profile.ps1的 slow 合并逻辑经临时 settings.yaml 验证:首次写入 4 调优键、已有键不覆盖、二次幂等、备份生成。
v0.4.0
本次更新完全由 DeepSeek Harness 自主完成。
新功能
- GPU 多设备加速(可选能力):
- 新增
DSH_OCR_ENGINE=gpu/auto引擎模式;新增设置项gpu_provider(auto/cuda/dml/openvino/off)、gpu_python、gpu_device、gpu_fallback(设置页「图像识别」分区同步 4 新字段 + ocr_engine 枚举加 Gpu); - DirectML 一个引擎覆盖 NVIDIA/AMD/Intel 全厂商(Windows);CUDA(NVIDIA 极致)/OpenVINO(Intel)可选;
auto自动探测 → 不可用自动回退 CPU(gpu_fallback可关); - 独立 GPU venv(rapid_gpu_venv,onnxruntime-directml 1.24.4 + rapidocr 1.4.4),不污染原 rapid_venv;
- 性能口径(务必如实):单进程实测 DML ~208ms vs CPU ~329ms(约 1.5×);但在插件 4 并发进程池模式下 DML 反慢于 CPU(端到端 DML 2604ms vs CPU 1307ms/张)→ 定位为"可选加速能力(默认不启用)",文档表述为"按需开启;多厂商显卡兼容;自动回退保底",禁止宣称"GPU 总体提速 X 倍";
- 新增
- 引擎选择增强:resolveEngine 支持 gpu/auto(默认 rapid 行为不变,向后兼容;设置页引擎下拉新增 Gpu/Auto)。
- 其余:ocr-pool 支持按引擎区分超时(GPU 冷启动放宽);runtime env 映射 4 个 DSH_OCR_GPU_* 键;worker 响应带 provider/gpu_device 调试信息。
验证
单测 111/111 全绿(原 96 + 新增 gpu.test.js 15 项);E2E:离线真实 OCR(DSH_OCR_CACHE=0)4/4;真机 4 轮(含 pipeline/region_crop/preview 真 API,API 14/20)4/4;GPU 冒烟四路径(dml/自动回退/off/auto)全过。
v0.3.1
本次更新完全由 DeepSeek Harness 自主完成。 补丁:修复 DSH 0.1.1-rc.2 兼容。
修复
- 设置分区内容空白(DSH 0.1.1-rc.2 兼容):升级 DSH 到 0.1.1-rc.2 后,客户端 settingsScope 不再提供 load() 方法;client.js 原无条件调用导致分区渲染异常。修复:if (typeof scope.load === "function") scope.load()(与 picturereader 3.0.6 同款防御),rc.7/rc.2 双兼容。
- 发布资产修正:release workflow 打包清单补上 client.js(v0.3.0 的 zip 曾漏打包设置界面文件);v0.3.0 资产补正(zip 已含 client.js)。
v0.3.0
本次更新完全由 DeepSeek Harness 自主完成。
新功能
- DSH Web 设置页「图像识别」分区(client.js,浏览器半侧手写 ModuleLoader bundle):可编辑插件全部配置,按「基础 + 高级折叠」分组展示;枚举用 select、布尔用 checkbox、数值用 number、文本用 text;保存=全部写入设置命名空间(数值转 number、布尔保留、空串 unset 走默认),重置=全部 unset 恢复默认。
- 设置命名空间 + schemastery schema(
src/settings-schema.js):SETTINGS_NS='vision-exp-tile',SettingsSchema用 z.object 描述全部 25 个字段(枚举、布尔、数值带 min/max/default、中文 description);SETTINGS_FIELDS为 client 与测试复用的扁平字段清单(key/type/labelKey/advanced/options/configKey/envKey)。 - 运行时快照 + 热生效(
src/runtime.js):setRuntimeSource/getRuntimeConfig(惰性重读实现改设置即生效);normalizeFromSettings把 snake_case 映射为 camelCase(base_url→baseURL 等)并经normalizeConfig归一化;优先级 = 工具参数(显式) > 设置页 > 默认值。 - env 映射:OCR 引擎/池/缓存/前处理/手写路由/升级/兴趣点并发等以
envFromSettings+applySettingsEnv写入DSH_*环境变量;仅在用户未显式设置时回退写入(用户 env 优先),设置改回默认时自动清理残留;池参数在下次工具调用生效。 - 设置分区自动暴露:dsh(
dsh-host-apiproxy>=0.1.0-rc.7)已改用settings.describe()枚举注册的命名空间、无硬编码WEB_SETTINGS_NAMESPACES白名单,故只需register()成功注册、设置客户端即可枚举到「图像识别」分区,无需任何额外暴露文件。 - 入口接入(
src/index.js):注册命名空间(base 用toSettingsBase(configRaw)保证 configRaw 与设置页正确分层);工具执行时经getRuntimeConfig()读最新配置(Proxy 转发);新增debug调试日志钩子。
设计要点
- 新的设置命名空间独立于旧 configRaw(DEFAULT_CONFIG);
toSettingsBase把 configRaw 的 camelCase 键转为 snake_case 作为第 2 层 base,避免 schema 默认值遮蔽用户显式写入的配置。 - 工具执行时经
getRuntimeConfig()惰性读取,参数覆盖 cfg(显式参数优先语义不变)。
验证
单测 93/93 全绿(原 73 + 新增 20:settings.test.js 12 项 + client-bundle.test.js 5 项 + 第 93 项为既有套件累计);覆盖设置 schema 键一致性、snake→camel 键映射、env 映射与热生效、运行时快照、client bundle 冒烟断言。
v0.2.0
本次更新完全由 DeepSeek Harness 自主完成。
新功能
- OCR 前处理管线(
src/preprocess.js,纯 pngjs 零新依赖):深底白字图自动反色、低对比图 Otsu 二值化、手写/小字 ≤2× 放大、百分位对比度拉伸;纯色/高对比印刷体自动跳过(零副作用),任何异常返原图; - 手写判别分流增强:前处理 + Paddle 高精度模型
DSH_OCR_MODEL=server(PP-OCRv4_server_rec,下载失败自动回退)+ 手写/低置信/深底失败区域自动升级视觉 API 转录(DSH_OCR_UPGRADE=full|low|off); - 新工具参数
preprocess(auto/off)与upgrade(full/low/off),向后兼容; - 手写判别分流(分类分流):每个文字区先判别是否手写——预检视觉标记(模型预检输出
isHandwrite)+ 本地启发式判别器(src/handwrite.js,笔画连通域密度/行投影起伏/笔画占比)smart 互验(分歧时视觉优先);手写区直接视觉 API 转录(逐行,看不清用(?)标注);非手写区高效本地 OCR 且不放大(省 ~60% 耗时);DSH_OCR_HANDWRITE=smart|visual|local|off。判别器 15 样本(5 手写+10 印刷)校准 100% 分离(手写 0.62-0.82 / 印刷 0.37-0.49,阈值 0.55);端到端验证:手写页文字区引擎=handwrite-api(逐行转录)。
性能权衡
默认前处理使本地 OCR 单张 ~0.45s → ~1.0-1.27s(换取深底/手写增益;DSH_OCR_PREPROC=0 关闭)。
验证
深底图 0→4 行;手写 5 张 47→58 行(×1.23);印刷体漏检 0/10;判别器 15 样本校准 100% 分离(阈值 0.55);单测 73/73;真机 4 轮 API 14/20。