前言¶
在豆包、点点一类 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),下一条用户消息就是该句纯文本,无前缀、无结构化包装。发送后胶囊禁用;新回合开始后旧回合胶囊也会自动禁用。
产品约束¶
- 固定最后:Hook 永远在轮次末尾最后出现;Intelligent UI 卡片排在 Hook 之前。
- 紧接正文:Hook 锚定刚写完的回答,不另起面板、不占输入框。
- 轻量:一句追问 + 最多三条回复,不引入任务分类或会话管理。
技术路径:先提交、再写正文¶
DSH 若让模型在正文末尾写 <followup> 标签或由正文之后再调工具,会遇到标签露出、以及「含 tool-call 的最终步不算最终回答」导致正文被折叠进过程区等问题。本插件采用:
- 模型先调用
followup工具,提交{ hook, replies }; - 工具写入
presentationMeta并回执「请立即输出完整正文」; - 模型下一步输出完整正文(纯文本、不再调工具),轮次正常结束;
- 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出现followupoccupant; - Client
conversation.chat.turnTail出现hook-followupoccupant(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