前言¶
在 DSH 客戶端裏拖入或粘貼圖片,默認往往會走附件欄上傳管線。如果你希望圖片像普通文件引用一樣落在光標處、不佔附件區,同時仍能讓模型按路徑讀圖,就需要在官方分流邏輯之外做一層客戶端行爲調整。下面介紹維護者 Da0Mine 發佈的客戶端插件 dsh-inline-image-ref:它把拖入、粘貼、文件選擇器進來的圖片改成在光標處插入 @路徑 膠囊,並支持懸停預覽原圖。
這是什麼¶
dsh-inline-image-ref 是 DSH 生態裏的客戶端插件(dsh-client,platform: web,immediately: true)。一句話定位:拖進輸入框的圖片按文件引用處理——不彈附件欄,在光標處插 @路徑 膠囊;鼠標懸停膠囊可看原圖。
- 維護者:江浩文(Da0Mine)
- 許可證:MIT
- 當前 npm 版本(資料):
1.0.1 - 目錄頁:https://www.skillhub.cn/plugins/Da0Mine/dsh-inline-image-ref
- 源碼:https://github.com/Da0Mine/dsh-inline-image-ref
插件以當前 DSH 進程權限運行;安裝前請自行覈對源碼與許可證。
核心行爲¶
官方在 dsh-client-ui-conversation 裏用 MIME 與路徑判斷圖片是走上傳還是引用。本插件在不改官方核心代碼的前提下,分兩條路處理。
有真實 OS 路徑的圖片¶
桌面端拖入、帶路徑的粘貼、文件選擇器選中的圖片:在 drop / paste / change 的 capture 階段把對應 File 的 type 抹成 application/octet-stream,官方判斷就會走 insertFileReferences(),在實時選區(光標)之後插入 @路徑 膠囊。光標定位、前導空格、撤銷、忙碌態拒絕、@路徑 格式化仍由官方實現。
沒有路徑的圖片(剪貼板截圖 / 位圖)¶
客戶端 Remote 的 workspaceFiles 只讀,無法直接寫盤。插件帶 Host 半,提供保存路由:
POST /dsh-inline-image/save?name=<文件名>&sessionId=<會話 id>
請求體爲文件字節;響應形如 { ok: true, value: { path, name, originalName, dir } }。
落盤目錄與 WorkBuddy 臨時圖類似,在系統臨時目錄下:
%TEMP%\dsh-inline-image\<sha256 前 2 位>\<名字>-<sha256 前 16 位>.<ext>
要點:內容尋址(同圖重複粘貼同路徑,只刷新 mtime);24 小時 TTL 掃過期文件;不向項目目錄寫入;單文件上限 32MB。保存成功後客戶端用 caretSpan() + insertReference() 在光標處插 @<絕對路徑> 膠囊。失敗則退回原生附件管線。
縮略圖與懸停預覽通過 remote.workspaceFiles.readBytes(sessionId, 絕對路徑) 讀字節,不另建讀路由。
入口對照¶
| 入口 | 帶真實 OS 路徑的圖片 | 沒有路徑的圖片 | 普通文件 |
|---|---|---|---|
| 拖入 | 光標處 @路徑 膠囊 |
落盤後 @絕對路徑 |
原生 @路徑(不變) |
| Ctrl+V | 同上 | 同上(截圖也能變文件) | 不變;帶文字時交回原生 |
| 文件選擇器 | 光標處 @路徑 膠囊 |
同上 | 不變 |
懸停引用膠囊時浮層顯示原圖(讀不到則說明),pointer-events: none,不擋點擊。已發送消息裏符合規則的藍色 @路徑 鏈接也可懸停預覽,範圍限於輸入框與聊天轉錄相關 DOM([data-composer-card]、[data-composer-input]、[data-chat-turn]、[data-chat-flow] 等);整段須爲單一引用,夾在句子裏的片段不觸發。
複製粘貼草稿不退化¶
官方複製膠囊會得到 clipboardText(@"路徑" 文本),粘回往往只剩文字。插件在 paste 的 capture 階段識別「帶圖片擴展名的 @路徑」,按原順序用 insertText 與 insertReference 重建;僅在這類粘貼上接管,普通文字與非圖片 @ 引用仍交給官方。代價:此類粘貼爲純文本重建,富文本格式(如加粗)不保留。
安裝與啓用¶
推薦從 npm 安裝:
npm install dsh-inline-image-ref
手工接入桌面 profile 時,編輯 ~/.dsh/profiles/desktop/package.json,在 dependencies 與 dsh.profile.bundles 中加入本包,並在 node_modules 建同目錄 Junction。示例結構(bundles 中需包含現有條目與本插件名):
{
"dependencies": { "dsh-inline-image-ref": "link:./node_modules/dsh-inline-image-ref" },
"dsh": { "profile": { "bundles": [ "…", "dsh-inline-image-ref" ] } }
}
修改後重啓 DSH 宿主(客戶端 bundle 在啓動時聚合)。
環境要求:node >= 22(見 package.json engines)。
典型用法¶
- 在對話輸入框中,從資源管理器拖一張本地圖片到光標位置 → 出現
@路徑膠囊,附件欄不出現圖片上傳項。 - 截屏後
Ctrl+V→ 無路徑位圖先 POST 到 Host 落臨時目錄,再插入@絕對路徑膠囊。 - 鼠標懸停膠囊或消息裏符合條件的
@路徑鏈接 → 浮層預覽;模型側仍通過路徑讓 DSH fs 沙箱讀取(對工作區與平臺臨時根的寫/讀策略與官方一致)。
需要長期可復現的圖:不要只依賴 %TEMP% 下 24 小時 TTL 的副本,應把圖放進工作區再從資源管理器拖入(走原路徑引用,不受 TTL 影響)。
適用場景與注意¶
適合誰
- 習慣在提示詞裏用
@文件引用、希望圖片與文本混排在同一輸入流裏的 DSH 桌面/Web 客戶端用戶。 - 不想讓每張圖都佔附件欄、但仍要模型按路徑讀圖的多模態或文本+工具讀文件工作流。
已知限制(README 原文)
- 文件名到絕對路徑的映射記在
localStorage["dsh-inline-image/labels/v1"](最多 300 條);不同目錄同名圖會互相覆蓋,僅最後一張能預覽。 - 未經本插件插入的
@圖片(手打路徑或其它插件)通常無法預覽(Lexical 裝飾節點可能只有title)。 - 臨時目錄文件 24 小時後清理,隔天再引用可能「讀不到這張圖」;工作區路徑不受影響。
- 交給模型的是路徑引用而非內聯圖片字節;文本模型需自行讀文件,多模態也不會自動把圖塞進上下文——這是「按文件處理」的設計取捨。
權限與安全
插件含客戶端注入與 Host 寫臨時目錄路由;安裝前應閱讀 client.js、補丁與 Host 路由實現。DSH 社區目錄(如 SkillHub)爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
結尾¶
dsh-inline-image-ref 把輸入框裏的圖片統一成光標處的 @路徑 引用,並補上懸停預覽與無路徑截圖落盤,在儘量複用官方引用管線的前提下減少附件欄干擾。需要插件條目與討論可參考目錄頁 https://www.skillhub.cn/plugins/Da0Mine/dsh-inline-image-ref,問題與源碼見 https://github.com/Da0Mine/dsh-inline-image-ref。