dsh-webp-relabel:把 DSH 的 WebP 请求图重标记为 PNG,让本地视觉服务收图

前言

在 DeepSeek Harness(DSH)里粘贴截图、再选本地 OpenAI 兼容视觉模型(例如 LM Studio、llama.cpp)时,请求有时会直接失败,报错类似 'url' field must be a base64 encoded image.。图片字节本身能解码,问题往往出在 MIME 标签:DSH 归一化附件后会把带 alpha 的截图存成 WebP,而 dsh-llm-pi-ai 会把 readImageRequest() 返回的 mediaType 原样写进 data:image/...;base64,...。部分本地服务只接受 PNG/JPEG 标签,于是整条调用被拒。

下面介绍社区插件 dsh-webp-relabel(维护者 lilinhua0413)。它在不转码的前提下,把 DSH 准备好的 WebP 请求图只改标签为 image/png,使 LM Studio、llama.cpp 等本地视觉端愿意处理同一份 base64 载荷。插件在 DSH 社区目录中归类为联网工具;仓库当前星标为 0,许可证 MIT(见 package.json)。

这是什么

dsh-webp-relabel 是一个 Cordis 补丁型 DSH 插件:包装 attachments 服务的 readImageRequest(),在返回对象里把 mediaType 从默认的 image/webp 换成 image/png,像素数据不变。

它针对的是 DSH 内置链路里的固定行为,而不是某个云端 API:

  • dsh-attachment-local 归一化时按 alpha 选容器:hasAlpha ? "image/webp" : "image/jpeg",截图通常走 WebP。
  • 请求图 ladder 只有 alpha:webp 与 opaque:jpeg,没有 PNG 档位,也没有对应配置项。
  • 适配器从 readImageRequest(...).mediaType 取标签,而不是从消息块上的 ImageBlock.attachment.mediaType 取,因此只改消息内容无效。

插件以当前 DSH 进程权限运行;安装前建议在 GitHub 上阅读源码与 cordis.patch.yml,确认符合你的环境与合规要求。

核心功能

重标记而非转码

实现上等价于在 readImageRequest() 包装层返回:

return { ...version, mediaType: 'image/png' };

仓库 README 中的诊断脚本 test/diagnostics/relabel-vs-transcode.py 在 LM Studio 上对比过几种组合:WebP 字节配 image/webp 会 HTTP 400;同一 WebP 字节配 image/png 会 HTTP 200,模型能正确理解画面。说明这些本地服务主要校验标签,不必为了兼容而做 sharp / sips 转码。

test/diagnostics/vision-read.py 还验证了模型确实「看见」图:以 image/png 名义发送的 WebP 里绘制的文字能被读对。

补丁如何挂上去

三个实现细节在 README 里写得很明确,且与 DSH 内部行为一致:

  1. 必须 hook readImageRequest:OpenAI 兼容适配器的 MIME 来自该方法返回值,改聊天消息里的附件描述不会改变线上载荷。
  2. 下一次请求即生效:适配器通过 resolveAttachments: () => ctx.get("attachments") 每次解析服务,无需重启 DSH 或新开会话。
  3. 改原型而非实例:ctx.get() 返回 Cordis 的 traceable Proxy,实例级赋值可能被 shadow receiver 吞掉;挂在原型上的方法才能被稳定拦截。

对用户可见的附件句柄文案仍来自 ref.mediaType,不会误报成 PNG,存储层仍准确描述 WebP。

可配置项

默认把 image/webp 换成 image/png,并开启一行调试日志。仅在需要覆盖时在 profile 的 cordis.patch.yml 中追加 config 块(bundle 已带默认值):

- id: dsh-webp-relabel
  name: 'dsh-webp-relabel'
  config:
    from: image/webp     # 要替换的标签(默认)
    to: image/png        # 替换后的标签(默认)
    debug: true          # 每张重标记图打一行日志(默认)

安装与启用

DSH 生态是「一切皆插件」;SkillHub 目录页 是社区索引,与 DeepSeek / 幻方无官方从属关系。以下安装方式均来自仓库 README,请把 <your-profile> 换成你的 profile 名。

从 Release 包安装(无需 npm registry)

在 GitHub Releases 下载 dsh-webp-relabel-1.0.0.tgz,然后:

dsh plugin --profile <your-profile> add /path/to/dsh-webp-relabel-1.0.0.tgz

从 npm 安装

dsh plugin --profile <your-profile> add dsh-webp-relabel

本地目录 link(README 已实测)

在插件管理里指向目录(bundle 自带 cordis.patch.yml 注册 loader 行;在 DSH 0.2.1-alpha.2 上观测到 install_bundle 不会单独插入行,因此需要 bundle 自带 patch):

plugin_manager install_bundle   target = link:/absolute/path/to/dsh-webp-relabel

纯手工写入 patch

在 profile 的 cordis.patch.yml 中插入:

- insert:
    - id: dsh-webp-relabel
      name: 'dsh-webp-relabel'

运行环境要求 Node >=22.19(见 package.json 的 engines)。

典型用法与验证

启用插件后,正常使用 DSH 多模态聊天:粘贴截图、选择本地 OpenAI 兼容视觉模型即可,无需额外 API 调用。

建议先保持 debug: true,在 DSH 控制台确认每张图被重标记,例如:

[dsh-webp-relabel] relabel #1: image/webp -> image/png (1200x800px, 84521B, ref sha256:...)

同时可在模型服务自己的请求日志里检查载荷是否为 "url": "data:image/png;base64,...",而不是 image/webp。

适用场景与注意

适合谁

  • 在 DSH 里用 LM Studio、llama.cpp 等本地 OpenAI 兼容视觉端,且因 WebP 标签被拒的用户。
  • 希望最小改动、接受「标签与容器不一致」这一权衡的开发者(README 明确:对只校验标签的服务有效)。

局限(来自 README)

  • 字节仍是 WebP,标签写 PNG。若上游严格校验文件魔数,仍会失败,那时应做真实转码而不是 relabel。
  • readImageRequest() 看不到路由目标,插件对所有 provider 生效;若只想作用于本地路由,需要额外的 llm/stream 监听并按 options.provider 限定。
  • 依赖 DSH 内部的 attachments 服务及其原型上的 readImageRequest;DSH 大版本升级后若失效,优先检查这两处。

关闭方式

在 DSH 插件管理器中禁用插件,或将配置设为 to: image/webp。README 说明会从保存的描述符恢复原始 readImageRequest,补丁可逆。

结尾

dsh-webp-relabel 用一行级别的 MIME 重标记,补上 DSH 请求图 ladder 没有 PNG 档位、本地视觉服务又只认 PNG/JPEG 标签之间的缝隙。若你的痛点是截图进本地视觉模型报 base64 图片字段错误,可以先按上文安装并在 debug 日志里确认 image/webp -> image/png。

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

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

小夜