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
羽毛球分组比赛记分
小程序二维码

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

小夜