前言¶
在 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 内部行为一致:
- 必须 hook
readImageRequest:OpenAI 兼容适配器的 MIME 来自该方法返回值,改聊天消息里的附件描述不会改变线上载荷。 - 下一次请求即生效:适配器通过
resolveAttachments: () => ctx.get("attachments")每次解析服务,无需重启 DSH 或新开会话。 - 改原型而非实例:
ctx.get()返回 Cordis 的 traceableProxy,实例级赋值可能被 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。