前言¶
DSH(DeepSeek Harness)的輸入框只承載當前這一句。在長會話裏,你可能剛問過「把這段日誌按錯誤重排」,過了幾輪又想問「再按時間排序一次」。原生的做法是自己翻聊天窗口找舊提問、複製、粘貼;另一個常見做法是依賴模型補全,但要麼等補全、要麼怕它直接發出去。
下面介紹的插件把兩件事做在同一個輸入框裏:往回翻——本會話發過的每一條提問都能翻回來重新編輯;往前猜——根據最近幾輪對話給出你大概率要發的下一句話,用灰色幽靈文字顯示,按 → 再採納。任何按鍵都只改草稿,發送仍需自己按 Enter。
插件分類是客戶端。倉庫 Heeweelee/dsh-prompt-suggestions,包名 dsh-composer-suggestions,MIT 許可證,當前版本 v1.1.0,作者 Heeweelee。
這是什麼¶
一句話定位:一個 DSH composer 插件,爲輸入框加上「歷史回滾 + 下一句預測」,官方說法是「像 Claude Desktop 那樣不用重複打字」。它不做自動發送,不新增面板到正文之外,所有操作都落在輸入框和草稿上。
解決的是兩個具體痛點:
- 舊提問重打成本高,長會話裏早期輪次還可能被 compaction 從聊天界面上剪掉,翻頁也未必能翻到第一句。
- 下一句要從頭組織,而它往往只是對上一次結果的延續(「繼續」「把第二段也切開」)。
核心功能¶
| 能力 | 用法 |
|---|---|
| 歷史回滾 | 空輸入框按 ↑ 逐條退回本會話發過的提問;↓ 逐條前進 |
| 草稿保護 | 越過最新一條時恢復原本未發送的草稿 |
| 歷史搜索面板 | Ctrl+↑ 打開面板,關鍵詞過濾,↑↓ 選擇,Enter 填入,Esc 關閉 |
| 下一句預測 | Session 空閒時,灰色幽靈文字出現在輸入框 |
| 一鍵採納 | → 把預測變成普通可編輯文本,可改完再發 |
| 不自動發送 | 任何按鍵只改草稿,發送仍需 Enter |
回滾覆蓋整場會話。判定依據是會話記錄裏 source.kind = user:手打的、粘貼的、從插件預測 → 採納後發送的、排隊插話發送的,在會話裏都是同一條 user/message,因此全部覆蓋。運行時注入的內容(時間上下文、技能目錄、壓縮存檔、子任務通知)也是 user 角色消息,會被排除——這是區分「人發的」和「機器塞的」的唯一依據。
插件不劫持鍵盤:多行編輯、光標在中間、輸入法組字時方向鍵照常工作。↑ 只在三種情況下接管:草稿爲空,或草稿是單行(內容會被保存,↓ 可恢復),或草稿是多行但光標停在最開頭。
安裝與啓用¶
推薦從 GitHub 直接裝,不需要 registry:
dsh plugin --profile desktop add github:Heeweelee/dsh-prompt-suggestions
其他方式在倉庫的 INSTALL.md 裏:
# A. 從 npm 裝
plugin_manager install_bundle dsh-composer-suggestions
# B. 用 Releases 裏的 tarball,在 profile 的 package.json 里加
"dsh-composer-suggestions": "file:D:/path/dsh-composer-suggestions-1.1.0.tgz"
# C. 本地開發目錄
plugin_manager install_bundle D:\Ai_Tool\dsh_tool\packages\prompt-suggestions
安裝後在「插件 → 已安裝插件」裏可以開關。
包的 engines 要求 dsh >= 0.2.1-rc.5,安裝前可以先確認當前 dsh 版本。
典型用法¶
在輸入框裏直接操作,不需要記額外命令:
1、長會話裏想複用上一條提問:光標留在空輸入框,按 ↑,一次退一條,可以一路翻到會話的第一句;按 ↓ 逐條往回走,翻過最新一條時恢復原本沒發出去的草稿。
2、歷史太多不知道翻到第幾條:按 Ctrl+↑ 打開歷史面板,面板裏是獨立輸入框,輸入關鍵詞過濾,↑↓ 選擇,Enter 填入,Esc 關閉。面板打開時鍵盤交給面板自己的 <input>,不與宿主輸入框搶事件。
3、讓插件猜下一句:發完一條之後保持輸入框爲空並等一會兒,灰色幽靈文字會出現;按 → 採納成普通文本,改完再按 Enter 發送。
4、正在打字時輸入框裏出現灰色的後半句:說明你已經打出了預測的前綴,宿主會把剩餘部分接在正文後面,按 → 後草稿等於完整預測,且走宿主自己的撤銷棧。
預測的來源在界面上有明確標記,方便判斷這次猜的是不是模型給的:
| 角標 | 含義 |
|---|---|
→ 採納 |
模型預測,懸停顯示耗時 |
→ 採納 · 本地 |
服務端沒響應,用的是本地規則 |
預測不可用 |
服務端沒響應且本地規則也給不出有意義的建議,此時不顯示幽靈文字,懸停顯示失敗原因 |
DevTools Console 每輪會輸出一行 [prompt-suggestions] model 1832ms <文本> 或 local fallback <ms>,並附帶失敗原因和實際請求的 URL。
實現要點¶
插件是典型的兩半結構,Host 與 Web Client 各管一半:
| 文件 | 平臺 | 作用 |
|---|---|---|
index.js |
Host | 在 DSH Web 服務器上註冊 POST /prompt-suggestions/suggest 與 POST /prompt-suggestions/history |
client.js |
Web Client | 註冊 conversation.input.overlay 槽位:攔截方向鍵、回溯歷史、繪製幽靈文字 |
1、歷史回填的數據源有兩層,Host 優先。Host 權威列表直接讀該 Session 的完整事件日誌,取所有 source.kind === 'user' 的消息,按時間正序返回最近 200 條,每條保留完整原文(含換行,上限 4000 字符)。因此不受聊天窗口分頁限制,也不受 compaction 把早期輪次從 surface 剪掉的影響。Host 路由不可達時退回 useChat 的本地窗口作爲兜底。
2、幽靈文字有兩種繪製方式:草稿爲空時在 overlay 裏絕對定位一層灰色文本,位置對齊宿主佔位符所在的盒子,字體行高從編輯器 getComputedStyle 複製,底色用 --dsw-specific-input-major 蓋住佔位符;草稿是預測前綴時寫宿主自帶的行內提示通道 --dsh-composer-hint,由宿主 CSS 的 p:last-child::after 把剩餘部分接在正文後面,換行與字距與真實輸入一致。
3、預測請求走 Host 路由:
POST /prompt-suggestions/suggest
x-prompt-suggestions: 1
{"sessionId": "session-..."} → {"suggestion": "...", "cached": false}
上下文取自 session.deriveMessages(),取最後 10 條,單條截斷 700 字符,總長 4000 字符。模型路由取 ctx.agentDefaultModel.currentSelection(),reasoningEffort 強制降到該路由最省的一檔,maxTokens: 700。結果按 sessionId + 消息數 緩存 5 分鐘,避免刷新頁面重複計費。接口按 document.baseURI 解析 URL,而非假設 http(s)——桌面版界面跑在自定義協議 dsh-app://app/ 上,用它判斷 origin 會拿到 "null",請求永遠發不出。
4、失敗處理分兩層。防空話:模型只回「繼續 / 好的 / ok」這類內容時,會帶更嚴格的提示詞再要一次具體建議;兩次都是空話就不出幽靈文字。請求失敗按 0.6s / 1.2s / 2.4s 退避重試,四次都失敗才降級到本地規則,窗口重新獲得焦點或可見性恢復時會再試一次。加 x-prompt-suggestions-debug: 1 可返回 debug 字段(階段、attempts、filler、原始輸出、finish 原因、實際路由),調試請求繞過緩存讀但仍寫回。
適用場景與注意¶
適合以下情況:會話輪次多、經常複用舊提問、希望模型把「下一句」準備好但又不想讓它替自己決定什麼時候發的人。對輸入框鍵盤行爲敏感、希望方向鍵完全歸自己控制的場景,需要留意插件只在上述三個條件下接管 ↑。
使用時注意幾點:
- 插件以當前 dsh 進程的權限運行,涉及本機文件、會話數據與網絡請求,安裝前應檢查源碼與許可證。本倉庫爲 MIT,可在
INSTALL.md之外直接讀index.js與client.js確認行爲。 - 兩個路由走 DSH Web 服務器,未經過瀏覽器 Cookie 認證,僅靠自定義請求頭 + 監聽迴環地址保護;跨站請求無法帶上該請求頭。
- 預測只在 Session 空閒時請求,生成過程中沒有幽靈文字。
- 空會話(還沒有任何消息)不做預測,沒有上下文可依據。
- 模型兩次都只給空話時不出幽靈文字——「有時沒預測」是設計上可接受的失敗方式。
- 面板不做時間分組、不做跨會話搜索,只列當前會話的提問。
- Host 側只保留最近 200 條、每條 4000 字符,更早的提問仍在會話裏,只是不再進入回滾列表。
- Host 路由不可達時降級爲本地已加載窗口,此時長會話裏能翻到的深度取決於聊天視圖加載了多少。
- 面板用
position: fixed定位,宿主未來若給輸入卡片祖先加transform,浮層定位會變化。
小結¶
這個插件的價值不在複雜機制,在於把輸入框缺的兩塊補上:一條能翻回整場會話的 ↑/↓,一句可在採納前編輯的幽靈文字。全程不自動發送,改動都在草稿上,風險可控。安裝方式是從 GitHub 直接裝 dsh plugin --profile desktop add github:Heeweelee/dsh-prompt-suggestions,包名 dsh-composer-suggestions,MIT,v1.1.0。
- 目錄頁:https://www.skillhub.cn/plugins/Heeweelee/dsh-prompt-suggestions
- 倉庫:https://github.com/Heeweelee/dsh-prompt-suggestions