前言¶
用 DSH 的 Web 界面跑智能体时,常会遇到两类需求:某条助手回复有措辞或格式问题,想直接改掉,而不重跑整轮;或者想回退到某一轮,换个问法重新生成。对话日志是事件溯源式的,直接改文件不现实;自己补一套「改消息 + 重新生成」的 HTTP 接口和界面按钮,工作量也不小。
下面介绍的 dsh-msg-edit 把这件事做成了插件:装上后,DeepSeek Harness Web 的助手消息操作条会多出「编辑这条回复」和「重新生成回复」两个按钮,背后由四条 HTTP RPC 完成。
这是什么¶
dsh-msg-edit 由 @moton16 维护,MIT 许可,当前版本 0.1.0。插件分两部分:
- host 插件(Cordis node 侧):提供
/api/msg-edit/*四条 HTTP RPC; - client 插件(
dsh.client声明式):向助手消息操作条注入按钮,并弹出编辑器。
整个包是纯声明式 Cordis bundle,dsh.bundle.patch 指向 cordis.patch.yml,没有安装脚本、没有构建步骤、也没有源码补丁工具。兼容 @deepseek-ai/dsh-base 与 @deepseek-ai/dsh-web-app 0.1.0-rc.6(peerDependencies 声明),依赖 dsh 的 slot 系统(conversation.chat.assistant-actions)、webServer.register 以及 sessions/agents 服务。
核心功能¶
host 侧四条 RPC,各自负责一件事:
1、rewrite-message:改写单条助手回复(正文/思考),不截断后续消息;
2、edit-message:编辑用户消息,截断其后所有节点并重新生成;
3、regenerate:重新生成某条回复,回溯到它归属的真实用户消息;
4、get-message:读取助手回复当前文本,用于编辑时预填。
client 侧只做界面:在助手消息操作条注入「编辑这条回复」「重新生成回复」两个按钮;点击编辑会弹出「思考/正文」的行内编辑器,保存时调用 rewrite-message。
两点边界需要说明:编辑与重新生成是在事件溯源日志上追加 surface-replace 副本事件,不是改写历史记录;「用户消息行内编辑」的 UI 入口不在本插件范围内(user 槽被官方 ui-conversation 独占),但 host 的 edit-message RPC 仍可用,可以由其他 UI 调用。
安装与启用¶
三种方式任选其一。
方式 A(推荐):在 profile 目录内($DSH_HOME/profiles/<profile>)执行:
dsh plugin --profile web add @moton16/dsh-msg-edit
dsh 会从 npm 安装包,读到 dsh.bundle.patch 后自动把两行插件追加进 profile 的 patch 层。
方式 B:git 安装:
dsh plugin --profile web add github:moton16/dsh-msg-edit
仓库已提交预构建的 lib/(运行时 JS),无需 prepare/postinstall;若 pnpm 提示构建授权,在 profile 的 pnpm-workspace.yaml 的 allowBuilds 中放行本包(源码可信才放行)。
方式 C:手动挂载(本地开发)。先做第一步,把 lib/ 放进 profile 依赖树(或 pnpm link);再在 profile 的 cordis.patch.yml 追加两行插件:
- insert:
- id: msg-edit-host
name: '@moton16/dsh-msg-edit'
- id: ui-msg-edit
name: '@moton16/dsh-msg-edit/client'
也可以直接以仓库的 cordis.yml 作为 --patch overlay 启动:
dsh web --profile web --patch ./cordis.yml
安装完成后需手动重启 dsh web(本插件不代重启);走方式 C 的,重启后在浏览器按 Ctrl+F5。
验证¶
经过上面的步骤,可以从两侧确认插件已生效。
host 侧:对四条路由任一发一个空参 POST,返回 HTTP 200 加 {ok:false,error:{code:'bad-request',...}} 即路由已挂上:
curl -X POST http://127.0.0.1:<端口>/api/msg-edit/get-message
client 侧:鼠标悬停助手消息,应出现铅笔(编辑这条回复)与循环(重新生成回复)两个按钮;点击编辑应弹出「思考/正文」行内编辑器。
仓库的 docs/VERIFICATION.md 里有本地复验记录:插件路由 4/4、UI 按钮渲染、截图证据。
适用场景与注意¶
适合自己部署 DSH Web、需要修正助手回复措辞、或想对某一轮回退重跑的开发者。
安装前请注意:插件以当前 dsh 进程的权限运行,安装前应检查源码与许可证(本包为 MIT)。另外,在 dsh 0.1.0-rc.6 上,配套组件对 surface-replace 副本事件存在几处官方未覆盖的行为,安装侧需按本机情况处理:
1、token-meter 重放崩溃(功能正确性依赖):dsh-token-meter@0.1.0-rc.6 的 _foldEvent 在重放 replace 副本时抛错,导致 /compact 失败;官方仓库 master 尚未合入支持。README 的「兼容补丁」小节给出了一处社区修复的改法,由安装者自行评估应用;本包为合规不附带补丁脚本。
2、surface 投影:官方渲染器对 replace 副本的即时投影缺位,未应用社区投影逻辑时,编辑结果在刷新/重放后才可见。
3、agent-loop 去重:编辑/重新生成后,agent-loop 可能重复 append 相同的 user/message,产生一次空转 turn;社区去重逻辑(tail 同 id 跳过)可消除,非崩溃级。
4、用户消息编辑按钮:UI 入口不在本插件范围内,如前述,可通过 host 的 edit-message RPC 由其他 UI 调用。
其中限制 1 不处理会导致 compact 失败,限制 2-4 为体验级。官方对应组件合入支持后,本插件无需改动即可解除。
小结¶
一句话回顾:dsh-msg-edit 用四条 RPC 加两个按钮,把「改一条回复、重跑一轮」变成 DSH Web 里的现成操作;纯声明式挂载,装上重启即可用,代价是需要按 README 处理 rc.6 上的几处已知限制。
- 社区目录页:https://www.skillhub.cn/plugins/moton16/dsh-msg-edit
- GitHub 仓库:https://github.com/moton16/dsh-msg-edit
社区目录为独立站点,与 DeepSeek、幻方无官方从属关系。