前言¶
在 DeepSeek Harness(DSH)里跑智能体时,模型偶尔会进入「塌缩」:输出从正常推理退化成短句刷屏,例如「好。写。发。」循环,或固定动作词绕圈。若只是中途停掉,半截内容仍可能以 assistant/message 进入可见历史,下一轮会继续照着垃圾写。
dsh-collapse-guard(npm 包名 doudou-collapse-guard,仓库 otonemame/dsh-collapse-guard)挂在 llm/stream 瀑布上监听 chunk,发现重复塌缩后断流,并以 finish(error) 结束本步,使本步只写 assistant/attempt,不产生带 surface 的 assistant/message。下文介绍其定位、断流方式、安装与配置。
这是什么¶
维护者 otonemame,分类为模型推理,许可证 MIT(package.json 版本 0.1.0)。
一句话:在 LLM 流式输出中扫描近期行与滚动原文,命中塌缩规则时中止流,并以 provider 失败(failure.code = STREAM_COLLAPSE)收场,让垃圾不进入模型可见历史。
兼容性要求:dsh >= 0.2.1,node >= 20。README 说明对 dsh 0.3 的破坏性变更未在声明中锁定,升级到 0.3 后建议先查看 fires.jsonl 是否正常记录。
为什么要用 finish(error)¶
不是所有断法效果相同:
| 断法 | 后果 |
|---|---|
补 finish(stop) |
agent-loop 当作正常结束,半截内容进历史 |
agent.cancel() |
写 assistant/message 且 interrupted:true,仍进历史 |
补 finish(error) |
只写 assistant/attempt,本步不产生 assistant/message |
本插件采用第三种;STREAM_COLLAPSE 刻意不在 dsh-llm-retry 默认重试集里(默认仅 EMPTY_RESPONSE / RATE_LIMIT / SERVER / TIMEOUT / TRANSPORT),因为塌缩与当前请求属性相关,重试等于整段 prompt 再跑一遍。
核心功能¶
监听与硬上限¶
- 挂在
llm/stream上包住上游 chunk 流,扫最近一百多行(默认主窗 128 行),发现退化成重复碎念则断流并补 terminalfinish(error)。 - README 称一次可截断二十余万字符级别的垃圾吞吐(
hardChars默认 200000)。 - 围栏(
``)内内容不参与判定;超过skipLineChars`(默认 2000)的长行跳过且不清窗。
六种塌缩形态(规则码)¶
| 规则码 | 抓的是什么 |
|---|---|
short-line-tight |
最近 48 行里不同短句 ≤ 2 种 |
short-line-dominant |
整窗(128 行)里不同短句 ≤ 4 种 |
short-line-cycle |
5–12 种短句按固定周期原样绕圈 |
short-line-spread |
种数更多,但最多那种占一半以上 |
short-line-run |
尾部连续 12 行以上短句,且占比满足条件(应对塌缩跟在长推理后面的情况) |
paragraph-repeat |
滚动原文里同一段连着重复 ≥ 3 次(累计不算) |
hard-cap |
单通道超过 hardChars 仍在继续 |
段落复读另用 4096 字符滚动原文,找连着重复三遍的周期串(段长 8–400 字),每增 48 字符扫一次;不换行的重复也走此路径。
形态随上下文变化:塌缩往往在复制上下文里高频出现的句式,规则表是「目前见过的六种」,新形状需增补规则。插件管得住一直吐到爆,管不住本不该塌的生成——README 建议从参数侧降低 reasoning_effort 等。
命中后的界面表现¶
界面大致提示:
模型推理通道进入重复塌缩(尾窗只剩 3 种短句,「发。」出现了 42 次,已读到 4403 字符),守卫掐断了本次流。
本轮结束,不会自动重试;再发一句即可继续。
安装与启用¶
官方安装命令(来自 README):
plugin_manager install_bundle target="github:otonemame/dsh-collapse-guard"
也可在 cordis.patch.yml 里手动插入类似 dsh-mcp-client 的条目,name 写 doudou-collapse-guard。
本地开发时包挂在 @local/doudou-collapse-guard,装时认 npm 包名,搜仓库认 dsh-collapse-guard。
注意:插件在当前 dsh 进程权限下运行;安装前请自行查看 GitHub 源码 与 MIT 许可证。DSH 社区插件目录(SkillHub 条目)为独立站点,与 DeepSeek / 幻方无官方从属关系。
关闭方式¶
任选其一,下一请求即生效(空文件方式无需重启 DSH):
- 创建空文件:
~/.dsh/doudou-collapse-guard/off - 环境变量:
DOUDOU_COLLAPSE_GUARD_OFF=1 - 在 DSH 设置中关闭该插件
典型配置¶
配置优先级:默认值 → cordis.patch.yml 的 config → 环境变量 DOUDOU_COLLAPSE_GUARD_CONFIG(JSON)。
常用键(节选,默认见 README):
| 键 | 默认 | 说明 |
|---|---|---|
window |
128 | 主判据窗口行数 |
distinctMax |
4 | 主判据允许的不同短句种数 |
tightWindow |
48 | 紧判据窗口 |
tightDistinctMax |
2 | 紧判据允许的不同短句种数 |
maxLineChars |
32 | 超过此长度算长行 |
hardChars |
200000 | 单通道硬上限 |
watch |
['reasoning-delta','text-delta'] |
监听的通道 |
enabled |
true |
false 等于不挂 |
例:只监控推理通道:
DOUDOU_COLLAPSE_GUARD_CONFIG={"watch":["reasoning-delta"]}
交接记录¶
每次触发写一行 JSONL:$DSH_HOME/doudou-collapse-guard/fires.jsonl(未设 DSH_HOME 则为 ~/.dsh),超过 512 KB 自动轮转为 .1。行内包含时间、规则码、通道、阈值快照、sessionId、model 等,便于事后回校判据。
已知边界¶
- 段落复读日志里长行可能显示为
<长行>占位符。 - 只读流,不改判据外内容,不碰历史与会话文件。
结尾¶
dsh-collapse-guard 面向 DSH 下长流式推理的塌缩止血:用六种(加硬上限)规则识别重复短句与段落复读,以 STREAM_COLLAPSE 失败结束本步,避免半截垃圾进入可见历史。适合已遇到刷屏塌缩、且希望与 dsh-llm-retry 默认策略区分的开发者。