dsh-auto-image-optimizer
zyf2492313716-cloud/dsh-auto-image-optimizer
DSH 图片上传前客户端等比压缩插件:拦截剪贴板粘贴与拖拽上传的图像,在内存中用 Canvas 将最长边超过 1999px 的图片等比缩放后再投递,并在未冻结的旧宿主上尝试放宽 maxImageDimension 至 4096。
安装
dsh plugin --profile web add github:zyf2492313716-cloud/dsh-auto-image-optimizerREADME
dsh-auto-image-optimizer
DeepSeek Harness (DSH) 客户端大图自动等比缩放与附件限制优化插件。
在浏览器端拦截超大截图(如 Mac Retina 2x/3x 全屏截图),在内存中等比下采样后再上传,避免触发 DSH 的图片准入拦截,同时显著减小上传体积。
背景
-
Retina 截图很大:macOS 视网膜屏按 2x/3x 渲染,全屏或大窗口截图单边尺寸常在 2800px ~ 6000px 量级,文件也大。
-
DSH 有两道准入闸(
packages/attachment/attachment-local,两个都是可配置项):- 单边像素上限
maxImageDimension,默认 8192px - 解码后总像素上限
maxImagePixels,默认 64,000,000
超限时前端会提示
图片宽高不能超过 {size}px,请缩小后重试({size}填入当时的上限值)。 - 单边像素上限
本插件在前端输入层做事件拦截,把超限图片等比下采样至 1999px 以内再交给上传流程,用户复制粘贴即发,不必手动裁切或压缩。
版本提示:早期 DSH 的单边上限是 2000px,本插件的 1999px 目标值就是从那时来的。 现在默认已放宽到 8192px,因此只有超大截图才会真正触发拦截——但下采样仍有两个实际 收益:明显更小的上传体积,以及不依赖服务端上限恰好被调高。
如果你的图片确实需要保留 8192px 以上的原图细节,正确做法是调整服务端配置项 (
maxImageDimension/maxImagePixels),而不是在前端绕开——本插件只做缩小,不做放大。
工作机制
- 全局事件捕获:在捕获阶段同步拦截
paste(剪贴板粘贴)与drop(拖拽上传)事件; - 内存平滑下采样:检测到单边超过 1999px 的图片时,利用离屏 Canvas 保持高清晰度等比缩放;
- 单次安全分发:生成合规的图片 Blob 后重新派发合成事件,杜绝重复上传。
系统要求
- DeepSeek Harness (
dsh)>=0.1.2;逐版本兼容记录与取证方式见下面「验收状态」 - Node.js
^22.19 || >=24 - macOS / Linux / Windows;Profile:
web
权限与边界
| 权限 | 用途 | 范围 |
|---|---|---|
| 文件 | 无 | 只处理浏览器内存中的图片 Blob,不读写本地文件 |
| 网络 | 无 | 不发起网络请求 |
| 命令 | 无 | 不执行子进程或 Shell |
| 凭据 | 无 | 不读取 API Key、Cookie 或任何凭据 |
插件以浏览器端下采样为主;服务端仅在附件服务暴露可写 imageLimits 时尝试把 maxImageDimension 放宽到 4096px(属性冻结时跳过),不修改 DSH 核心、官方包或任何配置文件。
安装
方式一:一键脚本(推荐)
git clone https://github.com/zyf2492313716-cloud/dsh-auto-image-optimizer.git
cd dsh-auto-image-optimizer
./install.sh
安装脚本会自动将产物同步至 $DSH_HOME/plugins/,并在 $DSH_HOME/cordis.patch.yml
(home 级 patch 层,对所有 profile 生效)中注册挂载条目,原文件会先备份。
如果你之前用旧版脚本装过:旧脚本把条目写进了
$DSH_HOME/config.yaml,而 0.2 起 没有任何代码读那个文件——写进去不报错,但插件永远不会加载。重新执行一次./install.sh即可补上正确的条目。脚本用绝对路径注册(不依赖 profile 的包解析), 因此在 web / desktop 任一 profile 下都能加载。
方式二:DSH 插件命令
dsh plugin --profile web add .
安装完成后,重启 dsh web 并刷新浏览器页面生效。
卸载
cd dsh-auto-image-optimizer
./uninstall.sh
验证状态
- 已验证:manifest/Bundle Patch 解析、客户端粘贴缩放测试(4000×3000 → 1999×1499)、DSH
0.2.1-rc.5一次性 Profile 安装与 bundle 加载。 - 未验证:真实桌面浏览器中的手工粘贴、卸载/回滚。
dsh.compatibility.dshReleases 各行的证据
| 版本 | 证据级别 | 依据 |
|---|---|---|
0.2.1-rc.5 | 运行验收 | 一次性 Profile 安装 + bundle 加载通过;本机宿主即 0.2.1-rc.5 |
0.2.2-alpha.2 | 契约核对 | 见下 |
0.2.2-alpha.3 | 契约核对 | 见下 |
0.2.2-rc.1 | 契约核对 | 见下 |
契约核对的做法:取 @deepseek-ai/dsh@<版本> 在 npm 上的固定发布物闭包,逐个解包检查本插件用到的宿主接口是否仍存在——attachments、imageLimits、maxImageDimension(本插件只把 imageLimits.maxImageDimension 抬到 4096)与扩展点 settings.general.item、window.__ModuleLoader__。四个版本结果一致:maxImageDimension 恒在 @deepseek-ai/dsh-tool-fs 与 dsh-tool-cordis,attachments 的归属包在四个版本间完全相同,没有任何一个 token 消失或改名(只有新增引用方)。
这一级证据不等价于在新版本上做过的安装/启动/卸载验收。之所以没做:npm i @deepseek-ai/dsh@0.2.2-rc.1 在匿名 npm 下无法解析——依赖闭包里 @deepseek-ai/dsh-desktop-host@0.2.1-rc.5、@deepseek-ai/cordis、@deepseek-ai/cordis-plugin-*、@deepseek-ai/schemastery、@deepseek-ai/dsh-official-bundles、@deepseek-ai/dsh-personalized-recommendations 等发布物对公网返回 404,装不起来自然跑不了 CLI 的安装/卸载。有内部源权限的人可以补这一级证据。
License
MIT