dsh-read-image-compress: Compress images before read_image enters the session

前言

在 DeepSeek Harness(DSH)里,智能体通过内置 read_image 把本地或附件里的图片读进对话。模型对图片的计费与像素规模相关,大图还会占用上下文窗口并增加传输与解码成本。Harness 本身会对读图结果做一定处理,但若你希望在工具返回之后、写入会话之前再精细控制分辨率与文件体积,就需要在 tools/post-execute 链路上做后处理。

下面介绍社区插件 dsh-read-image-compress(维护者 etherfun),它对成功的 read_image 结果做可选的两段式压缩,并替换工具返回内容中的图片块与说明文字,使对话卡片、后续模型请求与会话历史都使用更小的附件。

这是什么

dsh-read-image-compress 是一个 DSH bundle:Host 端监听 tools/post-execute,浏览器端在侧边栏 Plugins 页对应插件行上提供配置界面。分类上属于「模型推理」相关能力——直接作用于进入模型的图片像素与 token 估算,而不是单独的推理引擎。

当前 package 版本为 0.15.0(MIT 许可证),要求 Node.js >= 22.13,DSH >= 0.2.1-rc.3 且 < 0.3.0-0。

核心功能

后处理流程

对一次成功的 read_image,插件会:

  1. 读取已存储的附件,按配置打开的两个阶段之一或全部执行——分辨率阶段(maxEdge、maxPixels、resolutionScale)与码率阶段(从 quality 向 maxBytes 阶梯压缩),优先使用当前安装环境中的 sharp / libvips;
  2. 通过 ctx.attachments.saveImage() 提交压缩后的字节;
  3. 替换工具结果的 content:保留 DSH 识别的图片 envelope 与模型可见文本,将图片块指向新附件,并在展开卡片底部追加一行原图/压缩后对比说明。

若运行环境无法解析 Sharp,会回退到 ctx.attachments.readImageRequest();仍可压缩,但该模式下 quality 与 format 设置不生效。

两个独立开关

设置页上分辨率与码率各有一个复选框,四种组合均合法:

分辨率 码率 行为
开 开 先缩到像素预算,再沿质量阶梯压到 maxBytes(默认,体积通常最小)
开 关 仅缩放;format: auto 时尽量保持源编码,JPEG/WebP 结果不超过源文件字节数
关 开 不改像素,仅重编码压到 maxBytes(细节保留、文件仍很大时可用)
关 关 不处理,结果与 Harness 读入时一致

README 说明:分辨率影响模型侧 token 估算(按像素而非字节);码率主要降低传输与解码成本。

卡片底部摘要

展开 read_image 行时,插件在图库下方追加类似一行(summaryMode: detailed 时):

原图: 4096×2600 · 3.90 MB · PNG | 压缩后: 1568×996 · 255 KB · WebP | 压缩比: 15.7×(体积 ↓93.7%,分辨率 ↓61.7%) | ≈938 tokens

其中 ≈N tokens 按 DeepSeek 官方图片 token 算法估算(14 px patch、3× 下采样、单图约 1024 token 上限等),仅作参考;其他厂商计费规则可能不同。可通过 summaryMode(detailed / compact / off)与 summaryLanguage(zh / en)调整展示。

插件页预览

配置卡片会在参数变更(防抖)后,用同一张样图并排展示三列:原图、Harness 原生压缩、当前插件参数下的结果;Host 提供 POST /api/read-image-compress/preview,与 hook 使用同一套 sharp 逻辑。可上传自定义图片(POST /api/read-image-compress/source,单文件解码上限 64 MP、请求体 16 MiB),或继续使用仓库样图(安装后从 GitHub / jsDelivr 拉取,失败时可能改用 Bing 每日壁纸作为占位预览)。

安装与启用

DSH 生态采用「一切皆插件」;社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系,安装前请自行查看源码与许可证。插件以当前 dsh 进程权限运行,会读写附件存储并调用本机图像库。

README 中针对 web profile 的安装方式为从 registry 安装,与其他插件相同:

dsh plugin --profile web add dsh-read-image-compress

若本地有开发副本并希望链接安装(改代码即生效),README 示例为:

dsh plugin --profile web add "link:F:\dev\github\dsh-read-image-compress"

(请将 link: 后的路径换成你本机仓库目录。)

包声明 dsh.bundle.patch,DSH 会把 bundle 写入 profile;cordis.patch.yml 插入配置行,插件页修改会写入同 id 的可写配置层。

典型用法

在 Plugins 页调参

打开侧边栏 Plugins,点击 dsh-read-image-compress 行。设置卡片在包描述下方,无需二级 Configure 页;保存为一次原子更新,下一次 read_image 即使用新值。字段均为 .volatile(),改完无需重载 Host。

通过 cordis.patch.yml 写默认配置

与页面相同的字段可写在 bundle 配置中,例如:

- id: read-image-compress
  config:
    enabled: true
    compressResolution: true
    compressBitrate: true
    quality: 85
    resolutionScale: 1
    format: auto
    maxEdge: 1568
    maxPixels: 1690000
    maxBytes: 524288
    minBytes: 131072
    minResizeScale: 0.9
    webpEffort: 4
    jpegBackground: '#ffffff'
    cacheEntries: 128
    downscaleWebp: true
    skipGif: true
    summaryMode: detailed
    summaryLanguage: zh

常用含义简述:

  • maxPixels 默认 1690000(约 1300×1300),README 说明这与 DeepSeek 对大图 token 化的目标量级一致;仅限制长边时,方图仍可能占满 token 预算。
  • maxBytes 默认 524288(512 KiB);PNG _lossless 路径无法靠 quality / maxBytes 强行缩小。
  • minBytes 默认 131072:已足够小且无需缩放时会跳过处理。
  • skipGif 默认 true:GIF 不处理;设为 false 时只编码首帧。

安装并 enabled: true 后,无需改智能体提示词:Agent 照常调用 read_image,插件在 post-execute 阶段自动介入。

适用场景与注意

适合:频繁读入截图、设计稿、照片等大图,希望在会话与后续请求里统一使用更小附件,并在 UI 里直观看到压缩比与 token 估算。

注意:

  • 只影响新的 read_image 调用;已有附件与会话历史不会被改写。
  • 每次压缩增加一次解码+编码;同一 Host 进程内对相同源与设置有 LRU 缓存(cacheEntries,默认 128)。
  • 若其他 tools/post-execute 监听器已阻止或替换结果,本插件不会覆盖其决策。
  • format: jpeg 会把透明通道铺到 jpegBackground 上;需要透明时用 auto 或 webp。
  • GIF、已足够小的图可能无 footer(未重编码时)。

结尾

dsh-read-image-compress 在 Harness 内置读图流程之后追加可配置的分辨率与码率压缩,并把更小附件写回工具结果,同时用一行摘要对照原图与压缩结果,便于控制 token 与带宽。进一步了解实现与基准数据可见仓库内 docs/design.md、docs/benchmark.md。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye