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。

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

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

小夜