dsh-hook-followup:在 DSH 对话轮次末尾接 Hook 追问与快捷回复

前言

在豆包、点点一类 chatbot 里,用户读完回答后往往会顺手接一句追问,而不是重新组织一整段输入。DeepSeek Harness(DSH)里模型已经给出完整正文时,同样存在「知道想继续聊,却懒得打字」的摩擦:纯文本回答结束即结束,下一轮全靠用户自己起句。

dsh-hook-followup 把「文末一句锚定正文的追问 + 1–3 条用户口吻快捷回复」落到 DSH 插件形态:快捷回复渲染成轮次末尾的可点胶囊,点一下即作为普通用户消息发回模型。维护者为 an-an-618,分类为工作流;仓库 an-an-618/dsh-hook-followup,当前版本 0.1.1,许可证 MIT,要求 DSH >=0.2.1-rc.2。

这是什么

一句话:Hook follow-up for DeepSeek Harness——每轮回答末尾附加一句锚定正文的追问和 1–3 条用户口吻的快捷回复,点选后以普通消息进入下一轮。

定位是轻量对话 follow,不是任务建议引擎。它不回答「agent 下一步该做什么」,也不生成任务清单;只做「读完顺手就能接话」的体验。与 hiJoeLee/dsh-suggest-actions 可共存:后者偏向「下一步做什么」,本插件偏向「用户接下来自然会说什么」。

实现上复用 Intelligent UI(@an-an-618/dsh-intelligent-ui)验证过的扩展方式(Host 工具 + presentationMeta + Client 插槽),但不依赖该插件,可单独安装与卸载。

核心功能

用户侧表现

回答正文照常显示。正文之后(本轮 turnTail)会出现:

  • 一行 Hook:前缀 ↳ 加锚定正文的一句追问(中文建议 ≤40 字,英文 ≤25 词)。
  • 1–3 个竖排胶囊按钮,文案为用户口吻(第一人称或省略主语),至少一条直接回应 Hook。

点某条胶囊后,插件调用 conversation.send(text),下一条用户消息就是该句纯文本,无前缀、无结构化包装。发送后胶囊禁用;新回合开始后旧回合胶囊也会自动禁用。

产品约束

  1. 固定最后:Hook 永远在轮次末尾最后出现;Intelligent UI 卡片排在 Hook 之前。
  2. 紧接正文:Hook 锚定刚写完的回答,不另起面板、不占输入框。
  3. 轻量:一句追问 + 最多三条回复,不引入任务分类或会话管理。

技术路径:先提交、再写正文

DSH 若让模型在正文末尾写 <followup> 标签或由正文之后再调工具,会遇到标签露出、以及「含 tool-call 的最终步不算最终回答」导致正文被折叠进过程区等问题。本插件采用:

  1. 模型先调用 followup 工具,提交 { hook, replies };
  2. 工具写入 presentationMeta 并回执「请立即输出完整正文」;
  3. 模型下一步输出完整正文(纯文本、不再调工具),轮次正常结束;
  4. Client 从 tool result 的 meta 读取 Hook 与快捷回复,在 conversation.chat.turnTail 渲染胶囊。

Host 通过 ctx.tools.register 注册 followup;持久化走 output.presentationMeta;用户回传与 Intelligent UI 同走 conversation.send(text)。

省略 Hook 时不增加额外模型请求;每轮启用 Hook 时,为先把结构化数据交给前端,会多一次「写正文」的请求。

配置要点

在 设置 → 插件 → 文末 Hook 追问 中修改(volatile() 字段下一轮即生效,一般无需重启 Host):

设置 默认 说明
enabled true 总开关;关闭后不再注入追问规则,并拒绝 followup 调用。
strategy always always 应出尽出;balanced / conservative 增加省略条件。
skip_on_refusal true 拒绝回答的轮次是否整块省略。
skip_on_emotional true 情绪危机、哀伤、自伤风险等场景是否省略。
max_replies 3 快捷回复上限(1–3)。
render_mode ui ui 调工具并渲染胶囊;markdown / tag 为纯提示词降级,不注册工具。
language follow_user 追问内容跟随用户语言;zh / en 固定规则文本语言。

enabled 从关到开,或 render_mode 从 markdown/tag 改回 ui,需重新启用或重载插件(工具在挂载时注册)。

安装与启用

插件收录进度可参考 awesome-dsh-plugin PR #8451;收录后可在 dsh-market 或 awesome-dsh-plugin 搜索 Hook Follow-up 安装。

下面介绍直接安装方式(命令均来自仓库 README)。

固定 commit:

plugin_manager(action: "install_bundle", target: "git+https://github.com/an-an-618/dsh-hook-followup.git#7a90d03c3edb3f84e93dfdc7b426951857c3d6c4")

Release tarball(v0.1.1):

plugin_manager(action: "install_bundle", target: "https://github.com/an-an-618/dsh-hook-followup/releases/download/v0.1.1/an-an-618-dsh-hook-followup-0.1.1.tgz")

本地目录(开发):

plugin_manager(action: "install_bundle", target: "/absolute/path/to/hook-followup")

安装后重启 DSH 生效。

移除:

plugin_manager(action: "remove_bundle", target: "@an-an-618/dsh-hook-followup")

开发者在插件目录可运行自检:

cd "hook-followup"
node scripts/check.mjs

自检包括 node --check、Host/Client 测试、提示词模板与 locale 等检查。

典型用法与验证

正常使用无需额外 API:模型在系统提示词约束下,于每轮(在策略允许时)先调 followup,再输出正文;用户在界面末尾点胶囊即可续聊。

安装后可在 DSH 内核对(README 记载项):

  • Host Tool.listTools 含 followup;
  • Client tool.call.toolview 出现 followup occupant;
  • Client conversation.chat.turnTail 出现 hook-followup occupant(order 1000,固定轮次末尾);
  • 系统提示词含 hook-followup 段。

界面示意见仓库 README 中的 showcase 图:assets/showcase.webp。

适用场景与注意

适合谁: 希望在 DSH 对话里复刻「读完顺手接一句」体验、又不想自己写 Intelligent UI 卡片的开发者;需要与 suggest-actions 类「下一步任务」插件并存时,本插件只负责用户口吻的续聊入口。

运行与信任: 插件以当前 DSH 进程权限运行,会注册 Host 工具、注入系统提示词段,并在浏览器 Client 挂载 turnTail 与工具视图。安装前请阅读 源码与 LICENSE,确认符合你的安全与合规要求。

已知限制(摘自 README):

  • 若模型违反提示词、先写正文再调 followup,正文可能被折叠进过程区,插件无法在执行期改写 DSH 折叠规则。
  • 快捷回复与用户手打同文无法由 Host 区分;「连续未点击」等规则为软约束。
  • 仅最近一轮胶囊可点;更早回合置灰。
  • 无 ui-chat 的 turnTail 时 Client 跳过胶囊注册,仅剩工具行摘要;markdown / tag 模式不受影响。
  • 规则段约 1.2k token 提示词成本;可用 enabled: false 关闭。

DSH 生态强调「一切皆插件」;社区目录站点 skillhub.cn 与 DeepSeek / 幻方无官方从属关系,本文仅作技术介绍。

结尾

dsh-hook-followup 用 followup 工具与 turnTail 胶囊,把 Hook 追问和快捷回复固定在每轮回答末尾,点击即普通续聊消息。需要安装命令、配置表与架构说明时,以 GitHub README 为准。

  • 插件目录页:https://www.skillhub.cn/plugins/an-an-618/dsh-hook-followup
  • 源码与文档:https://github.com/an-an-618/dsh-hook-followup
羽毛球分组比赛记分
小程序二维码

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

小夜