🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

退化循环看门狗 null0xfff/dsh-degeneration-watchdog

DeepSeek Harness
null0xfff23 天前有提交已提供中文文档扫描:含敏感能力

检测流式输出重复打转,自动打断并压缩上下文续跑

31.2/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/15 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add null0xfff/dsh-degeneration-watchdog
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/10/31·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 23 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-degeneration-watchdog(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/15 20:06:41

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 7 处,展示前 7 条)
  • 写入本地文件
    lib/index.js:36
    mkdirSync(dirname(AUDIT_LOG), { recursive: true });
  • 写入本地文件
    lib/index.js:39
    appendFileSync(AUDIT_LOG, line);
  • 读取本地文件
    lib/index.js:196
    try { version = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")).version; }
  • 读取本地文件
    lib/index.test.mjs:9
    const source = readFileSync(new URL("./index.js", import.meta.url), "utf8")
  • 读取本地文件
    lib/index.test.mjs:141
    assert.equal(existsSync(path), true);
  • 读取本地文件
    lib/index.test.mjs:142
    assert.match(readFileSync(path, "utf8"), /continue message sent/);
  • 删除本地文件递归
    lib/index.test.mjs:149
    rmSync(directory, { recursive: true, force: true });
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-goal@deepseek-ai/dsh-goal-round-driver@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/dsh-session-projection@deepseek-ai/dsh-agent-preset-registry
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 插件:检测流式输出(含推理)里的退化循环并自动救援:取消 + /compact + 继续

README

由 DeepSeek 最新模型翻译生成
DSH Degeneration Watchdog 模型开始重复打转时,自动尝试打断、压缩上下文并继续任务。 =20"> 快速开始 ·工作方式 ·配置 ·常见问题 ·更新记录 它解决什么问题 让 DSH 跑长任务时,模型有时会连续输出相同的句子,或在思维链里反复出现“执行。/好。/执行。/好。”。流还在输出,任务却停在原地。 dsh-degeneration-watchdog 是 DeepSeek Harness 的后台插件。它监测流式回复中的重复模式,命中后按配置尝试恢复会话: 正文或思维链出现重复模式 ↓ 暂停活动 Goal(如有),保留排队输入并取消当前回合 ↓ 队列为空且会话空闲时,通过宿主服务压缩上下文 ↓ 恢复本插件暂停的 Goal,或为普通会话发送“继续” | 能力 | 实际行为 | | 正文与思维链双通道 | 分别累积、分别检测,思维链使用更低的行长门槛 | | 两类重复信号 | 检查连续行周期和尾部文本的 n-gram 重复比例 | | 按会话隔离 | 不同 agent、不同流式 attempt 的缓冲分开维护 | | 保留排队输入 | 取消时保留下一轮消息与 steering 输入,排队输入优先于自动救援 | | 原生 Goal 恢复 | 成功救援后按暂停后的 revision 恢复 Goal,由宿主继续驱动轮次 |
展开完整文档(README 剩余 1 节)
DSH Degeneration Watchdog

模型开始重复打转时,自动尝试打断、压缩上下文并继续任务。

=20">

快速开始 ·工作方式 ·配置 ·常见问题 ·更新记录

它解决什么问题

让 DSH 跑长任务时,模型有时会连续输出相同的句子,或在思维链里反复出现“执行。/好。/执行。/好。”。流还在输出,任务却停在原地。

dsh-degeneration-watchdog 是 DeepSeek Harness 的后台插件。它监测流式回复中的重复模式,命中后按配置尝试恢复会话:

正文或思维链出现重复模式 ↓ 暂停活动 Goal(如有),保留排队输入并取消当前回合 ↓ 队列为空且会话空闲时,通过宿主服务压缩上下文 ↓ 恢复本插件暂停的 Goal,或为普通会话发送“继续”

| 能力 | 实际行为 |
| 正文与思维链双通道 | 分别累积、分别检测,思维链使用更低的行长门槛 |
| 两类重复信号 | 检查连续行周期和尾部文本的 n-gram 重复比例 |
| 按会话隔离 | 不同 agent、不同流式 attempt 的缓冲分开维护 |
| 保留排队输入 | 取消时保留下一轮消息与 steering 输入,排队输入优先于自动救援 |
| 原生 Goal 恢复 | 成功救援后按暂停后的 revision 恢复 Goal,由宿主继续驱动轮次 |
| 有界救援 | 停止等待、压缩调用均有超时,每会话有救援预算 |
| 卸载与重载处理 | 取消旧实例的等待;未结束压缩在同一宿主运行环境、同一 agent 上保持互斥 |
| 可排查的日志 | 记录命中原因与救援步骤,自动创建日志目录 |

检测采用本地文本统计,不额外调用模型。上下文压缩和后续续写仍可能产生宿主模型费用。重复检测是启发式判断,正常的高度重复内容也可能命中。

快速开始

安装

先准备好可运行的 DeepSeek Harness。插件声明 Node.js >=20;宿主自身的 Node.js 要求以所用 DSH 版本为准。

安装到 Web profile:

dsh plugin --profile web add https://github.com/null0xfff/dsh-degeneration-watchdog

桌面端可在 Plugins → 添加插件 中使用同一地址:

https://github.com/null0xfff/dsh-degeneration-watchdog

安装或更新后重启对应 DSH 应用,让宿主加载新代码。仓库已包含运行所需的 JavaScript,使用插件无需先构建本项目。

确认生效

插件在后台运行,没有独立页面或聊天命令。加载时,宿主控制台与插件日志会出现包含以下内容的记录:

plugin loaded v0.8.0 selftestReasoning=false

默认开启检测、自动取消、自动压缩和原生 Goal 恢复。成功救援后,有本插件暂停的 Goal 就恢复该 Goal;普通会话在队列为空且仍空闲时发送“继续”。日常使用无需手动触发。日志位置见日志与排查。

工作方式

如何判断重复

插件订阅 agent/assistant-stream,分别处理正文 text-delta 和思维链 reasoning-delta。

| 判据 | 正文默认值 | 思维链默认值 |
| 开始检测的累计长度 | 400 字符 | 240 字符 |
| n-gram 统计尾部窗口 | 8,192 字符 | 16,384 字符 |
| 行周期上限 | 4 行 | 8 行 |
| 同一周期至少重复 | 3 次 | 5 次 |
| 行周期的最低行长 | 8 字符 | 2 字符 |
| n-gram distinct/total 阈值 | 低于 0.12 | 低于 0.12 |

正文另有短行路径:最低行长 2 字符,至少重复 8 次,使用正文的周期上限。行比较会规范化空白与大小写,并忽略空行;变化的非空短行会保留,避免把短标签之间的重复长语句拼成虚假的连续循环。

命中后如何恢复

1. autoAbort: true 时,如果原生 goals 服务中有活动 Goal,先暂停它并记住返回的新 revision。处置在事件发布结束后的微任务中执行。
2. 调用取消时传入 keepInbox: true,保留下一轮消息与 steering 输入,再等待会话空闲。排队输入已经存在,或救援期间有新输入到达时,结束本次救援,让排队任务先执行。
3. 优先通过宿主 commands 服务执行 /compact,确认命令返回成功。命令服务不存在,或没有解析到命令时,尝试该 agent 的 compaction.compactNow() 服务;已执行命令返回错误或抛出异常时停止。
4. 等待 settleDelayMs,再次确认会话空闲且没有排队输入。如果本插件暂停的 Goal 仍是同一 ID、同一 revision 且处于暂停状态,按 resumeGoal 设置恢复它;原生轮次驱动负责继续任务,不再插入普通「继续」。
5. 普通会话没有未完成 Goal 时,发送 continueText。已有暂停、阻塞或未武装(disarmed)Goal、新出现的 Goal、或用户修改过的 Goal 都不会被普通续写替代。

插件只通过可确认结果的服务压缩上下文,不把普通模型消息当作 /compact 命令执行。活动 Goal 的救援要求 autoAbort: true。Goal 服务不可用时保留普通会话路径;压缩服务缺失、失败、超时、排队输入竞争或卸载都会停止本次救援。由本插件暂停的 Goal 此时保持暂停,可检查日志后手动恢复;轮次预算耗尽也会保留宿主的错误结果。

配置

仓库中的 cordis.patch.yml 给出默认配置。安装后,在目标 profile 的 cordis.patch.yml 中按插件 ID 覆盖需要调整的字段,保留已有的其他插件配置;修改后重启对应 DSH 应用。

下面是常用配置示例,未列出的字段沿用默认值:

- id: dsh-degeneration-watchdog
config:
enabled: true
autoAbort: true
autoCompact: true
resumeGoal: true
continueText: "继续" maxRescues: 3 cooldownMs: 60000 idleTimeoutMs: 15000 compactTimeoutMs: 90000 settleDelayMs: 450

动作与日志

| 参数 | 默认值 | 说明 |
| enabled | true | 检测总开关 |
| autoAbort | true | 命中后取消当前回合 |
| autoCompact | true | 命中后尝试压缩上下文 |
| resumeGoal | true | 成功救援后恢复本插件暂停且未被修改的 Goal;false 时保持暂停 |
| continueText | 继续 | 普通会话成功救援后的续写文本,须为非空白字符串 |
| maxRescues | 3 | 每会话救援预算,范围 0–100;0 表示不限 |
| cooldownMs | 60000 | 预算重置间隔,范围 1,000–3,600,000ms |
| idleTimeoutMs | 15000 | 等待空闲的超时,范围 100–300,000ms |
| compactTimeoutMs | 90000 | 每次压缩调用的超时,范围 100–600,000ms |
| settleDelayMs | 450 | 续写前延迟,范围 0–5,000ms |
| verbose | false | 命中时额外记录 attempt 与缓冲长度 |
| selftestReasoning | false | 首个流结束后注入合成退化样本,会执行真实救援 |

预算按距上次救援开始的时间重置:超过 cooldownMs 后,下一次救援从零重新计数。这不是滚动窗口限流。

将 autoAbort 和 autoCompact 同时设为 false 可关闭自动动作;enabled: false 则关闭检测。布尔配置使用 YAML 的 true / false,不要写成带引号的字符串。selftestReasoning 仅用于验证救援链,日常保持关闭。

检测参数

| 正文参数 | 思维链参数 | 默认值:正文 / 思维链 | 用途 |
| windowChars | reasoningWindowChars | 8192 / 16384 | n-gram 统计尾部窗口 |
| minTextLength | reasoningMinTextLength | 400 / 240 | 开始检测的累计长度 |
| repeatThreshold | reasoningRepeatThreshold | 3 / 5 | 行周期最少重复次数 |
| maxCycle | reasoningMaxCycle | 4 / 8 | 行周期上限 |
| minLineLength | reasoningMinLineLength | 8 / 2 | 行周期最低行长 |
| dedupRatio | reasoningDedupRatio | 0.12 / 0.12 | n-gram 比率低于此值时命中 |

ngramSize 两通道共用,默认 8。正文短行路径使用 shortLineMinLength(默认 2)和 shortLineRepeatThreshold(默认 8)。完整默认值与归一化范围见 lib/detector.js。

日志与排查

设置了 DSH_HOME 时,日志写入:

$DSH_HOME/plugins/dsh-degeneration-watchdog/watchdog.log

父目录会自动创建。没有 DSH_HOME 时,使用 TEMP、TMP 或当前目录中的 dsh-degeneration-watchdog.log。文件写入失败会向控制台报告一次,后续仍输出控制台日志。

成功路径可通过这些日志关键字追踪:

rescue start
cancel issued
compacted (command) 或 compacted (direct)
continue message sent
rescue done
Goal 路径还会出现 goal paused、goal resumed、goal recovery disabled 或 goal recovery skipped: goal changed。提前停止时查看 rescue stopped 后的原因。日志记录检测通道、判据、比率及救援步骤,不记录触发检测的回复样本;宿主返回的命令结果和错误文本仍可能进入日志。文件暂未轮转,应自行管理保留周期。

常见问题

| 现象 | 检查方式 |
| 安装后找不到插件页面 | 它是后台插件。查看控制台或日志中的 plugin loaded,确认版本与启用状态 |
| 已取消,但没有自动继续 | 有 Goal 时查看原生恢复记录;普通会话检查排队输入、等待超时、压缩服务缺失、命令错误或新的会话活动 |
| Goal 仍处于暂停状态 | 检查 resumeGoal、排队输入、用户改过的 revision、压缩失败、卸载或 Goal 轮次预算;插件只恢复自己暂停且状态未变的目标 |
| 看起来在重复,但没有触发 | 检查累计长度、重复门槛、是否跨 attempt;救援进行中或旧压缩未结束时会跳过新检测,预算耗尽时会跳过新救援 |
| 正常内容被打断 | 确认命中的是行循环还是 n-gram;按通道提高重复门槛,或降低 n-gram 阈值。排查期间可关闭自动动作 |
| 压缩超时后重载插件,仍未再次压缩 | 服务可能忽略了取消。对同一 agent,旧任务真正结束前会保留互斥,避免重叠操作 |
| 更新后仍显示旧版本 | 重启对应 DSH 应用,再检查 plugin loaded 的版本记录 |

兼容性与限制

- 自动压缩依赖宿主的 commands 或 compaction 服务;插件本身不提供压缩模型或压缩引擎。
- DSH 接口仍在演进,代码优先使用 agentPresets.serviceFor,保留可选 registry、agent context 和旧版根服务表解析。原生 Goal 集成测试针对 0.2.0-rc.2;其他宿主版本需要核验相应服务接口。
- 缓冲按 agent 和 attempt 分隔,跨 attempt 的慢速退化不合并检测。
- 无换行循环主要依赖 n-gram 信号,触发时机受窗口和阈值影响。
- 热重载互斥适用于同一宿主 JavaScript realm、同一 agent 对象。忽略取消且永不结束的服务会持续阻止该 agent 的新压缩。
- 本插件检测文本重复,不判断任务的语义进度,也不保证每次退化都能恢复。

开发与测试

完整测试使用 Node.js 22+,克隆仓库后安装锁定的开发依赖:

git clone https://github.com/null0xfff/dsh-degeneration-watchdog.git
cd dsh-degeneration-watchdog
npm ci --ignore-scripts
npm test

npm run test:unit 无需额外测试依赖,覆盖检测器、配置边界、短行、超时与取消、迟到结果、卸载与热重载、会话隔离、预算和日志。另有真实模块加载和日志写入的冒烟验证。

npm run test:integration 使用真实 Session、Goal 和 Goal 轮次驱动服务,配合受控 Agent 与压缩替身,验证事件发布中的延迟写入、暂停后的 revision、原生轮次续跑、排队输入保留、用户编辑和轮次预算。测试使用临时目录,不读取用户会话、不调用模型;它不等同于完整真实模型会话验收。开发依赖不随插件发布包打包。

GitHub Actions 配置 Linux / Windows 单测(Node.js 20 / 22)与集成测试(Node.js 22 / 24)矩阵,运行结果见 Actions。

| 文件 | 作用 |
| lib/detector.js | 检测判据、默认值与配置归一化 |
| lib/index.js | 流订阅、救援、日志与生命周期 |
| cordis.patch.yml | DSH bundle 默认配置 |
| CHANGELOG.md | 版本变化与升级说明 |

反馈问题时,可在 Issues 附上插件版本、宿主版本、相关配置和去除私人信息后的日志片段。

许可证

MIT。
预览分享卡片长什么样 ↓null0xfff/dsh-degeneration-watchdog
分享 · DeepSeek Harness Hub
null0xfff/dsh-degeneration-watchdog

检测流式输出重复打转,自动打断并压缩上下文续跑

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部