前言¶
在 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。