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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye