前言¶
在 DeepSeek Harness (DSH) 的开发与使用中,重启进程或加载已有会话后,第一个回合可能会永久阻塞:UI 一直旋转,日志中没有任何报错。这种“冷启动回合阻塞”通常发生在 turn/start 和 step/start 之间的 preStep 窗口,其根源是同步的会话日志全量回放。
dsh-session-rescue 是一个针对这一现象的会话看门狗插件。它不依赖重启应用,而是通过自动化 /compact 操作,在会话大小达到危险区域前进行压缩,将回放成本移出用户回合,确保服务可用。
是什么¶
dsh-session-rescue 是一个 DeepSeek Harness 插件,用于防止冷启动回合阻塞。它通过自动化 /compact 操作,在会话增长至危险区域前进行压缩,并报告会话状态。
- 维护者: 1622352030
- 许可证: MIT
- 核心功能:
- 防止冷启动回合阻塞。
- 在会话大小接近危险区前进行压缩。
- 自动执行
/compact操作。 - 通过
/rescue status报告状态。
工作原理¶
该插件通过三个核心动作来应对回放成本:
- GUARD(守卫):当会话被加载到当前进程且其
seq(序列号)已超过危险阈值时,在用户第一个回合(agent/status变为idle)之前自动压缩会话。这会将不可避免的回放成本移出回合,同时缩小会话规模。 - COMPACT(压缩):在回合之间,当代理处于空闲状态时,如果会话自上次压缩以来增长了至少
minGrowthSeq,则执行压缩。这能保持后续冷启动在秒级范围内。 - Report(报告):通过
/rescue status指令,显示每个会话的seq,当前进程是已支付回放成本(“warm”)还是未支付(“cold”),以及插件对turn/start到第一个step/start之间preStep时长的测量数据。
使用方式¶
该插件主要用于在特定时机触发压缩,并监控状态:
- 按阈值压缩:当会话序列号
seq超过危险阈值时触发压缩。 - 空闲期压缩:在回合之间且代理处于空闲状态时,若会话增长量达到设定值则触发压缩。
- 状态检查:使用
/rescue status检查会话的冷热状态及preStep时长。
配置说明¶
在 DSH 的配置文件中启用该插件,需设置以下参数。默认阈值基于实测数据校准(40k 时冷启动约 16 秒,80k 时可能永久阻塞)。
- insert:
- id: session-rescue
name: dsh-session-rescue
config:
enabled: true # false = 仅观察和报告,从不压缩
warnSeq: 40000 # 从此处开始警告/压缩
dangerSeq: 80000 # 超过此值冷启动第一个回合可能永不返回
minGrowthSeq: 20000 # 仅在自上次压缩增长此数量后触发
cooldownMs: 60000
maxAttemptsPerSession: 6
maxBusyStreak: 5
pollMs: 30000
compactionTimeoutMs: 600000
技术细节与注意¶
- 环境要求:需要 Node.js 版本 >= 22.15。
- 不可变事实:全量回放是不可避免的,但支付回放的位置(是在用户回合中还是在空闲期)是可以改变的。一旦执行了压缩,随后的冷启动将保持廉价。
- 触发机制:压缩的触发条件是增长增量(growth delta),而不是绝对大小。这防止了在空闲期间无限重复触发压缩。
- 序列号限制:压缩操作不会减少
session.seq,因为日志是追加式的。 - 状态报告:如果核心返回了
busy状态(表示已有压缩在运行或代理非空闲),插件不会将该会话标记为“warm”,以避免冷会话漏掉守卫检查。
结语¶
dsh-session-rescue 提供了一种在 DSH 中处理冷启动阻塞的工程化方案。通过自动化 /compact,它将原本可能导致永久阻塞的同步回放成本分散并前置,配合状态监控,为维护长会话提供了必要的保障。
- GitHub 仓库:https://github.com/1622352030/dsh-session-rescue
- 插件目录:https://www.skillhub.cn/plugins/1622352030/dsh-session-rescue