dsh-autocontinue:无人值守时让 DSH 会话自己续跑、重试与恢复

前言

在 DeepSeek Harness(DSH)里跑长任务时,常见卡点并不在模型能力,而在会话生命周期:模型做完一轮就停住等人打字「继续」;上行抖动导致回合以 TRANSPORT 结束;Goal 因 agent/error 被 round driver 解除武装,或 resume/fork 后目标仍保持 disarmed。这三种情况里,工作往往仍可恢复,但需要有人盯着补一脚。

dsh-autocontinue 是社区维护的 DSH 工作流类插件(维护者 kenjoe41,当前版本 0.1.13,在 dsh 0.2.1-rc.2 上验证)。它在会话被 armed 之后,自动排队下一轮、对提供商/网络失败做指数退避重试,并在 Goal 停滞时尝试重新武装;进程重启后还能扫描未闭合的 turn 并恢复会话。下面介绍它的定位、能力与用法。

这是什么

一句话:dsh-autocontinue 在无人看管时保持同一会话继续工作——空闲时自动续跑、失败时带退避重试、Goal 失活时尝试复活,并在 dsh-update 或崩溃后做重启恢复。

能力 行为
Continues armed 会话里 agent 空闲时自动排队下一轮,不必等人输入 continue。
Retries 提供商或网络失败的回合默认无限重试,指数退避,上限稳定在 5 分钟间隔。
Revives 因失败 disarm、resume/fork 遗留 disarmed、或 paused 的 Goal 在策略允许时重新武装。

重要前提:在调用 /autocontinue on 或配置 enabled: true 之前,插件不会对会话做任何自动动作。

生态上,DSH 奉行「一切皆插件」;插件目录站 SkillHub 为社区收录,与 DeepSeek / 幻方无官方从属关系。源码与问题跟踪见 GitHub:kenjoe41/dsh-autocontinue,许可证为 MIT。

核心功能

同会话自动续跑(Continuation)

armed 后,当 agent 进入空闲,插件会排队一轮普通用户消息,标题形如 <autocontinue> Round n/…,要求模型继续推进、以工作区与工具结果为准,并在任务真正完成时用结束标记收尾。对话记录仍像正常多轮聊天。

循环在以下任一条件成立时停止:

  1. 模型在回复最后一行写出完成标记(默认 AUTOCONTINUE: DONE)。
  2. 你手动中止回合(Stop 会被人为中断尊重)。
  3. 达到 maxRounds 上限。
  4. 执行 /autocontinue off 解除武装。

失败重试与退避(Retry through outages)

默认面向不稳定上行:无限重试(maxRetries: 0),退避至恒定 5 分钟:

连续失败次数 重试前等待
1 15 s
2 30 s
3 60 s
4 2 min
5 4 min
6+ 5 min(除非设置 maxRetries)

每次重试回合会写明具体失败,并指示模型重试失败动作而非从头重做已完成工作。重试计数只认 turn/end 且 reason.kind === 'error', deliberately 不计 agent/error,避免一次真实故障消耗两次额度。

Goal 复活(Goal revival)

reviveGoals: true(默认)时,插件通过 ctx.goals.resume(agent, ref) 重新武装失活的 Goal,由 goal round driver 继续计轮。不会复活 blocked 状态,也不会复活轮次预算已耗尽的 Goal。连续复活次数由 maxGoalRevives(默认 5)限制;Goal 真正开始新一轮后计数器会重置。每次复活会在聊天里公告。

重启恢复(Restart recovery)

dsh-update staged 安装重载或进程崩溃时,持久化日志可能停在 turn/start 而无 turn/end。启动后插件在 resumeWindowMs 窗口内扫描语料,对仍「未闭合 turn」的会话走与 Web GUI 相同的 resolveAgent 路径并排队 resume 回合:补齐 harness 的 interrupted 闭合、重组 preset/模型、让 goal round driver 接上;还可恢复关机时被取消的 inbox 消息、在提示中列出未结算的后台 job 与同 generation 的子 agent 会话,并对仍有轮次的 active goal 会话重新打开。

与 goal round driver 的关系:Goal 处于 active 且 armed 时,autocontinue 会 defer(queue skipped: an armed goal round driver owns the rounds),避免双份回合;driver 负责进度,本插件负责持久化与兜底。

安装与启用

插件以当前 dsh 进程权限运行,安装前请自行审阅源码与 MIT 许可证。peerDependencies 需与运行时 dsh -V 匹配,不匹配时插件管理器会拒绝安装并回滚 profile。

从 GitHub 安装(推荐)

dsh plugin --profile <profile> add github:kenjoe41/dsh-autocontinue
# 或固定 release
dsh plugin --profile <profile> add github:kenjoe41/dsh-autocontinue#v0.1.13

从 tarball 安装

README Quick start 中的示例(路径需换成你本机 pack 出的文件;版本号与 package.json 一致时为 0.1.13):

dsh plugin --profile web add /path/to/dsh-autocontinue-0.1.4.tgz

维护者本地打包示例:

pnpm pack --pack-destination /tmp
dsh plugin --profile <profile> add /tmp/dsh-autocontinue-<version>.tgz

注意:README 强调宜用 tarball 或带 shims 的 link,裸 link: 目录可能导致 @deepseek-ai/dsh-llm 解析失败。链接本仓库目录时:

dsh plugin --profile <profile> add /path/to/dsh-autocontinue

编辑在下次 reload 生效,无需重新 pack。

在会话里武装

/autocontinue on

Goal 会话默认自武装(goalSessions: true)。由 cron、headless、「被叫起」的 profile 可在 patch 里设 enabled: true,对该 profile 下每个会话生效。

典型用法

交互式会话

  1. 按上一节把插件装进目标 profile 并重载。
  2. 在需要长跑的会话中执行 /autocontinue on。
  3. 用 /autocontinue status 查看 armed 状态、轮次、连续失败、等待中的退避、Goal 阶段与 revival 计数。
  4. 任务结束或要人工接管时执行 /autocontinue off;需要清零计数器时用 /autocontinue reset。

无头 / cron profile

在 <profile>/cordis.patch.yml 中替换整块 config(patch 会整体替换 config,需写明要保留的键):

- id: autocontinue
  config:
    enabled: true
    goalSessions: true
    reviveGoals: true
    maxGoalRevives: 5
    maxRounds: 0
    maxRetries: 0
    idleDelayMs: 0
    retryBaseDelayMs: 15000
    retryMaxDelayMs: 300000
    doneMarker: 'AUTOCONTINUE: DONE'
    notices: true

idleDelayMs 对一次性 launcher 应保持 0:否则 agent 空闲且 inbox 为空时进程可能在 grace 定时器触发前就销毁插件树。

聊天里的可见性

默认 notices: true 时,武装、重试、复活会在 transcript 中以 [autocontinue] … 行出现;设 notices: false 可静音。调试可将 debug: true,决策轨迹写入 debugFile(默认 /tmp/dsh-autocontinue.log)。

配置要点

常用键(完整表见 README「Configuration」):

键 默认 含义摘要
enabled false 对该 profile 下所有会话自动 armed。
goalSessions true 有 Goal 的会话自动 armed。
maxRounds / maxRetries 0 0 表示不限续跑轮次 / 不限失败重试。
resumeUnfinished true 启动时恢复未闭合 turn 的会话。
resumeWindowMs 86400000 只考虑此时间内修改过的日志。
resumeMax 5 每次启动最多恢复几个会话。

适用场景与注意

适合:长时间无人值守的编码或 Goal 任务、网络不稳环境、需要 dsh-update 或崩溃后自动接上未完成的 turn、headless/cron 拉起的会话。

务必注意:

  1. 插件与 DSH 同权限,能驱动 agent 发回合、调用 Goal API;仅安装你信任的版本并阅读源码。
  2. 不会覆盖 Goal 的 blocked 判定,也不会突破 Goal 轮次预算。
  3. 人工 Stop 会停止自动续跑;完成标记须与 doneMarker 完全一致(默认 AUTOCONTINUE: DONE)。
  4. 安装方式影响依赖解析;遵循 README「Hard-won notes」中的 tarball/link 建议,可减少 silent import 失败。

结尾

dsh-autocontinue 把「等人 continue、等网络恢复、等有人重新 arm Goal、等浏览器打开才能续跑」这几类可恢复停滞收进同一套工作流插件。需要时从社区目录或 GitHub 安装,在会话或 profile 里 armed,再配合 /autocontinue status 与可选的 debug 日志观察行为即可。

  • 目录页:https://www.skillhub.cn/plugins/kenjoe41/dsh-autocontinue
  • 仓库:https://github.com/kenjoe41/dsh-autocontinue
羽毛球分组比赛记分
小程序二维码

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

小夜