dsh-message-edit:在 DSH Web 里编辑用户提问或 AI 回答并重开会话

前言

在 DeepSeek Harness(DSH)Web 里长对话跑下来,常见需求是:某一轮提问写错了,想改几个字再让模型从那一轮重新跑;或者某条最终回答想微调文案,又不想把后面整段对话硬删回滚。宿主侧会话日志是只追加的,没有「回退到第 N 轮再原地改写」的公开原语。若只在 UI 里改显示而不动落盘事件,和真实 prompt 历史会对不上;若粗暴删后半段,provider 侧的 prompt 前缀缓存也可能整段失效。

下面介绍社区插件 dsh-message-edit(维护者 lxl8182),在 Web 客户端给用户消息、AI 最终回答和待发送 steering 气泡加编辑入口,走宿主支持的「复制前缀 → 新会话 → 归档旧会话」路径,并在复制前缀时尽量保持逐字节一致,以便继承 prompt 缓存。

这是什么

dsh-message-edit 是 DSH Web 的客户端插件(分类:客户端):在用户气泡、AI 回答和待发送队列上插入铅笔按钮,改文本后按规则切分会话,原会话归档(侧栏「已归档」可找回),新会话承接相同前缀并继续(用户消息编辑会重发;AI 回答编辑不自动重发)。

DSH 生态强调「一切皆插件」;SkillHub 等社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

用户消息:编辑并重发

在用户气泡动作行(与 copy、clock 同一排)插入铅笔按钮。点开修改该轮提问,确认后会话变为:第 1..N-1 轮逐字节相同前缀 + 新提问;该轮及其之后的旧内容不再出现在当前会话里,并会触发向模型重发(相对编辑后的提问)。

卡片上会标注:该轮之后的内容将被丢弃,原会话会被归档。

AI 消息:只改最终回答,不重发

在 AI 回答动作行(官方 conversation.chat.assistant-actions slot,与 copy、branch 同一排)插入铅笔按钮。修改的是已闭合回合的最后一条 assistant/message 的文本;切点在该回合 turn/end,前缀逐字节复制,只替换目标消息的 text 块(reasoning、message.id、usage、stream 等原样保留)。确认后不自动重发,之后可以继续对话。

中间步骤、带 tool-call 的回答、运行中未闭合回合不可编辑;宿主会返回对应错误码(如 assistant-message-has-tools、assistant-message-not-final 等)。

待发送消息:改队列,不新建会话

对尚未发给模型的 steering 气泡([data-pending-steering])插入铅笔按钮,通过官方 session.updateQueue 原地改队列内容。含附件或非纯文本时按钮仍可能显示,点击后会提示暂不支持。

为什么不能「原地回退」而要新 sessionId

README 说明:会话持久化接口只有 create / open / flush / stat / list,没有 delete 或改写已提交字节;运行中 Session 也没有公开的释放后同 id 重建路径。插件因此采用:

复制前缀到新会话 → 让官方认领会话 → 投递新提问(用户消息)→ 归档旧会话

前缀逐字节原样复制,是因为 provider 侧 prompt 缓存按前缀命中;前缀一旦变形,缓存整段失效。切点会退到「干净」位置(无未闭合 turn/step/compaction、无悬空 tool 调用、inbox 队列为空等),具体规则见仓库「切点规则」一节。

安装与启用

插件面向 DSH Web profile,零构建、零额外 npm 依赖(lib/index.js / lib/client.js 为手写 JS)。要求 Node >= 20。

1、从 GitHub 安装(命令来自仓库 README):

dsh plugin --profile web add github:lxl8182/dsh-message-edit

或从本地目录安装:

dsh plugin --profile web add /path/to/dsh-message-edit

2、重启 web 宿主。客户端模块图只在 boot 时组建一次,HMR 不认新包。

3、刷新浏览器。

可选自检(README 说明不需要重启宿主即可跑):

cd ~/.dsh/profiles/web && node --input-type=module \
  -e "const m = await import('dsh-message-edit'); console.log(Object.keys(m))"
# 期望 [ 'apply', 'inject', 'name' ]

典型用法

安装并重启宿主、刷新页面后,在会话界面找铅笔按钮即可,无需额外配置文件。

改某一轮用户提问

  1. 在目标用户气泡动作行点铅笔。
  2. 编辑器预填原文;改过文本后按钮为「编辑并重发」,未改则为「重发」;空白或超过 10 万字符时禁用。
  3. Ctrl/Cmd + Enter 提交;Esc、点卡片外或「取消」关闭。
  4. 确认后切换到新会话(ctx.uiWorkspace.openSession);旧会话进入侧栏「已归档」。

改某条 AI 最终回答

  1. 在已闭合回合最后一条回答的动作行点铅笔。
  2. 同样规则编辑文本并确认;不会自动再调模型,需自行继续对话。

改待发送 steering

  1. 在 pending 气泡上点铅笔,直接改队列文本(纯文本场景)。

宿主侧还注册了 HTTP POST 端点(本地、与 DSH 其它 HTTP 面一样无鉴权),供前端调用,例如用户消息:/dsh-message-edit/prepare、/dsh-message-edit/rewrite;AI 回答:/dsh-message-edit/prepare-assistant、/dsh-message-edit/rewrite-assistant。入参与返回字段见 README「接口」表格。

适用场景与注意

适合谁

  • 经常在 DSH Web 里做长会话、需要「从某轮改问重跑」或「只改最终回答文案」的开发者。
  • 希望旧日志完整保留、通过归档找回,而不是在 UI 里假装历史没发生过。

使用前请知悉

  • 插件在当前 dsh 进程权限下运行;安装前建议阅读 源码 与 MIT 许可证,自行判断是否信任维护者 lxl8182。
  • 只支持纯文本用户/AI 可编辑路径;图片、文件等非 text 块会 unsupported-content。
  • 合成轮(goal continuation、agent.inject() 等无 human 提问的 turn)不可编辑,返回 synthetic-turn。
  • 操作后 sessionId 会变,会话列表会多一条;多窗口 v1 不做协同,其它窗口需自行刷新。
  • rewrite 若在 prompt 阶段失败,README 说明不会归档源会话,可在新会话里手动补发。
  • README「未验证」一节写明:真实宿主加载后的完整点击链路、保存后会话切换、运行中卸载清理等,需在你本机重启 DSH 后自行点验。

结尾

dsh-message-edit 把「改一轮问、丢后面、保住前缀缓存、旧会话归档」和「改最终 AI 回答、不重发」收进 Web UI 的三个入口,并显式对齐 DSH 只追加日志的能力边界。若你在 SkillHub 或 GitHub 看到同名插件,以仓库 README 的安装命令与行为说明为准。

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

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

小夜