dsh-session-rotate:步數觸頂時在輪末自動換新會話

前言

在 DeepSeek Harness(DSH)裏做長任務,同一會話裏的上下文會隨每一步累積,請求越來越長、費用也往上走。常見做法是手動總結進度、複製到新會話、再接着幹——費時,還容易漏掉上一輪助手回覆裏的細節。

dsh-session-rotate 是維護者 cry-flu 發佈的 DSH profile 插件,歸類爲工作流。它在會話步數接近或達到上限時,等到當前這一輪迴答結束再自動開新會話,把本地模板拼出的交接摘要投過去,並按配置歸檔或延遲歸檔舊會話。摘要不調用模型,屬於零額外模型調用的本地拼裝。

下面按定位、能力、安裝配置、試用與限制說明用法;安裝與配置以倉庫 README 爲準。

這是什麼

  • 名稱:dsh-session-rotate(npm 上另有同名包,作者與倉庫均不同,不是本項目)
  • 運行環境:DSH 桌面版 / Web GUI,作爲 profile 插件掛載;要求 Node >=20
  • 許可證:MIT(見倉庫 LICENSE)
  • 當前版本(倉庫 package.json):1.4.2
  • 文檔與源碼:GitHub、GitHub Pages 文檔

插件解決的是「步數到頂後如何不斷檔續上」:自動建新會話、投遞交接摘要、切換界面(可選),並只處理本插件換出的舊會話,不批量動其他會話。

核心功能

按工作區設步數上限

每個工作區可單獨配置 maxSteps;留空則跟隨全局 defaultMaxSteps(默認 40),且會隨默認值一起變。workspaces 默認爲空數組——空表示所有工作區都不生效,要用哪個工作區就在名單裏顯式寫一行,且 name 必須與側邊欄顯示名完全一致(空格、大小寫均算)。

本地模板交接摘要

固定模板:頭部不超過 16 行(最近用戶消息 + 歷史指令),後面原樣附上上一輪助手回覆全文(不超過 4000 字,超出則頭尾各留一段)。不額外調用模型。摘要只在新會話第一輪發一次,之後作爲上下文隨每一步請求重發(緩存命中時單價很低)。README 也說明:換新後第一輪仍是真實請求,交接摘要本身無模型成本,但該輪對話照常計費。

輪次預判與保護閘

  • 輪次預判:用最近 3 輪增量的均值估計下一輪,在輪邊界提前換,而不是等越限才換(上限爲軟上限,判定只在輪與輪之間,不打斷進行中的輪)。
  • 保護閘:minSteps 硬下限、cooldownMinutes 冷卻、maxRotations 在連續觸發後暫停該工作區(狀態寫在 ~/.dsh/session-rotate/state.json,重啓不清零)。

試運行與開關組合

  • dryRun:只寫日誌,不建會話、不歸檔、不跳轉。
  • 歸檔與界面:archiveOnRotate、deferArchiveMinutes、autoSwitch,以及 autoSwitch=false 且 deferArchiveMinutes>0 時纔有意義的 switchOnArchive。

常用效果與開關對應關係見 README「常用組合」表;判定邏輯在 lib/index.js 的 archivePlan。

控制界面

設置頁「會話換新」可改默認上限、保護閘、試運行與上述開關,保存即寫入 ~/.dsh/session-rotate/config.json,與手動改該文件等價。

安裝與啓用

插件未發佈到 npm,不要用 npm i dsh-session-rotate。安裝方式:github: 依賴、本地 link: / file:,或手動鏈到 node_modules。

1. 在 profile 的 package.json 登記依賴和 bundle

{
  "dependencies": { "dsh-session-rotate": "github:cry-flu/dsh-session-rotate" },
  "dsh": { "profile": { "bundles": ["...", "dsh-session-rotate"] } }
}

已 clone 到本地時,可用 "link:<插件目錄絕對路徑>" 或 "file:<同上>" 代替 github:。

2. 在 profile 目錄執行包管理器 install,保證 node_modules 中有 dsh-session-rotate;Windows 下也可用目錄聯結(README 給出 mklink /J 示例)。

3. 在 profile 的 cordis.patch.yml 末尾掛載並配置

- insert:
    - id: dsh-session-rotate
      name: dsh-session-rotate
      config:
        defaultMaxSteps: 40
        workspaces:
          - name: my-workspace
            maxSteps: null

4. 整個 DSH 進程重啓一次。「重開窗口」不會重載插件;重啓後 Web GUI 端口可能變化,以啓動日誌爲準。

配置要點

配置文件路徑:~/.dsh/session-rotate/config.json。

鍵 默認 說明(摘要)
defaultMaxSteps 40 默認步數上限
workspaces[] [] { name, maxSteps };未列入的工作區不生效
minSteps 10 累計步數低於此值不換;0 關閉
cooldownMinutes 10 同一工作區該時間窗內最多換 1 次
maxRotations 3 在 cooldown × maxRotations 窗口內換滿則暫停工作區
dryRun false 試運行
archiveOnRotate true 換新時是否歸檔舊會話
deferArchiveMinutes 0 換新後延遲多少分鐘再歸檔;0 爲立即歸檔
autoSwitch true 換新後是否切到新會話界面
switchOnArchive true 僅在 autoSwitch=false 且 deferArchiveMinutes>0 時:到點先切到新會話再歸檔

工作區名對不上會靜默跳過,可查看 ~/.dsh/session-rotate/debug.log 確認匹配情況。

典型用法

用 dryRun 驗證是否會觸發

不要爲了讓插件「真換」而把 maxSteps 改成 2、3——那會新建會話、歸檔、跳轉,容易刷出一屏空會話。

  1. 在 workspaces 中加入要測的工作區,maxSteps 用真實值(例如 40);
  2. 打開 dryRun(設置頁保存即可,無需重啓);
  3. 正常使用直至跨過步數閾值;
  4. 查看 debug.log:命中會記 [dry-run] 只記日誌不換(同一會話同一檔步數只記一次)。

測完關閉 dryRun。

延遲歸檔 + 不立即跳轉

若取消「換新後自動跳到新會話」(autoSwitch=false),並設置 deferArchiveMinutes 爲幾分鐘,可保留舊會話在側邊欄,便於點開看最後一條回覆;到點時若 switchOnArchive=true,會先切到新會話再歸檔。README 的 demo 動圖演示了相關設置項。

臨時關閉與卸載

  • 臨時關閉:workspaces 改爲 [] 或刪掉工作區條目,保存即生效。
  • 徹底卸載:刪除 cordis.patch.yml 中 - insert 段、package.json 中依賴與 bundle 條目、node_modules 鏈接,並重啓 DSH。可選刪除 ~/.dsh/session-rotate(含日誌與狀態)。

被暫停的工作區可通過 POST /dsh-session-rotate/config 攜帶 {"clearPause": true} 恢復,或刪除 state.json 後重啓插件。

適用場景與注意

適合:在同一 DSH 工作區里長時間編碼或對話、希望按步數自動「斷點續傳」、又不願爲交接摘要多打一次模型的用戶。

使用前請知悉:

  • 插件隨當前 DSH profile 進程運行,安裝前請自行查看源碼與 MIT 許可證,確認可接受其歸檔、跳轉與會話 API 行爲。
  • 只對頂層會話生效,子會話跳過;每個會話只觸發一次換新。
  • 熱重載無效:改插件代碼(尤其 lib/client.js)後須整進程重啓 DSH。
  • 延遲歸檔到點若會話仍有活動(正在答、子代理等),會順延,最多 10 次;用盡後放棄歸檔,舊會話留在側邊欄,需手動處理。
  • 1.2.0 時期排隊的延遲歸檔在升級到含 ownSessions 名單的版本後可能不會被補上,見 README「已知限制」。

README 中的「實測參考」表記錄了作者個別日期的請求與 token 統計,並標明不能當作「插件省了多少」的因果結論;口徑與限制見 docs/usage-data.md。

結尾

dsh-session-rotate 把「步數到頂 → 輪末換新 → 本地摘要交接 → 按開關歸檔/跳轉」收成一條工作流,減少手動複製與記進度的步驟,交接階段不額外調用模型。

  • 社區目錄頁:https://www.skillhub.cn/plugins/cry-flu/dsh-session-rotate
  • 源碼與安裝說明:https://github.com/cry-flu/dsh-session-rotate
羽毛球分组比赛记分
小程序二维码

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

小夜