dsh-loop-recover
v0.3.6
Published
Dead-loop rescue for DeepSeek Harness: detects model repetition mid-stream, prunes the loop from the committed message, and resumes the task automatically.
Maintainers
Readme
做什么
本地小模型(Ornith,部分版本 qwen 等)容易陷入两类死循环:字面刷屏(ssssss...)和语义复读(反复论证同一段话)。普通循环守卫只会"切断+终止",任务直接死掉。
dsh-loop-recover 是完整的救援链:
- 检测 —— 五层检测器:周期扫描 / n-gram / 锚段 / 单字符刷屏 / 短句池 + 意图级工具查询跟踪
- 剪枝 —— 流内切掉重复后缀,留一行标记让模型知道这里删过东西
- 压缩 —— 被污染的上下文换成检查点摘要(v4
compaction/*事务),模型没法再回放同样的推理 - 续跑 —— 自动 followup 原任务,换采样参数——不开新会话,不重启
全在同一个 agent 循环里完成,救援后模型继续干活。
安装
GUI(推荐)
打开 插件 → 添加插件,搜 dsh-loop-recover,点安装。
命令行
dsh plugin --profile desktop add dsh-loop-recover
# 然后重启 app配置
32 个配置项全部在插件页可视化编辑——不用手写 YAML。分组:基本 / 救援 / 续跑参数 / 意图检测 / 检测阈值 / 检测器(高级折叠)。
| 分组 | 关键字段 |
|---|---|
| 基本 | mode(rescue/cut/observe)、watch、language、keepLanguage、marker、debugLog |
| 救援 | maxConsecutiveRescues(连续救援上限)、compactOnRescue(续跑前压缩)、stallCalls(空转提示) |
| 续跑 | retryTemperature、retryReasoningEffort、retryRequests |
| 意图 | intentEnabled、intentNoveltyThreshold、intentConfirmCount |
模式:rescue(剪+压+续,默认)、cut(只剪不续)、observe(只记日志零干预——先用它评估阈值再上救援)。
冲突说明
不同插件解决不同问题——不要叠装:
| 插件 | 做什么 | 冲突原因 |
|---|---|---|
| dsh-agent-loop-guard | 检测循环即切断 | 同包装 llm/stream → 双重截断、状态错乱 |
| dsh-client-auto-continue | 中断后自动续跑 | 重复唤醒 → 两条冲突的续跑指令 |
| dsh-session-shift | 上下文压力压缩→新会话 | 职责重叠 → 一边压缩一边开新会话 |
用本插件时请禁用它们。
工作原理
llm/stream(仅 agent 调用)
↓ StreamLoopDetector 监控 reasoning & text 块
命中循环 → 剪除重复后缀 → 重写 block-end → finish: stop
↓ commitLoopCompaction——v4 事务,旧上下文换检查点
↓ followup()——续跑原任务,换采样参数非 agent 请求(标题/摘要生成)原样透传不干预。
开发
npm test # 66 个单元+集成测试
npm run check # 插件加载冒烟协议
MIT · NOTICE 上游署名(改自 dsh-compaction 辅助代码)。
