前言¶
在 DeepSeek Harness (DSH) 的任务执行过程中,如果中途需要插入一句插话,或者需要立刻停止当前步骤,通常只有两个极端做法:要么等待当前轮次跑完(慢),要么按界面停止按钮(直接砍掉当前步骤,留下半截状态)。dsh-midtalk 插件通过两条斜杠命令,将“插话”和“打断”的逻辑拆分,让你按一次回车决定下一步动作,并且在打断时保留现场。
它是什么¶
dsh-midtalk 是一个由 blueberrymaid 维护的工作流插件。它给 DSH 增加了 midtalk 功能,支持任务内插话与可选打断,并自动生成结构化恢复卡。所有代码均为 Host 侧(Cordis),零客户端代码、零构建、无第三方运行时依赖,不经 npm 分发。
核心能力¶
- 任务内插话:无损递话,插入到下一个步骤边界。
- 可选打断:中止当前步并留下恢复卡。
- 结构化恢复卡:记录打断时的完整状态,用于后续恢复。
- 硬规则约束:收到插话必须先输出正文回复,再决定是否调用工具。
安装与启用¶
方式 A:命令行安装(推荐)¶
使用 dsh plugin 命令安装。安装后需要重启 dsh web 才能生效。
dsh plugin --profile web add "github:blueberrymaid/dsh-midtalk"
方式 B:手动安装(不依赖网络或 pnpm)¶
- 放置文件:
将插件的目录(至少包含index.js和lib/core.js)放入 Profile 的模块目录:
# 假设 Profile 名为 web
$DSH_HOME/profiles/web/node_modules/dsh-midtalk/
- 挂载名册:
在$DSH_HOME/profiles/web/cordis.patch.yml中添加一行 insert:
- insert:
- id: midtalk
name: dsh-midtalk
> **注意**:此文件在启动时一次性读取,修改前请备份。
- 重启:
重启dsh web并验证。
验证安装¶
检查 $DSH_HOME/midtalk/boot.json。文件内容应包含 stage: "registered" 且 commands 列表中包含 "say" 和 "cut"。
使用方法¶
插件提供两条斜杠命令:
1. /say <你要说的话>¶
- 语义:无损插话。
- 行为:插到下一个步骤边界。不中断当前步骤。
- 适用场景:默认使用。
2. /cut [你要说的话]¶
- 语义:有损打断。
- 行为:中止当前正在运行的步骤,生成恢复卡。
- 适用场景:卡在很长的步骤中,必须立刻停止。
两条命令都会返回当前步骤的预估剩余时长,仅作参考。
恢复卡¶
/cut 触发后会生成结构化恢复卡,保存在 $DSH_HOME/midtalk/last-interrupt-<会话 id>.json。每个会话一张,原子写入。
恢复卡包含以下关键信息:
- at / reason:触发时间与原因。
- agentStatus / sessionId:打断时的状态与会话。
- interruptedAt:被打断的具体位置。
- pendingToolCalls:正在派发/刚派发的工具调用意图。
- lastReasoning / lastText:打断前的推理与正文片段。
- frames:最近 12 个流帧。
恢复流程:
1. 读取恢复卡,列出当前状态。
2. 核实 pendingToolCalls 中的工具调用是否已落地(文件、命令等)。
3. 用户确认后,重做被打断的那一步。
注意事项与边界¶
- 兼容性:仅在与实测 DSH 版本(
0.1.5-rc.3)兼容的环境下验证过。 - 队列限制:待送话队列上限为 8,超出会静默丢弃最早的请求(记录在
$DSH_HOME/midtalk/wake.log)。 - 零依赖:纯 Host 侧实现,不注册模型能力,不上报数据。
- 安装方式:通过
cordis.patch.yml挂载,非 npm 包。
总结¶
dsh-midtalk 通过简单的命令将 DSH 的工作流控制权交还给了用户,提供了“无损插话”和“可控打断”两种模式。对于需要精细控制任务执行流、或在长任务中需要随时介入的开发者来说,这是一项实用的工具。