dsh-prompt-suggestions:給 DSH 輸入框補上歷史回滾與下一句預測

前言

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
羽毛球分组比赛记分
小程序二维码

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

小夜