前言¶
在 DeepSeek Harness(DSH)裏跑智能體時,一個 turn 往往包含多步:每一步對應一次模型調用及其工具執行,單步推理也可能持續數分鐘。你在 Agent 忙碌期間通過「排隊併發送」輸入的內容,會進入 inbox 的 next-turn 隊列;宿主默認要在整輪 turn 全部結束之後纔會認領這條消息。若 turn 很長,你的補充說明會長時間滯留在隊列裏,模型在後續步驟裏看不到。
下面介紹社區插件 dsh-interject(維護者 sdlhs,分類:工作流)。它在不終止、不丟棄當前正在進行的模型請求的前提下,把符合條件的排隊消息提前挪到 next-step 隊列,從而在下一個 step 邊界進入對話歷史——而不是乾等整輪結束。插件只掛載 DSH 宿主側,不改客戶端、不改 WebUI、不涉及 app.asar。
這是什麼¶
dsh-interject 是 DSH host plugin(當前 package 版本 0.3.0,MIT 許可證)。它監聽 agent/inbox/inserted,在策略匹配時把消息從 next-turn 移到 next-step;下一步開始時模型會在 history 裏看到你的輸入,正在 flight 中的推理不會被 abort。
DSH inbox 有兩條隊列,行爲對比如下:
| 隊列 | 典型寫入方式 | 何時被認領 |
|---|---|---|
next-turn |
忙碌時「排隊併發送」 | 整輪 turn 結束之後 |
next-step |
Cmd/Ctrl+Enter(插話併發送) | 下一個 step 邊界(一步 = 一次模型調用 + 其工具) |
README 說明:llm.stream(request) 在構建請求時凍結 messages 數組,HTTP 體發出後無法在生成中途追加輸入,因此只能在「等當前調用結束」與「interrupt 後重發」之間選擇;本插件默認走前者,通過隊列遷移實現「儘早可見」。
核心功能¶
-
默認策略不 interrupt:配置默認
onQueue: "steer",將進入next-turn的用戶消息提升爲next-step;onSteer: "pass"表示已進入next-step的消息按宿主語義在下一邊界生效。默認不會產生額外模型請求,只是把 pending 消息換隊列;消息更早進入 history 後,本 turn 剩餘請求會多攜帶一次前綴,README 稱這通常對應 prompt cache,成本很低。只有顯式使用interrupt路徑纔會因 abort 產生額外計費。 -
可配置 interrupt 與降級:可將
onSteer設爲interrupt,使 Cmd/Ctrl+Enter 成爲搶佔手勢;interruptWhile爲thinking時,工具運行階段的長命令會降級爲 soft interject 而非硬殺進程。 -
能力探測而非硬依賴:插件不 import
@deepseek-ai/*,僅使用宿主傳入的ctx/agent對象;文檔聲明兼容>=0.2.0-rc.1,並在0.2.0-rc.2、0.2.1-rc.5、0.2.2-alpha.2等版本上逐項覈對過所用公開面。 -
熱重載配置:修改
~/.dsh/dsh-interject.json保存即生效,無需重啓;修改lib/index.js或安裝插件後需完全重啓 DSH(插件以靜態 ESM 加載,運行中改文件不生效)。 -
診斷與自檢:可選日誌、
bootMarker寫入~/.dsh/dsh-interject-boot.json;倉庫提供離線node test/test-interject.mjs與node test/test-interject-loop.mjs自測(無需啓動 DSH)。
安裝與啓用¶
從插件市場¶
在 DSH 插件市場中搜索 dsh-interject 安裝;市場會從 GitHub 倉庫解析包。社區目錄頁:https://www.skillhub.cn/plugins/sdlhs/dsh-interject(獨立社區站點,與 DeepSeek / 幻方無官方從屬關係)。
從源碼目錄安裝¶
若已有倉庫源碼目錄,在插件根目錄執行(資料原文):
dsh plugin --profile desktop add .
包聲明瞭 dsh.bundle.patch,profile 會自動拾取 cordis.patch.yml,下次啓動時掛載。安裝或編輯 lib/index.js 後請完全重啓 DSH。
手動掛載(不用市場)¶
在 profile 的 cordis.patch.yml 中增加:
- insert:
- id: dsh-interject
name: dsh-interject
name 必須是包名,不要寫絕對路徑,否則插件卡片可能顯示「已安裝但未加載」。
配置與驗證¶
配置文件路徑:~/.dsh/dsh-interject.json(熱重載)。默認值示例(字段含義見 README 表格):
{
"enabled": true,
"onQueue": "steer",
"onSteer": "pass",
"interruptWhile": "thinking",
"graceMs": 250,
"cooldownMs": 2000,
"includeSubagents": false,
"stallMs": 120000,
"wakeFallbackMs": 3000,
"bootMarker": true,
"log": true
}
關閉插件:{"enabled": false}。要讓 Cmd/Ctrl+Enter 走搶佔:{"onSteer": "interrupt"}。
環境變量可覆蓋路徑:DSH_INTERJECT_CONFIG、DSH_INTERJECT_LOG(空字符串關閉日誌)、DSH_INTERJECT_BOOT。
驗證 promotion 是否發生:查看日誌尾部,成功時會記錄 next-turn -> next-step <id>。Windows 示例如下:
Get-Content "$env:TEMP\dsh-interject.log" -Tail 20
確認當前進程加載的構建版本(重啓後是否生效):
Get-Content "$env:USERPROFILE\.dsh\dsh-interject-boot.json"
其中 version 爲運行中進程實際加載的版本;pid 應對應當前 DSH 進程。
適用場景與注意¶
適合:長 turn、多步工具鏈場景下,你希望在下一步就讓模型看到排隊說明,又不願 interrupt 浪費已生成的輸出與 token。
侷限(資料原文):
steer不是零延遲:只能在本輪模型調用的邊界生效;若單次調用跑十分鐘,仍需等到該調用結束。- 移動消息會產生一條
agent/inbox/spliced且outcome: 'canceled',屬公開 API 形狀,文檔稱對 goal driver 與 UI 無害。 - 插件以當前 DSH 進程權限運行;安裝前請自行審閱 源碼與許可證,勿在未信任的來源安裝宿主插件。
結尾¶
dsh-interject 解決的是「忙碌期間排隊消息要等到整輪 turn 結束才進 history」的時序問題:通過 inbox 隊列遷移,在下一步邊界送達輸入,默認不打斷正在跑的模型調用。詳情與 issue 見 GitHub:https://github.com/sdlhs/dsh-interject;目錄介紹見 SkillHub:https://www.skillhub.cn/plugins/sdlhs/dsh-interject。