dsh-inline-image-ref:把輸入框裏的圖片當 @路徑 引用處理

前言

在 DSH 客戶端裏拖入或粘貼圖片,默認往往會走附件欄上傳管線。如果你希望圖片像普通文件引用一樣落在光標處、不佔附件區,同時仍能讓模型按路徑讀圖,就需要在官方分流邏輯之外做一層客戶端行爲調整。下面介紹維護者 Da0Mine 發佈的客戶端插件 dsh-inline-image-ref:它把拖入、粘貼、文件選擇器進來的圖片改成在光標處插入 @路徑 膠囊,並支持懸停預覽原圖。

這是什麼

dsh-inline-image-ref 是 DSH 生態裏的客戶端插件(dsh-client,platform: web,immediately: true)。一句話定位:拖進輸入框的圖片按文件引用處理——不彈附件欄,在光標處插 @路徑 膠囊;鼠標懸停膠囊可看原圖。

插件以當前 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)。

典型用法

  1. 在對話輸入框中,從資源管理器拖一張本地圖片到光標位置 → 出現 @路徑 膠囊,附件欄不出現圖片上傳項。
  2. 截屏後 Ctrl+V → 無路徑位圖先 POST 到 Host 落臨時目錄,再插入 @絕對路徑 膠囊。
  3. 鼠標懸停膠囊或消息裏符合條件的 @路徑 鏈接 → 浮層預覽;模型側仍通過路徑讓 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。

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

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

小夜