dsh-send-photos:讓 DSH 接收未被聲明爲多模態的圖片

前言

DeepSeek Harness(DSH)在判斷一個模型能否接收圖片時,只讀取 llm-pi-ai 解析出的模型元數據。中轉站的 /v1/models 通常不返回模態信息,配置裏於是沒有 input 字段,默認值是 ["text"]。圖片在到達上游之前會被本地兩道閘門攔掉:

  • 會話准入:dsh-api-session-controller 的 prompt() 方法返回 session/attachment-invalid,原因標記爲 MODEL_DOES_NOT_SUPPORT_IMAGES。
  • 請求適配:dsh-llm-pi-ai 的 streamWithSnapshot() 拋出 LlmError,類型爲 UNSUPPORTED_CONTENT。

即使上游模型本身支持圖片,DSH 也會在用戶按下發送時直接拒絕。

這是什麼

dsh-send-photos 是一個 DSH bundle 包(dsh.bundle.patch),用於補全那些收得下圖、卻沒有聲明多模態能力的中轉站/反代路由的輸入聲明。插件在 adapter 的 modelOf() 方法外面套一層,對管轄範圍內的路由,把缺失的 image 補進 input。

維護者:Ayowait

分類:模型推理

核心價值:讓 DSH 不再因爲缺少模態聲明而拒絕圖片,從而兼容更多中轉站配置。

核心功能

插件對管轄範圍內的路由,在解析模型元數據後,將 image 加入 input 列表,使 DSH 允許圖片通過。具體行爲:

  • 不修改請求體:圖片仍以標準 OpenAI image part 格式發出,不做編碼、拆分或僞裝。
  • 不修改配置文件:不觸碰 cordis.patch.yml、settings 文檔或 profile 文件。
  • 可逆:卸載時將 modelOf 原樣還原。
  • 只作用於存在 modelOf 的適配器(pi-ai 路由,如 api: openai-completions)。官方 DeepSeek 賬號路由走另一適配器,不受影響。
  • 監聽 llm/adapters-updated,對後掛載的路由和後續新增的模型同樣生效。

安裝與啓用

這是一個 DSH bundle 包,不是普通 npm 腳本。安裝方式如下:

# 桌面版:在插件管理器裏以本地目錄安裝,或
dsh plugin --profile <你的 profile> add link:<本目錄絕對路徑>

安裝後,profile 的 package.json 會增加一條依賴,Loader 裏會加載 dsh-send-photos。

卸載方式:

dsh plugin --profile <你的 profile> remove dsh-send-photos

配置示例

- id: dsh-send-photos
  name: dsh-send-photos
  config:
    providers: []          # 要覆蓋的 route;空數組 = 全部已掛載路由
    modalities: [text, image]
    enabled: true

若只想作用於某個中轉站,可縮小範圍:

    providers:
      - my-relay

適用場景與注意

  • 該插件用於補聲明,而非增強上游能力。如果上游模型確實不支持圖片,請求會在上游失敗,此時應將該 route 從 providers 中排除。
  • 顯式寫了 ["text"] 的模型也會被覆蓋(解析後無法區分“聲明爲純文本”和“沒聲明”)。如果某個 route 上有這類模型,用 providers 縮小範圍,或只保留需要的那條。
  • 依賴 llm-pi-ai 路由(api: openai-completions 這類)。若將來 DSH 改了適配器內部方法名,插件會打一條 warn 並保持無害的空轉。
  • 在 DSH 0.2.1-rc.2 上驗證通過。

結尾

dsh-send-photos 讓 DSH 能夠兼容那些缺少模態聲明的中轉站配置,從而在本地完成補全後再向上游發送標準 OpenAI image part 請求。如需查看源碼或提交問題,可訪問:

  • GitHub:https://github.com/Ayowait/dsh-send-photos
  • 目錄頁:https://www.skillhub.cn/plugins/Ayowait/dsh-send-photos
羽毛球分组比赛记分
小程序二维码

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

小夜