用 dsh-vision-proxy 讓 DeepSeek Harness 裏的純文本對話也能識圖

前言

DeepSeek Harness(dsh)是 DeepSeek AI 開源的智能體框架,官方倉庫把架構概括成一句話:一切皆插件。模型適配器、工具、會話、界面都可以替換,不必改框架源碼。社區裏還有一份獨立的插件目錄站點(deepseek-harness-plugin.com),用來檢索帶 dsh-plugin 話題的倉庫。它和 DeepSeek / 幻方沒有官方從屬關係,不要把它當成官方應用商店。

在 Web 界面裏貼一張截圖,是很常見的操作:報錯畫面、設計稿、表格、表情包。問題出在模型能力聲明上。Harness 會按當前模型的 inputModalities 決定是否放行圖片附件;DeepSeek 的 chat-completions 線路是純文本的,選中它再附加圖片,會被原生拒絕。社區裏已有提供 view_image 一類工具的視覺插件,適合文件路徑,但 GUI 裏直接附加的圖片,對純文本模型依然過不去

dsh-vision-proxy 補的就是這個缺口:識圖交給視覺模型,對話仍然由 DeepSeek 作答。

這是什麼

dsh-vision-proxy 是一款界面增強插件,由 Flyvhidbwo 維護,許可證爲 MIT,主要語言是 JavaScript。本文覈對時,GitHub 倉庫版本爲 0.2.5,聲明需要 Node.js >=22.19.0、DeepSeek Harness >=0.1.0-rc.6。社區目錄頁分類爲「界面增強」;星標以倉庫爲準,覈對時 GitHub 顯示 10 星(目錄頁當時顯示 7 星,存在滯後)。

它做的事情可以概括成一條鏈路:

用戶附加圖片 ──▶ deepseek-vision 路由 ──▶ 經 VLM 轉譯(OCR + 版式 + 細節)
                   │                        │
                   ▼                        ▼
            DeepSeek 作答 ◀── 純文本對話(圖片已替換爲 [圖片轉譯] 文字)

插件會註冊一條新的提供商路由 deepseek-vision,包裝真正的 DeepSeek 適配器。對外它聲明支持圖片輸入,附件預檢因此放行;請求真正發出前,每張附加圖片會先經 OpenAI 兼容的視覺語言模型(VLM)轉成文字,再交給 DeepSeek。對話大腦還是 DeepSeek,識圖只是附加能力。

倉庫 README 把痛點寫得很直接:工具型視覺插件解決的是「按路徑讀圖」,解決不了「在輸入框裏粘貼圖片」。這個插件針對的是後一種。

核心功能

不換大腦,只補眼睛

默認包裝的內部適配器是 deepseek-official,模型選擇器裏顯示爲 DeepSeek + 自動識圖。純文本消息不會被攔截,直達 DeepSeek;只有帶圖片塊的消息纔會走轉譯。原生 read_image 工具在這條路由下同樣可用,因爲它讀的是同一份模型能力信息。

任意 OpenAI 兼容端點

轉譯端點只要講 /chat/completions 即可。倉庫列出的常見組合如下:

場景 baseURL 模型示例
阿里雲百鍊(國內,默認) https://dashscope.aliyuncs.com/compatible-mode/v1 qwen3.7-flash / qwen3-vl-flash
本地 Ollama(自動探測) http://localhost:11434/v1 本機第一個視覺模型
QwenCloud(國際) https://dashscope-intl.aliyuncs.com/compatible-mode/v1 qwen3-vl-plus
智譜 https://open.bigmodel.cn/api/paas/v4 glm-4.6v-flash
其他兼容端點 你的地址 OpenRouter、火山 Ark、vLLM、自建網關等

默認主模型是百鍊的 qwen3.7-flash。密鑰讀取順序是:配置裏的 apiKey → 環境變量 $VISION_API_KEY$DASHSCOPE_API_KEY。沒有密鑰的非匿名條目會被跳過,而不是整條鏈路失敗。

fallbackModels 裏每一項都可以帶自己的 baseURL / model / apiKey,一次安裝就能把多家端點串成降級鏈。

沒有密鑰時走本地,而不是卡死

autoLocalOllama 默認開啓。啓動時探測 http://localhost:11434,發現 Ollama 就自動加入降級鏈,圖片不出本機。沒有密鑰、也沒有本地 Ollama 時,轉譯會在數秒內失敗,並提示去配置密鑰或安裝 Ollama,而不會靜默掛起。

倉庫明確寫了:不再內置任何第三方匿名免費端點作爲默認兜底。作者說明,實測中這類端點(例如 OVHcloud AI Endpoints)限速很嚴,還可能無響應掛起。如果仍要使用匿名端點,需要自己寫進 fallbackModels,並設 anonymous: true。匿名端點會強制 20 秒超時上限;遇到 HTTP 429 立即失敗,不做 Retry-After 等待;剛失敗的端點進入 60 秒冷卻。

安裝時問一句,啓動時標明端點

postinstall 會問:你有 VLM API key 嗎?回答 y 走付費快速通道,默認 N 走本地 / 零配置路徑。非交互環境(CI、沒有 TTY)會自動跳過,安裝本身不會卡住。啓動時會打印一行摘要(路由 id、被包裝的提供商、VLM 模型、端點、超時、key 來源等,密鑰本身不打印),以及 PRIVACY NOTICE,標明當前把圖片發到哪裏。

緩存與大圖處理

轉譯結果按圖片字節的 SHA-256 做進程內緩存,上限 200 條,不落盤。同一張圖在當前進程裏最多轉譯一次,重新附加或換對話也能命中。

可選依賴 sharp 裝上之後,超過 maxImagePixels(默認 400 萬像素)的圖會在轉譯前自動縮小;沒裝則原圖直髮。密集 UI 截圖仍可能丟掉小字,這是視覺模型能力上限,不是插件邏輯錯誤。OCR 很重的場景,倉庫建議換成更強的模型(例如 qwen3-vl-plus),或調大 maxTokens(默認 4096)。

安裝與啓用

社區目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端中運行即可:

dsh plugin add github:Flyvhidbwo/dsh-vision-proxy

如需可復現安裝,按目錄頁說明固定 commit 哈希:

dsh plugin add github:Flyvhidbwo/dsh-vision-proxy#<commit>

倉庫 README 還提供了針對 web profile、從 npm 安裝的寫法(本插件主要掛在網頁界面的模型選擇器上,一般走這條):

dsh plugin --profile web add dsh-vision-proxy

國內訪問 npm 官方源較慢時,可以把鏡像參數轉發給 pnpm:

dsh plugin --profile web add dsh-vision-proxy --registry=https://registry.npmmirror.com

pnpm 10 及以上默認攔截依賴的構建腳本。第一次安裝可能以非零碼退出,並提示 Ignored build scripts: dsh-vision-proxy, sharp。需要在該 profile 的 pnpm-workspace.yaml 裏批准二者,然後重跑一次安裝,bundle 纔會註冊完成:

allowBuilds:
  dsh-vision-proxy: true
  sharp: true

如果碰到 pnpm 11 的 ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION(新版本發佈未滿一天),倉庫給出的處理是:在同一文件里加 minimumReleaseAge: 0,或給 dsh plugin add 加上 --config.minimum-release-age=0,再重跑。

插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。安裝前應檢查源代碼倉庫和許可證。

典型用法

  1. 安裝完成後重啓 dsh web
  2. 在模型選擇器裏選中 DeepSeek + 自動識圖(對應路由 id deepseek-vision)。這一步不能省:只有這條路由對外聲明瞭圖片輸入,附件預檢纔會放行。
  3. 把圖片粘貼進對話,配一句問題即可。

倉庫 README 裏有一段示例:在 deepseek-vision 路由上,以 DeepSeek-V4-Flash 爲大腦,用戶粘貼一張表情包並問「你看到了什麼」。圖片先被 VLM 轉成帶 OCR 和版式的文字,DeepSeek 再基於這段文字作答;文檔寫的是單步、大約 7.6 秒。轉譯文本前會帶上默認標記 [圖片轉譯]

安裝後可用下面的命令確認配置裏只有一條插件記錄。注意:--dump-config 會明文打印配置,其中可能包含密鑰。

dsh --profile web --dump-config | grep -A3 dsh-vision-proxy

驗收標準按倉庫說明是:

  • 模型選擇器出現 DeepSeek + 自動識圖
  • 粘貼圖片後,先看到 [圖片轉譯],再由 DeepSeek 作答。
  • 沒有密鑰、也沒有本地 Ollama 時,回合應在數秒內失敗並給出指引。這是預期的防卡死行爲,不是安裝損壞。

需要改配置時怎麼寫

bundle 已帶默認值,多數情況不用改。要覆蓋時,在 $DSH_HOME/profiles/web/cordis.patch.yml 裏用 id 定向覆蓋,不要用 insert

- id: dsh-vision-proxy
  name: 'dsh-vision-proxy'
  config:
    baseURL: https://dashscope.aliyuncs.com/compatible-mode/v1
    apiKey: 'sk-…'          # 也可留空,改讀環境變量
    model: qwen3.7-flash
    maxTokens: 4096
    timeoutMs: 120000
    maxImagePixels: 4000000
    marker: '[圖片轉譯]'
    autoLocalOllama: true
    fallbackModels: []

倉庫特別提醒:dsh 的 patch 語義裏,insert 是往列表追加。寫成 - insert: [{id: dsh-vision-proxy, …}] 會讓 bundle 自帶條目和用戶條目同時實例化,deepseek-vision 適配器註冊兩次,行爲未定義。頂層 - id: 纔會命中已有行並整體替換 config;沒寫的鍵回落到插件 schema 的默認值,所以只寫 apiKeymodel 也可以。

Windows 上還有一個已記錄的坑:資源管理器會緩存環境變量,進程啓動後再導出的 $VISION_API_KEY 可能到不了正在運行的 dsh,日誌裏會看到 skipped — no API key。倉庫的建議是把 apiKey 直接寫進插件配置。另外,dsh rc.6 不加載 .env 文件,不能靠它繞過。

適用場景與注意事項

適合這些用法:

  • 繼續用 DeepSeek 寫代碼、改文案、做推理,但偶爾需要看截圖、表格或示意圖。
  • 希望 GUI 裏直接粘貼圖片,而不是先存盤再調 view_image
  • 國內有百鍊 / 智譜密鑰,或本機已經在跑帶視覺能力的 Ollama。
  • 需要把多家 VLM 串成降級鏈,而不是綁死一家。

使用前要清楚邊界:

  • 圖片會離開本機,除非 baseURL 指向本地服務(例如 Ollama)。轉譯以 base64 經 HTTPS 發到配置的 VLM 端點。敏感截圖應走自己的端點或本地模型;不能接受這一點,就不要裝。
  • 插件以當前 dsh 進程權限運行,能讀工作區文件、用已有憑據、訪問網絡。工具審批框不會把它沙箱化。
  • 社區目錄不是 DeepSeek 官方商店。安裝命令以目錄頁原文爲準,來源以 GitHub 倉庫爲準。
  • 價格會變。倉庫 README 給出的是 2026 年 8 月百鍊國內站參考:一張約 1080p 的截圖按約 2000 token 估算,qwen3.7-flash 大約幾釐錢量級;以控制檯即時標價爲準。本地 Ollama 不產生這份費用。
  • DeepSeek Harness 仍處於開發者預覽,官方倉庫寫明後續可能出現破壞兼容性的變更。本插件聲明基於 rc.6 的公共接口(ctx.llm.registrationregisterAdapter、代理 resolveModel / stream)。

小結

dsh-vision-proxy 不把 DeepSeek 換成多模態模型,而是在 GUI 附件這一層補了一座橋:圖片先變成帶 [圖片轉譯] 標記的文字,再進入原來的純文本對話。有密鑰走百鍊等兼容端點,沒密鑰則嘗試本機 Ollama;兩者都沒有就快速失敗,而不是把一輪對話卡死。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-vision-proxy/

GitHub:https://github.com/Flyvhidbwo/dsh-vision-proxy

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

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

小夜