dsh-conversation-queue:限制 DSH 對話併發並監控資源

前言

在 DeepSeek Harness(DSH)裏同時開多個對話時,每個會話都會在發請求前組裝上下文、佔用內存。機器物理內存有限(例如 32G)時,兩三個對話一起跑就可能把提交內存頂滿,Windows 會直接殺進程。常見做法是手動少開窗口、自覺錯峯,但缺少硬性閘門,多開一兩個對話就會疊請求。

dsh-conversation-queue 在宿主側做對話級併發限制:超過上限的對話按 FIFO 排隊,停在發請求之前,前面的回合結束後再自動放行;同時在 Web 界面底部提供內存、提交內存、磁盤與排隊狀態,並可在運行期調整上限。下面介紹定位、安裝、配置與使用要點。

這是什麼

一句話:給 DSH 用的併發閘門——限制同時運行的根對話數量,其餘對話靜默排隊;附帶底部資源狀態條與設置頁調參。子代理 / 後臺任務不排隊,避免與父對話形成死鎖。

核心功能

對話級 FIFO 隊列

  • 達到 maxConcurrent 後,新回合在發請求之前等待,不調模型、不組裝上下文,幾乎不佔額外內存。
  • 正在運行的對話結束或關閉後,槽位按先來後到放行下一位。
  • 僅限制根對話;queueSubagents 默認 false,子代理不參與排隊。

底部狀態條(shell.bottom)

每 3 秒輪詢同源接口 GET /dsh-resource/status,展示:

  • 內存、提交內存使用率(≥80% 琥珀色,≥88% 紅色)
  • 各固定盤剩餘空間
  • 運行中 / 排隊數量與當前上限
  • − / + 即時改併發上限(寫入 settings,約 1.5 秒內生效)

鼠標懸停盤符可看卷標、文件系統、容量及系統盤空間緊張的說明;懸停「對話」可看每個運行中 / 排隊會話的標題與已跑 / 已等時長。

設置頁

路徑:Sidebar → Plugins → 資源與併發。與狀態條同源數據,表格展示,同樣可用 − / + 調整上限。

運行期調參

修改 JSON 即可,無需改 YAML、無需重啓 DSH。可寫字段:maxConcurrent(1~8)、enabled;非法值會被忽略以免手滑。

宿主 HTTP 接口

方法 路徑 說明
GET /dsh-resource/status 內存、磁盤、gate(運行 / 排隊列表等)
POST /dsh-resource/limit body { "maxConcurrent": 3 },可選 { "enabled": false }

接口走宿主 HTTP 服務,沿用同源鑑權。提交內存由常駐 PowerShell 採樣進程提供(memory.sampler 可能爲 ok / starting / error: …)。

安裝與啓用

插件以當前 DSH 進程權限運行;安裝前建議瀏覽倉庫源碼與 MIT 許可證。未發佈 npm 包,不要用 dsh plugin add dsh-conversation-queue(會去 registry 找同名包)。

從 GitHub 安裝(推薦)

將 <DSH 安裝目錄> 換成本機路徑,在 PowerShell 中執行:

& '<DSH 安裝目錄>\resources\runtime\cli\bin\dsh.cmd' plugin --profile web add github:zhengkaixing/dsh-conversation-queue

裝完後重啓一次 DSH(瀏覽器端 bundle 與 HTTP 路由在啓動時掛載)。

GitHub 拉不動的環境可用 Gitee 鏡像(同份代碼):

& '<DSH 安裝目錄>\resources\runtime\cli\bin\dsh.cmd' plugin --profile web add https://gitee.com/zhengkaixing/dsh-conversation-queue.git

從插件市場安裝

在 DSH 插件市場搜索 dsh-conversation-queue 安裝即可,效果與 github: 命令相同。市場列表由 awesome-dsh-plugin 維護;條目已於 2026-11-07 通過 PR #12526 合併上架。社區目錄(如 awesome-dsh-plugin.com)與 DeepSeek / 幻方無官方從屬關係,並非官方應用商店。

& '<DSH 安裝目錄>\resources\runtime\cli\bin\dsh.cmd' plugin --profile web add 'link:C:/path/to/dsh-conversation-queue'

改插件代碼後需重啓 DSH 才生效(HMR 只重載配置,不重載插件代碼)。

配置

默認片段在插件自帶的 cordis.patch.yml:

- insert:
    - id: conversation-queue
      name: 'dsh-conversation-queue'
      config:
        enabled: true        # 總開關,false = 完全不限制
        maxConcurrent: 2     # 同時允許運行的對話數;32G 內存建議 2,緊張就 1
        queueSubagents: false
        statusFile: ''       # 留空 = $DSH_HOME/conversation-queue.json
        settingsFile: ''     # 留空 = $DSH_HOME/conversation-queue.settings.json
        logAdmissions: true  # 每次放行 / 排隊是否寫日誌

也可在 ~/.dsh/profiles/web/cordis.patch.yml 用同一 id 覆蓋,建議把需要的字段寫全,例如:

- id: conversation-queue
  config:
    maxConcurrent: 3

運行期覆蓋上限示例(Windows 用戶目錄):

// %USERPROFILE%\.dsh\conversation-queue.settings.json
{ "maxConcurrent": 3, "source": "dsh-ui" }

三個入口等價:底部狀態條 − / +、設置頁 − / +、直接編輯上述 JSON。

典型用法與排障

查看隊列狀態

Get-Content "$env:USERPROFILE\.dsh\conversation-queue.json"

返回中包含 running、waiting、maxConcurrent、active、queue 等字段;maxConcurrent / enabled 爲當前生效值,configured 爲 YAML 默認值。lastEvent 爲 unloaded 時表示插件已卸載或重載失敗。

日誌

  • $env:USERPROFILE\.dsh\conversation-queue.boot.log:是否成功 apply-ok
  • 宿主日誌搜 conversation-queue::放行、釋放、排隊事件

已知界面行爲

排隊中的對話在會話 UI 上仍可能顯示「運行中」(回合已開始但卡在發請求前);狀態條與設置頁會顯示「排隊」。關閉排隊中的對話會立刻出隊;關閉運行中對話則槽位立即讓給下一位。卸載插件時排隊者會被拒絕或放行,不會永久掛起。

適用場景與注意

適合:本機內存偏緊、習慣多開 DSH 對話、希望用硬上限代替自覺錯峯的開發者。README 明確面向「兩個對話一起跑就可能被系統 kill」的機器。

注意:

  • 引擎要求 Node >=18、DSH >=0.2.0(package.json)。
  • 上限有效範圍爲 1~8;更大值對個人機器意義不大。
  • 排隊期間不調模型,但仍會佔用一個「已開始回合」的會話狀態;以狀態條和 JSON 爲準判斷是否在排隊。

結尾

dsh-conversation-queue 把「同時跑幾個根對話」變成可配置、可觀測的閘門,並把內存、提交內存、磁盤與隊列攤在底部和設置頁,適合在資源緊張的 Windows 本機上長期開着 DSH 時使用。

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

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

小夜