前言¶
在 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——那會新建會話、歸檔、跳轉,容易刷出一屏空會話。
- 在
workspaces中加入要測的工作區,maxSteps用真實值(例如 40); - 打開
dryRun(設置頁保存即可,無需重啓); - 正常使用直至跨過步數閾值;
- 查看
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