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

重复输出守卫 Mcd0LUO/dsh-guard-repeat-output

DeepSeek Harnessv2.1.7
Mcd0LUO20 天前有提交已提供中文文档扫描:未发现敏感能力

在模型陷入重复循环、把上下文烧光之前拦住它。

34.2/100
综合分
6
GitHub 星标
70
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-guard-repeat-output
npm 源 · dsh-guard-repeat-output 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · security
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 20 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包dsh-guard-repeat-output @ 2.1.7
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖要求 >=0.1.6-alpha.2 <0.3.0-0 · 最新 0.2.1-rc.2 兼容
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 08:37:04

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

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 检测重复坍缩
  • 丢弃退化尝试
  • 回溯净化会话

DSH 的主机侧退化防护:剔除垃圾码点,检测重复坍缩并在进入历史前丢弃该次尝试,还能回溯净化被污染的会话。

v2.1.62026-10-04
· 已修复:短句重复塌缩不再被检测到,导致守卫不再丢弃坏尝试或重新发起调用。检测器丢弃了所有短于 minSegmentChars(12)的片段,本意是滤掉标点噪声。当退化模式从长句(Let me write the call.)迁移到短句(OK. / Let me run.)后,一次塌缩的每个片段都落到了这个下限之下。损害比漏检更糟:因为 duplicateShare 是在幸存片段上计算的,丢掉重复片段反而让塌缩看起来多样而非重复。一次真正循环 OK. 44 次的塌缩算出重复占比 0.60,始终没被判定。现在只要片段含字母或数字就保留,无论多短;只丢弃纯标点。minSegmentChars 已移除,degenerationOnset 使用同一规则,检测与裁剪保持一致。 · lowInfoDupShare 0.85 → 0.80。修正分段后,占比在与短语分支相同的片段集上计算;0.85 是针对旧的、按长度过滤的统计调出来的。 · 实测,不靠假设。在冻结语料(62 次真实塌缩、1708 段真实合法推理)加上新模式下实时捕获的 146 次塌缩上:修复后的检测器判定 62/62、146/146,误报 0/1708。上一版本只抓到实时塌缩中的 0/146。 · 生产影响:2026-09-29 至 2026-10-02 期间,单个会话里有 144 次塌缩被静默放行(09-30 有 22 次,10-01 有 106 次,10-02 有 15 次),这就是守卫日志从 09-29 起变安静的原因。 --- npm:npm i dsh-guard-repeat-output@2.1.6
v2.1.52026-09-27
仅文档改动,不影响行为。 · 中文 README 重写以提升可读性。第一版是对英文的逐字翻译,读起来密集,满是中文读者得费劲解码的术语。现在开头先给一段大白话摘要,用日常措辞讲清每个机制,删掉只有改源码时才用得上的细节。 · 修正英文 README 里两个数字。事故表里写「let me write the call」× 1,951,实际是 1,952。引用的短语现在按抓取文本原样复现(首字母大写,带句末句号),这样计数能靠搜索核对,不用靠猜。 · 两个 README 现在都写明实测的生产结果——真实崩溃抓到 12 次,12 次全部恢复,被丢弃的文本没有一次进入会话历史。
v2.1.42026-09-27
· 修复:空的 modelIncludes 会悄悄把范围放宽到所有模型。 [] 本意就是「所有模型」,但 [' '] 这种调用方明显想收窄的列表却被过滤成空,于是也匹配了一切。这跟意图正好相反,也是危险的方向,因为每个阈值都只按 DeepSeek 的输出校准。 现在,非空列表若条目全部被规范化掉,会直接报错,并在错误信息里点明可以改用空数组。truncateChannels 也查过同类问题,是安全的:它精确匹配,所以没匹配上的条目只会关掉截断,不会到处开启。 · 中文 README(README.zh-CN.md),两个文件都加了语言切换。 · verify/config.mjs —— 23 项检查,覆盖范围校验、数值区间和布尔开关,以后改动就不会悄悄把这种失败即放行的问题带回来。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-guard-repeat-output 在模型陷入重复循环、把上下文烧光之前拦住它。 DSH 的插件。它盯着模型的输出流,一旦发现车轱辘话,立刻掐掉。 语言: English | 简体中文 三十秒了解 模型偶尔会卡住。本该把话说完,它却开始一遍遍重复同一句: let me write the call let me write the call let me write the call ... 没人拦着的话,它会一直重复下去——也一直烧 token——直到自己停下,或者被人手动取消。这些废话全部留在上下文里,把真正有用的内容挤走。 这个插件做两件事: - 输出过程中管:实时检测,发现循环就丢弃这一次的回复,重新问一遍。 - 事后也能救:如果某个会话早就被污染了(比如插件装上之前就出过问题),/guard-cleanup 能把历史里那些废话块遮掉,让它不再被反复重放。 实际效果(生产环境跑了约两天):拦下 12 次真实重复崩塌,全部恢复成功,0 次失败;被丢弃的文本一次都没有混进会话历史。 问题有多严重 不是罕见情况。
展开完整文档(README 剩余 1 节)
dsh-guard-repeat-output

在模型陷入重复循环、把上下文烧光之前拦住它。

DSH 的插件。它盯着模型的输出流,一旦发现车轱辘话,立刻掐掉。

语言: English | 简体中文

三十秒了解

模型偶尔会卡住。本该把话说完,它却开始一遍遍重复同一句:

let me write the call let me write the call let me write the call ...

没人拦着的话,它会一直重复下去——也一直烧 token——直到自己停下,或者被人手动取消。这些废话全部留在上下文里,把真正有用的内容挤走。

这个插件做两件事:

- 输出过程中管:实时检测,发现循环就丢弃这一次的回复,重新问一遍。
- 事后也能救:如果某个会话早就被污染了(比如插件装上之前就出过问题),/guard-cleanup 能把历史里那些废话块遮掉,让它不再被反复重放。

实际效果(生产环境跑了约两天):拦下 12 次真实重复崩塌,全部恢复成功,0 次失败;被丢弃的文本一次都没有混进会话历史。

问题有多严重

不是罕见情况。生产服务器上抓到的两次真实事故:

| 长度 | 内容 |
| 137 万字符 | "Let me produce." 重复 27,269 次 |
| 25 万字符 | "Let me write." 重复 1,958 次,与 "Let me write the call." 重复 1,952 次交替出现 |

过程中没有任何机制察觉。这一轮继续跑、继续计费,直到模型自己停下或有人取消。这些 token 之后全部堆在上下文窗口里。

它怎么工作

输出进行中

1. 清洗乱码 —— 控制字符、替换符、零宽字符这类东西本来就不该出现在回复里,在转发前直接删掉,不让它们进日志。这一步不需要判断,见到就删。如果乱码特别密集(比如连着一长串 NUL 字节),说明模型已经崩了,直接当异常处理。

2. 检测重复 —— 在模型的思考内容里滚动检查,看短语重复程度、信息量、段落结构。

3. 丢弃 —— 判定异常后,这一次的回复不算数,不会被当成正常消息存下来,所以那些废话不会进入对话历史。

4. 重试 —— 原样重新问一遍,不改任何参数。为什么不改?见下一节。

5. 收尾 —— 重试次数用完后,在估计的起点处切断,并让模型收个尾,保证这一轮正常结束而不是报错失败。

事后清理

6. /guard-cleanup —— 扫描会话历史,找出已经存进去的重复内容,用一小段说明把它遮住。这样下次请求就不会再重放它。不会删除任何数据,原始内容仍保留在日志里供审计。

为什么需要这个:实时检测救不了它装上之前就已经发生的问题。有一次真实事故,插件上线后发现上下文里仍然塞着 20 万字符的废话(两个块,分别 11 万和 9 万字符),每次请求都在重放——正是这些内容在诱导模型再次进入循环。

一条安全规则:如果某条消息里带着工具调用,就跳过它、不遮。因为遮掉它会让它调用的工具结果变成孤儿,服务方会因此拒绝整个请求。真正失控的思考过程不会带工具调用(那次事故里 72 万字符的块,工具调用是 0 次),所以这条规则基本不影响效果。

为什么重试时不调整推理档位

早期版本会在重试时把推理档位降一档,想法是「换个参数也许就不重复了」。实测之后删掉了:

| 观察 | 结果 |
| 降档后恢复的次数 | 9 / 9 |
| 但其中之后又再次崩塌的 | 6 / 9(67%) |
| 降档被服务方拒绝的次数 | 7 次,其中 3 次直接把这一轮搞失败 |

67% 这个数字是关键:降档并没有让模型免疫,真正起作用的是「重新生成一遍」。而每次被拒绝都是同一个原因——服务方不接受模型没有声明的档位(比如 does not support reasoning effort "medium")——本来已经拦下的问题,反而变成了整轮失败。一个补救措施如果能把正在抢救的那一轮弄死,那还不如不做。

测量脚本保留在 verify/effort-necessity.mjs,你可以自己复现这个结论。

兼容性

支持的 DSH 版本范围:>=0.1.6-alpha.2 <0.3.0-0。

| DSH | 状态 |
| 0.2.1-alpha.2 | 已验证——能启动、guard 处于 active、配置可解析 |
| 0.2.0-rc.2 | 已验证——真实流量(CHANGELOG.md 里记的那些定罪就是它跑出来的) |
| 0.1.6-alpha.2 … 0.2.0-rc.1 | 声明的下界,与同作者另两个插件一致;未做机器验证 |
| >=0.3.0-0 | 不支持 |

这个插件不从 @deepseek-ai/* 里 import 任何东西——只依赖 Node 内置模块和自身文件——所以没有包层面的版本耦合。它真正耦合的是四个宿主接缝:

| 接缝 | 用途 |
| llm/stream | 包住 delta 流——整个实时防护就挂在这里 |
| agent/request-error | 重新发起被丢弃的那次尝试 |
| agent/pre-step | 每步的重试预算与续写消息 |
| commands(经 ctx.inject) | 注册 /guard-cleanup |

agents 和 sessionQuery 都通过 ctx.get(...) 读取,取不到只会返回 undefined 而不会抛错,所以某个服务缺失只会让对应功能退化,不会让插件起不来。但宿主一旦改名或移除上面这四个接缝,对本插件就是破坏性变更。

包里把这个范围声明成了对 @deepseek-ai/dsh 的 peerDependencies,所以 DSH 插件管理器的兼容闸门会强制它:在范围外的版本上安装或启用会被直接拒绝,而不是等到运行时才失败。闸门比较时包含预发布版本,所以上面列的 alpha / rc 版本能正常匹配,不会被跳过。拒绝并非永久——确认风险后可以用插件管理器授予「精确版本豁免」(dsh plugin allow-version,或插件管理器界面)。只有在核对过上面那几个宿主接缝确实没变之后,才该这么做。

安装

推荐:在 DSH 网页界面里装。 打开侧边栏的「插件」,安装 dsh-guard-repeat-output 并启用。管理器会读取包里的 dsh.bundle 声明,自动把它注册成一个 profile 层——不需要你写任何配置。

手动安装。 装包和注册成插件层是两件独立的事,只做前一件的话,包装上了但永远不会被加载:

dsh plugin --profile web add dsh-guard-repeat-output

// <profile>/package.json —— 把包名加进 bundle 列表
"dsh": { "profile": { "bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-guard-repeat-output"
] } }

不要把配置块抄进去。包内已经自带一份完整的 patch(cordis.patch.yml),包含所有默认值,插件行就是它插入的。

改默认值

所有默认值都由包内的 patch 生效了。要改某一项,往你 profile 的 cordis.patch.yml 里加一段按 id 定位的 patch 即可——用户层会在所有 bundle 层之后应用:

- id: guard-repeat-output
config:
maxDegenerationRetries: 3
modelIncludes: ['deepseek', 'glm']

配置

每个选项的详细说明(以及默认值是怎么测出来的)都写在 cordis.patch.yml 里。常用的几个:

| 选项 | 默认值 | 作用 |
| modelIncludes | ['deepseek'] | 只对这些模型生效,按 id 子串匹配。空数组 = 所有模型。 |
| truncateChannels | ['reasoning'] | 允许拦截哪些内容。其它内容只观察、不干预。 |
| maxDegenerationRetries | 2 | 重试几次后放弃重试,改为截断收尾。 |
| holdbackChars | 4096 | 提前扣留多少字符,好让切断点落在真正的起点。 |
| sanitizeGarbage | true | 是否清洗乱码字符。 |
| cleanupCommand | true | 是否注册 /guard-cleanup 命令。 |
| copyDir | null | 把丢弃的内容另存一份,方便事后分析误报。绝不会被读回请求。 |
| logPath | null | 记录每次判定的日志文件,方便事后排查。 |

关于 modelIncludes 的两种「空」:[] 是有意表示「所有模型」。但如果你写的是 [' '](有内容但全是空格),会被拒绝并报错——因为它看起来是你想限定范围、只是写错了。如果静默当成「所有模型」,结果和你的意图正好相反;而所有阈值都只在 DeepSeek 上验证过,贸然放开风险更大。

路径写法

copyDir 和 logPath 在各平台上写法一致,不假设你在用 Linux:

| 写法 | 解析结果 |
| logs/guard.log | $DSH_HOME/logs/guard.log(没有则 ~/.dsh/logs/guard.log) |
| ~/logs/guard.log | 用户主目录下 |
| /var/log/guard.log | 原样使用(Linux / macOS 绝对路径) |
| C:\logs\guard.log | 原样使用(Windows 绝对路径) |
| null | 关闭该功能 |

相对路径是相对 DSH 主目录,不是相对当前工作目录(后者每次启动都可能不同)。路径不会用字符串拼接,所以 Windows 下不会出现混用的分隔符。

开发

它挂载在哪

- llm/stream —— 清洗、检测、拦截。
- agent/request-error —— 重新发起被判定为退化的请求。
- agent/pre-step —— 兜底:确保重试时提示语一定送到。
- commands —— 注册 /guard-cleanup(服务可用时)。

注意它没有挂 agent/request:重试时的请求和原来完全一样,这是刻意的。

测试

语料是真实抓取的模型输出,不随包发布。
把第一个参数指向任何包含 legit/L00001.txt 和 unreg/deg1-seq2608.txt 的目录。
node verify/integration.mjs <corpusRoot> # 端到端检测与干预
node verify/mutations.mjs # 检测器对照测试
node verify/cross-platform.mjs # 路径解析与文件名安全
node verify/maintenance.mjs # 清洗与事后清理
node verify/config.mjs # 配置校验

verify/effort-necessity.mjs 是运维诊断脚本,不是自包含测试:它读取实际运行的守卫日志和会话目录,用来复现上面的测量结论。

许可证

MIT
预览分享卡片长什么样 ↓Mcd0LUO/dsh-guard-repeat-output
分享 · DeepSeek Harness Hub
Mcd0LUO/dsh-guard-repeat-output

在模型陷入重复循环、把上下文烧光之前拦住它。

回到顶部