前言¶
在 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、用宿主配对规则规划切点,再依次尝试:
- T1:用宿主暴露的 pruner 裁剪工具输出(零模型)。
- T2:调用宿主压缩引擎
compactIfNeeded(agent, 'context-overflow', signal);若代理返回拒绝(如dsh_compaction_refused),本进程内永久跳过该档。 - T3:机械折叠——写入
compaction/start→compaction/prune→ 带surfaceOp: replace的用户消息(结构化摘要)→compaction/end。 - 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>
典型用法¶
- 自动:保持默认
enabled: true、mode: auto。会话因上下文 400 或网关「payload … no upstream can accept」类拒绝时,插件在错误钩子上折叠并重试一步。 - 事前减压:依赖
preflight: true(默认),在投影已超窗时于 pre-step 折叠,减少一次白走的失败请求。 - 与宿主压缩共存但禁用 T2:设置
mode: "fold"或zeroModelOnly: true,只走剪枝与机械折叠,不调用宿主压缩引擎。 - 手动诊断:执行
/rescue-status或调用context_rescue的status;需要立刻压历史时用/rescue或context_rescue_fold。 - 只看不动:
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