dsh-response-annotations:在 DSH Web 里复刻 Codex 式回复批注

前言

在 DSH 里和模型对话时,常见做法是复制助手回复里的一小段,贴进输入框再写「这里不对 / 请按这个改」。上下文容易丢,模型也不一定能对齐你指的是哪一句。OpenAI Codex 与 ChatGPT 桌面版提供了 response annotations:在已完成回复里选中文字,加可选评论,随下一条消息或单独发送结构化载荷,并在原回复上保留可定位的气泡。DeepSeek Harness 社区插件 dsh-response-annotations(维护者 bovvl,仓库作者标注为 Ava)在 DSH Web GUI 侧实现同类交互,且 Host 半边为空:不注册工具、不改 Host 行为、不发网络请求,纯浏览器端 Client 插件。

这是什么

dsh-response-annotations 分类为模型推理相关能力,简介为「Codex-style response annotations for DeepSeek Harness」。它在已完成的助手回复上提供选区 → 批注 → 发送 → 持久化气泡与定位,发送时在用户文本前附加与 Codex 对齐的 <response-annotations> 结构化块(产品文案里称 assistant response)。设计参考 Codex 公开行为,README 声明未复制其代码;初版由 DeepSeek Harness(deepseek-flash)辅助生成,2026-10 由 Ava 维护发布。

核心功能

下面按 README 已描述的能力说明,均为 Web 端已实现项。

选区与添加到对话

  1. 在已完成(非流式中)的助手回复中选中文字(拖选或双击选词)。
  2. 出现浮动工具条「添加到对话」;可选填写评论。
  3. 保存后,回复正文选区末尾出现编号气泡,点击可高亮原文。

输入框上方的批注胶囊

输入框上方显示「N 条批注」胶囊,可展开编辑、删除或清空。发送时自动在文本前附加 Codex 同款结构化块;也支持只发批注:空输入框按宿主发送快捷键、点胶囊内纸飞机、或点盖在宿主主发送按钮上的批注按钮(运行中会盖住 Stop,删光批注后 Stop 恢复)。

已发送消息的展示

已发送消息在显示层折叠为只读的「N 条回复批注」卡片;原回复上保留灰色评论气泡,点击可看原文与评论并可定位。

载荷格式

发送时的文本前缀形如(\n 与块结构以 README 为准):

\n# Response annotations:\n<PREAMBLE>\n<response-annotations>\n[JSON]\n</response-annotations>\n\n## My request:\n<用户原文>

JSON 每项形如 {"text":"所选文本","annotation":"可选评论","source":{"messageId":"..."}};空评论会丢弃 annotation 键;messageId 缺失时回退为 nodeKey。解析失败时原样显示消息,不隐藏内容。

持久化

每个会话独立存储于 localStorage['dsh-annotation.v1.<sessionId>'];发送成功后清空该会话 pending 集合,发送失败则保留。已发送气泡存档每会话保留最近 1000 条(超出只隐藏最老的灰色气泡)。

技术槽位与钩子(便于排查)

  • Client 入口:client.js(由 build.mjs 从 src/*.js 生成)。
  • 槽位:shell.overlay、conversation.input.overlay、conversation.user.text.node。
  • 注册 user-text 规则 dsh-response-annotations(order -100)。
  • 包装 conversation.sendSession 以附加载荷(发送成功才消费);定位按钮会滚动到原回复并临时高亮选中段落。

安装与启用

安装无需 npm;仓库已提交构建产物 client.js,安装时不需要本地构建。

方式 A:DSH 客户端 Plugins 页

  1. 打开 DSH 客户端 → 左侧边栏 Plugins。
  2. Add plugin 右侧箭头 → Install a third-party plugin。
  3. 填写 GitHub 地址:https://github.com/bovvl/dsh-response-annotations。
  4. Install → Enable now → 刷新页面。

方式 B:CLI(CLI 管理的 profile)

dsh plugin --profile <profile> add github:bovvl/dsh-response-annotations

安装后刷新页面(或依赖 HMR)即可。

成功标志:打开任意会话,选中一段已完成的助手回复文字,出现「添加到对话」浮动按钮。

本地开发可将仓库路径加入 profile:

dsh plugin --profile <profile> add /abs/path/to/dsh-response-annotations

典型用法

  1. 启用插件并刷新 Web 界面,进入任意会话。
  2. 等待助手回复完成(流式结束),在回复正文拖选或双击选中一段文字。
  3. 点浮动条「添加到对话」,按需填写评论并保存;确认选区末尾编号气泡与输入框上方胶囊中的条目。
  4. 在输入框写后续指令后按平常方式发送,或空输入框通过快捷键 / 胶囊纸飞机 / 批注发送按钮只发批注。
  5. 发送后在用户消息侧查看「N 条回复批注」卡片;回到原助手回复点灰色气泡或胶囊 / 卡片上的「定位」核对锚点与高亮。

L1/L2 自测可参考 README:

# L1 安装
dsh plugin --profile <profile> add github:bovvl/dsh-response-annotations

# L2 加载:启动 Web profile 后检查插件图
dsh web --host 127.0.0.1 --port <port> --no-open
curl -s http://127.0.0.1:<port>/plugins/events | grep dsh-response-annotations

适用场景与注意

适合谁:需要在 DSH Web 里对助手回复做精确引用、带可选评论一并发给模型,并希望在原回复上保留可定位标记的开发者或日常对话用户。

兼容性:README 写明适配 DSH 0.2.1-rc.3(在此版本完成开发与实机验证;更早或更新版本未验证)。插件类型为 web-only;dshbase L3 Headless 不适用。升级 DSH 时若改动 shell.overlay、conversation.sendSession、ui-chat DOM 锚点(如 data-chat-flow-kind="assistant-step" 等),可能出现气泡缺失、定位失败或发送不再附加批注;代码对部分读取做了 try/catch 与降级,但不承诺跨版本 100% 兼容。

已知限制(v1):仅助手回复可选中;文件 / Diff / 终端选区、跨消息选区、流式中回复无添加按钮。未实现 Codex 的 More details / Ask in side chat / 内联 :codex-annotation 指令渲染。批注不能与 / 命令同发(命令消息会跳过批注附加)。载荷块对模型可见;复制消息文本时仍含原始块。localStorage 仅本 origin,不同端口或域名不互通。发送钩子通过包装 conversation.sendSession 实现,属非官方能力,升级 DSH 可能需要适配。

安全与许可:插件随 DSH 客户端在浏览器中运行,数据存于本机 localStorage;安装第三方插件前建议阅读仓库源码与 MIT 许可证(package.json 版本 1.0.0)。DSH 生态强调「一切皆插件」;社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-response-annotations 把 Codex 风格的回复批注落到 DSH Web:选区、评论、结构化发送与气泡定位,Host 侧零侵入。需要细节、Issue 或自行改 src/ 后执行 node build.mjs 时,见 GitHub 仓库:

  • 目录页:https://www.skillhub.cn/plugins/bovvl/dsh-response-annotations
  • GitHub:https://github.com/bovvl/dsh-response-annotations
羽毛球分组比赛记分
小程序二维码

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

小夜