前言¶
在 DeepSeek Harness(DSH)裏用 DeepSeek 這類純文本模型當主模型時,有一個繞不開的限制:Harness 默認不允許向「當前模型不支持圖片」的會話發送帶圖消息。想讓模型看一張報錯截圖、一段界面佈局或一張表格照片,要麼自己先把圖裏的內容轉成文字再發過去,要麼換一個多模態主模型。
dsh-eyes 提供了另一種做法:圖片照常粘貼和發送,留在後臺持久化保存;主模型在自己需要的時候調用 view_image 工具看圖,識別部分由任意 OpenAI 兼容的視覺接口完成(默認百鍊 Qwen)。對使用方式來說,效果接近模型原生具備多模態。下面介紹它的功能、安裝和用法。
這是什麼¶
dsh-eyes 是 DeepSeek Harness 的一個插件,作者是 Leeminjing,以 MIT 協議開源,在社區目錄裏歸在「模型推理」分類下。它解決的問題很具體:讓帶圖消息在純文本主模型的會話裏能通過發送准入、被持久化保存,並且模型能按需查看。
DSH 的理念是「一切皆插件」,能力補齊交給插件來做。dsh-eyes 就屬於這一類:不改主模型、不加開關,把「看圖」做成一個模型可以隨時調用的工具。
核心功能¶
- 發送准入放行:讓帶圖消息能通過發送准入檢查並被持久化保存;
- 派發前剝離圖片:把請求裏的圖片塊換成帶序號的引用說明(
【圖片N attachment_id=…】),主模型收到的是純文本; view_image工具:支持按單個attachment_id、attachment_ids數組一次看多張,或用本地image_path讀圖;- OpenAI 兼容視覺接口:同時支持 Chat Completions 與 Responses API,由
VISION_API_STYLE(auto/chat/responses)控制; - 會話隔離與持久化:圖片引用索引按
sessionId分片,持久化到.dsh/attachments/v1/dsh-eyes-index.json,重啓或上下文壓縮後仍能通過attachment_id查看歷史圖片; - 主模型自動適配:任何純文本主模型(不限 provider)自動被保護;本身原生支持圖片的多模態主模型不受干預。
安裝與配置¶
先安裝插件,再配置視覺接口的環境變量,最後重啓 dsh。以 Windows 爲例,完整步驟如下:
# 1) 安裝插件(github 方式,也可以換成 npm 包名)
dsh plugin --profile web add github:Leeminjing/dsh-eyes
# 2) 配置 API Key(換成你所用視覺提供商的 key)
setx VISION_API_KEY "sk-你的key"
# 3) 配置視覺模型(必填,無默認值)
setx VISION_MODEL "qwen-vl-plus"
# 4) 配置接口端點(默認百鍊;換其他提供商時必改)
setx VISION_ENDPOINT "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"
# 5) 重啓 dsh,讓環境變量生效
四個環境變量的含義:
| 環境變量 | 說明 | 默認值 |
|---|---|---|
VISION_API_KEY |
視覺接口的 API Key | 必填 |
VISION_MODEL |
視覺模型名,如 qwen-vl-plus |
必填,無默認 |
VISION_ENDPOINT |
視覺接口端點 | https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions |
VISION_API_STYLE |
API 風格 | auto |
注意 setx 只對新啓動的進程生效,配置後必須重啓 dsh。VISION_API_STYLE 取 auto 時按端點路徑自動判斷:路徑含 chat/completions 走 Chat Completions,含 responses 走 Responses API,裸 base URL 默認按 Chat Completions 並自動補全路徑;也可以強制指定 chat 或 responses,插件會把端點路徑歸一化到對應協議。
常見視覺提供商¶
| 提供商 | 端點 | 模型示例 |
|---|---|---|
| 阿里雲百鍊 | https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions |
qwen-vl-plus / qwen-vl-max |
| OpenAI | https://api.openai.com/v1/chat/completions |
gpt-4o / gpt-4o-mini |
| Moonshot | https://api.moonshot.cn/v1/chat/completions |
moonshot-v1-8k-vision-preview |
| OpenRouter | https://openrouter.ai/api/v1/chat/completions |
qwen/qwen2.5-vl-72b-instruct |
Anthropic 和 Gemini 的原生接口不直接支持,需要走它們各自的 OpenAI 兼容網關。
用 cordis.patch.yml 覆蓋配置¶
除了環境變量,也可以在 cordis.patch.yml 裏給該行傳 config,會覆蓋默認值和環境變量:
- insert:
- id: dsh-eyes
name: dsh-eyes
config:
apiKey: sk-xxx # 同 VISION_API_KEY
model: qwen-vl-plus # 同 VISION_MODEL
# endpoint, targetProvider, maxImageBytes 同理
目標主模型由代碼內的 targetProvider 決定,默認 deepseek-official;maxImageBytes 控制本地圖片大小上限,默認 15 MB。
典型用法¶
不需要開關,也不需要手動調用工具:
- 在會話裏直接
Ctrl+V粘貼一張截圖,或拖拽/點附件添加; - 像發普通消息一樣提問,例如「這張圖裏寫了什麼?」;
- 主模型收到的是圖片引用說明,它在思考中自行決定調用
view_image(attachment_id=…); - 視覺模型提取描述或 OCR 文字,主模型基於這些文字繼續回答。
圖片會一直留在後臺。後續任意一輪都可以繼續追問同一張圖,比如「再看一下圖裏第二行的數字」。因爲引用索引已持久化,即使上下文被壓縮或 dsh 進程重啓,模型仍能通過 attachment_id 查看歷史圖片。
工作原理¶
插件在三個環節介入:
- 准入放行:包裝
llm.resolveModelInfo,讓目標主模型聲明inputModalities: ['text','image'],帶圖消息由此通過 Host 的發送准入檢查並被持久化,生成attachment_id。 - 圖片剝離:包裝
llm.streamWithRegistration,在請求派發給模型之前,把每個image塊(含嵌套在tool-result裏的)換成【圖片N attachment_id=…】引用說明,並按sessionId分片登記attachment_id → ImageAttachmentRef。 view_image調用:主模型需要看圖時,插件按attachment_id(或attachment_ids、image_path)讀出圖片字節,轉成data:URL,POST 到配置的視覺接口,把返回的文本交給主模型作答;一次看多張時,返回文本按【圖片N】分段。
之所以直接包裝這兩個方法,是因爲 Harness 目前沒有公開的擴展點用於「發送准入的圖片能力判斷」和「派發前剝離圖片」。
適用場景與注意¶
適合的場景:主模型必須是 DeepSeek 或其他純文本模型、又需要偶爾看圖(截圖 OCR、界面檢查、表格識別等)的 DSH 用戶。如果你的主模型本身是多模態的,這個插件不會介入,也沒有安裝的必要。
安裝與使用前注意幾點:
- 插件以當前 dsh 進程的權限運行。安裝前建議先閱讀源碼和許可證(MIT),確認無誤再裝;
- API Key 請用環境變量或憑證服務管理,不要硬編碼進倉庫;
- 大小限制有兩套且互不相關:本地
image_path讀圖上限 15 MB(maxImageBytes);粘貼/附件圖片受 Harness 附件存儲限制(默認 5 MB); - 純文本主模型會在模型選擇器裏顯示爲「支持圖片」,這是有意爲之,目的是放行帶圖消息,不代表模型本身變成了多模態;
- 視覺接口必須 OpenAI 兼容(Chat Completions 或 Responses API)。
小結¶
dsh-eyes 的思路是把「看圖」從主模型的能力要求裏拆出來:圖片留在後臺,模型按需調用 view_image,識別交給外部的 OpenAI 兼容視覺接口。對被「純文本模型發不了圖」擋住的 DSH 用戶來說,這是一個改動很小、可以立刻試用的方案。
- GitHub:https://github.com/Leeminjing/dsh-eyes
- 社區目錄:https://www.skillhub.cn/plugins/Leeminjing/dsh-eyes
需要說明的是,社區目錄是獨立站點,與 DeepSeek、幻方沒有官方從屬關係,插件信息以 GitHub 倉庫爲準。