dsh-interject:在下一步邊界送達排隊消息,不打斷當前模型調用

前言

在 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 後重發」之間選擇;本插件默認走前者,通過隊列遷移實現「儘早可見」。

核心功能

  1. 默認策略不 interrupt:配置默認 onQueue: "steer",將進入 next-turn 的用戶消息提升爲 next-step;onSteer: "pass" 表示已進入 next-step 的消息按宿主語義在下一邊界生效。默認不會產生額外模型請求,只是把 pending 消息換隊列;消息更早進入 history 後,本 turn 剩餘請求會多攜帶一次前綴,README 稱這通常對應 prompt cache,成本很低。只有顯式使用 interrupt 路徑纔會因 abort 產生額外計費。

  2. 可配置 interrupt 與降級:可將 onSteer 設爲 interrupt,使 Cmd/Ctrl+Enter 成爲搶佔手勢;interruptWhile 爲 thinking 時,工具運行階段的長命令會降級爲 soft interject 而非硬殺進程。

  3. 能力探測而非硬依賴:插件不 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 等版本上逐項覈對過所用公開面。

  4. 熱重載配置:修改 ~/.dsh/dsh-interject.json 保存即生效,無需重啓;修改 lib/index.js 或安裝插件後需完全重啓 DSH(插件以靜態 ESM 加載,運行中改文件不生效)。

  5. 診斷與自檢:可選日誌、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。

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

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

小夜