dsh-context-rescue:上下文爆窗时的 DSH 会话急救

前言

在 DeepSeek Harness(DSH)里跑长会话时,常见一种卡死:每条请求都返回 400,提示请求超过模型上下文窗口;手动 /compact 往往也救不回来——压缩若沿同一条超限的投影重发,字节级相同就会再失败;若压缩被代理层接管,还可能直接被拒绝。现有插件多数是事前预防(滚动换窗、裁剪工具输出、代理侧压缩),很少在会话已经死锁之后才介入。下面介绍社区插件 dsh-context-rescue(维护者 Lequait,分类:工作流):识别溢出、把最老历史折叠成结构化摘要、对同一步重试一次;摘要阶段不调用模型,可与其它压缩类插件共存。

这是什么

dsh-context-rescue 是挂在 DSH 上的工作流插件,bundle id 为 context-rescue。它针对「上下文爆窗」:在请求失败或(可选)发出前预检时,按阶梯缩小会话投影,再让 agent 循环用变小后的历史重发同一步。README 说明其失效背景与上游讨论 DSH #10138 相关——网关用自然语言拒绝时,宿主分类器可能打不上 CONTEXT_WINDOW_EXCEEDED,自带溢出分支不执行,重发请求不变就会循环失败;本插件挂在 agent/request-error 上,不依赖错误码是否准确。

运行时它不 import 任何 @deepseek-ai/* 包,按宿主线上结构本地构造 surfaceOp、compaction 事务与配对规则;也不声明宿主 peer 依赖。npm 包版本 0.2.4,要求 Node >=20、DSH >=0.2.0-rc.1。

核心功能

失败后的四档阶梯

请求失败且判定为上下文溢出时,插件会计量 token、用宿主配对规则规划切点,再依次尝试:

  1. T1:用宿主暴露的 pruner 裁剪工具输出(零模型)。
  2. T2:调用宿主压缩引擎 compactIfNeeded(agent, 'context-overflow', signal);若代理返回拒绝(如 dsh_compaction_refused),本进程内永久跳过该档。
  3. T3:机械折叠——写入 compaction/start → compaction/prune → 带 surfaceOp: replace 的用户消息(结构化摘要)→ compaction/end。
  4. T4:当超窗内容实质只有一条超大消息时,用首尾摘录替换该条,并在检查点中记录原文长度与丢弃部分;系统提示词不会被摘录。

全档有效则返回 { kind: 'retry' },只重试一次;否则 next() 把真实错误交回宿主。摘要内容为结构化事实(错误、路径、任务、操作、用户意图、最近结论等),不调用模型生成 prose。

发出前的预检(preflight)

同一套逻辑也可挂在 agent/pre-step(配置 preflight,默认 true):先量即将发出的投影;若已超过模型窗口则就地折叠(先 T1,再走零模型检查点);若仅落在压力带(fitRatio × 窗口 到窗口之间)则不动,交给宿主常压缩策略。预检在一个 turn 内只完整测量一次,大段新粘贴会触发重测。

两种计数

measure() 统计 surface 节点;上游实际吃的是 session.deriveMessages() 生成的请求,两者可能不一致。/rescue-status 与工具 context_rescue 的 action: "status" 会分别报告;折叠后派生请求必须比折叠前更小且在窗口以内。

工具与斜杠命令

工具 用途
context_rescue action: "status" 报告占用与上次急救;action: "rescue" 立即走阶梯
context_rescue_estimate 可选 text,分类报错文本并报告本会话占用
context_rescue_fold 立即机械折叠最旧一段并报告 token 变化
命令 用途
/rescue 立即折叠并报告;/rescue status 只报告
/rescue-status 占用、窗口、可折叠区间或将被摘录的消息、上次急救结果

工具与命令不抛异常,统一返回带 ok、reason 和计数的对象。无命令注册表的 profile 仍保留自动急救与工具。

配置要点

全部可选;拼错键或不合法值会以 config: 开头的 warn 或 schema 拒绝启动。常用项示例:

键 默认 含义
enabled true 关闭则完全不挂载
mode "auto" auto / fold(跳过 T2)/ diagnose(只报告)
zeroModelOnly false 为 true 时不走模型压缩引擎
preflight true 超窗时在 pre-step 就地折叠
fitRatio 0.9 低于该比例视为装得下
targetRatio 0.75 折叠目标占窗口比例
retainRatio 0.25 最近尾部保留占比
windowFallback 196608 无法解析窗口时的回退值

完整选项见仓库 README 与 dsh --dump-config-schema(插件通过 lib/schema.js 注册 schema)。

救不回的情况

若系统提示词 alone 已超过窗口,阶梯会试完各档后将该会话记为「已无解」,避免每请求重复全量测量;换更大窗口模型或历史形状变化后会重新测量。手动 /rescue 或 context_rescue 的 action: "rescue" 总会再试一次。

安装与启用

安装后需重启 DSH 一次以便加载新 bundle。官方 README 给出的安装方式如下:

# 从 Git 仓库(分支跟随 master)
dsh plugin --profile <profile> add git+https://github.com/Lequait/dsh-context-rescue.git#master

# 本地目录
dsh plugin --profile <profile> add /path/to/dsh-context-rescue

# 从 npm(0.2.4 已发布)
dsh plugin --profile <profile> add dsh-context-rescue

若通过 Discover 发现:在索引源中添加
https://github.com/Lequait/dsh-context-rescue/raw/master/market/index.json,选中条目安装的是 index 里钉住的 commit,而非浮动分支。也可钉住指定 commit:

dsh plugin --profile <profile> add git+https://github.com/Lequait/dsh-context-rescue.git#<commit>

典型用法

  1. 自动:保持默认 enabled: true、mode: auto。会话因上下文 400 或网关「payload … no upstream can accept」类拒绝时,插件在错误钩子上折叠并重试一步。
  2. 事前减压:依赖 preflight: true(默认),在投影已超窗时于 pre-step 折叠,减少一次白走的失败请求。
  3. 与宿主压缩共存但禁用 T2:设置 mode: "fold" 或 zeroModelOnly: true,只走剪枝与机械折叠,不调用宿主压缩引擎。
  4. 手动诊断:执行 /rescue-status 或调用 context_rescue 的 status;需要立刻压历史时用 /rescue 或 context_rescue_fold。
  5. 只看不动:mode: "diagnose" 仅检测与报告,不改写会话。

将一段网关报错贴给 context_rescue_estimate(参数 text)可辅助判断是否为溢出类失败及提取的尺寸信息。

适用场景与注意

适合:长工具链、大段日志或文件粘贴导致 DSH 会话请求被拒、且 /compact 无效或代理拒绝压缩的场景;需要与滚动换窗、输出裁剪等「事前」插件叠加使用时——本插件平时不介入,仅在失败或 pre-step 超窗时动作。

注意:

  • 插件以当前 DSH 进程权限运行,安装前应阅读 GitHub 仓库 源码与 LICENSE,自行评估信任边界。
  • 机械折叠会丢失细节,保留骨架与路径线索;一次贴入多条超大内容时,旧历史先折,本轮新消息尽量保留,仅在仍超窗时才摘录。
  • 社区目录 SkillHub 条目 为独立索引,与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,市场 bundle 可选,Discover 依赖你自行配置的索引源。

结尾

dsh-context-rescue 补的是「会话已爆窗」这一环:零模型结构化折叠 + 单步重试 + 可选 pre-step,与现有预防型插件互补。查阅详情与更新:

  • 目录页:https://www.skillhub.cn/plugins/Lequait/dsh-context-rescue
  • GitHub:https://github.com/Lequait/dsh-context-rescue
羽毛球分组比赛记分
小程序二维码

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

小夜