dsh-unstuck:DeepSeek Harness 会话断连与假死的自动恢复

前言

在 DeepSeek Harness(DSH)里跑长任务时,常见一种体验:界面看起来已经停住,没有报错,也没有在等你审批,但 agent 也不再往下执行。你只好手动发一句「继续」,任务才接上。另一类情况是轮次在日志里记成 completed,实际上模型本想调用工具,却被兼容层把调用标记吐成正文,循环误以为「这轮说完了」而静默 idle。还有请求已发出、却长时间收不到任何流片段的假死。

桌面端自带「继续」按钮可以处理部分异常结束,但对手动操作依赖高,且对「假完成」往往无能为力——它会把 completed 当成已收工而拒绝续跑。下面介绍社区插件 dsh-unstuck(维护者 Chlyz621,SkillHub 分类:工作流),在进程内按会话日志做结构化检测,在合适时机自动补发续跑或掐掉不当推进,无需裁判模型、也不额外发网络请求。

这是什么

dsh-unstuck 是挂在 DSH 上的监督员插件:当一轮对话异常结束、被记成完成却实际卡住、或模型请求长时间无流时,按策略自动 unstuck;当你被卡在审批或问答上时只记录和通知,不替你作答。检测完全基于会话日志结构,不调用 judge 模型。

核心能力

插件 README 把职责收窄为几类可核对的现象与动作,并明确「不插手」的边界。

异常结束的轮次

当 turn/end 原因为 error、aborted(非你按的停止)、max-tokens、interrupted 时,在短延迟后自动发送一条续跑消息(默认文案为「继续」),来源标记为 dsh-unstuck,避免被当成用户输入。

被吞掉的工具调用(假完成)

部分 OpenAI 兼容中转会把 DeepSeek 原生的 ||DSML|| 工具标记当正文输出,日志里只剩 reasoning + text、没有 tool_calls,轮次却记为 completed。插件用结构规则识别,例如 reasoning 与 text 逐字节相同、text 空而 reasoning 非空、或尾部残留破损调用标记等,再发送带指向性的续跑话术(continueOnSwallowed,默认可用),督促模型重新发起工具调用。这是相对 dsh 自带「继续」按钮的主要补强点。

请求假死(stall)

模型请求已发出,但在 stallMs(默认 180000 ms)内没有任何流片段时,判定为假死:取消当前轮次(kind: 'hook',保留 inbox),再按 stallResumeMs 等待后补「继续」。

问了不等(可选)

若正文末尾出现求确认措辞或第二人称问句,同一轮次里又开始改文件等操作,可能在你还没回答时就开工。pauseOnUnansweredQuestion 默认 mutate:问完之后一旦检测到写/删/改文件类工具,会掐掉该轮并把发言权还给你,日志记 question-paused,不会自动替你发「继续」。

审批与问答

等待你审批或回答问题:只记录、可配置超时提醒(notifyBlocked),绝不代答。

明确不处理

你主动停止、轮次确实完成、inbox 里已有你的消息、连续自动续跑超过 continueMax(默认 3)、以及认证/配额/上下文等 skipCodes 中的不可重试错误,插件会跳过并在 unstuck.jsonl 里留下 continue-skipped 等原因。

同一会话内自动续跑有退避:第 1/2/3 次前额外等待 1.5s / 5s / 15s。你手动发一条消息后,续跑预算清零。

安装与启用

安装命令以 README 为准。从 GitHub 安装(将 tauri 换成你的 profile 名):

dsh plugin --profile tauri add github:Chlyz621/dsh-unstuck

装完后完全退出 DeepSeek Harness(含托盘)再重新打开,插件才会加载。

本地改代码或离线安装时,在仓库根目录执行(README 亦给出 install.ps1 / uninstall.ps1 参数说明):

cd <仓库根目录>
pwsh -File .\install.ps1

配置文件路径:<DSH_HOME>/unstuck/config.json。示例可从仓库内 unstuck.config.example.json 复制。优先级为:内置默认 < profile 的 cordis.patch.yml < config.json。

运行日志:<DSH_HOME>/unstuck/unstuck.jsonl。

典型用法:确认插件已加载

开机后日志里应出现 boot 事件。查看最近记录:

Get-Content "$env:USERPROFILE\.dsh\unstuck\unstuck.jsonl" -Tail 20

常见 event 包括:continue-sent(已补续跑)、turn-swallowed(发现假完成)、stall-detected(假死)、continue-budget-exhausted(预算用尽)、question-paused(问了不等被掐断)等。需要更细的 debug 行时,在 config.json 里设 verbose: true。

调参时只改你关心的键即可,例如 continueMax、stallMs、pauseOnUnansweredQuestion(off / mutate / any)、continueOnUserAbort(never / silent / always)。改完重启 dsh。

若希望从根上减少「DSML 被当中正文」的概率,README 建议可选方向包括:换用原生 OpenAI 风格工具调用的模型、降低 reasoningEffort、或使用 DeepSeek 官方端点——插件本身只做兜底,不替代中转层修复。

适用场景与注意

适合谁:长时间 unattended 跑 agent、使用 OpenAI 兼容 relay、或经常遇到「无声停止 / 假完成 / 流卡住」的 DSH 用户,希望把续跑判断自动化并写进可审计日志。

权限与安全:插件与当前 dsh 进程同权,能读会话、发续跑消息、在策略下取消轮次。安装前请阅读 源码 与 MIT 许可证;社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系,亦非官方应用商店。

环境:package.json 要求 Node >=22.19.0,peer 依赖 @deepseek-ai/cordis ^4.0.1。autoRetry(模型请求层重试)默认关闭,避免与 dsh 自身重试叠加;需要时再在配置里打开。

结尾

dsh-unstuck 把「什么时候该续跑、什么时候该交还发言权」写成可配置的结构化规则,并落到 unstuck.jsonl,适合作为 DSH「一切皆插件」生态里的工作流补强。若要安装或查变更,以 GitHub README 为准;也可从 SkillHub 目录页跳转到仓库与 Issue。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye