前言¶
在 DeepSeek Harness(DSH)Web 里長對話跑下來,常見需求是:某一輪提問寫錯了,想改幾個字再讓模型從那一輪重新跑;或者某條最終回答想微調文案,又不想把後面整段對話硬刪回滾。宿主側會話日誌是隻追加的,沒有「回退到第 N 輪再原地改寫」的公開原語。若只在 UI 裏改顯示而不動落盤事件,和真實 prompt 歷史會對不上;若粗暴刪後半段,provider 側的 prompt 前綴緩存也可能整段失效。
下面介紹社區插件 dsh-message-edit(維護者 lxl8182),在 Web 客戶端給用戶消息、AI 最終回答和待發送 steering 氣泡加編輯入口,走宿主支持的「複製前綴 → 新會話 → 歸檔舊會話」路徑,並在複製前綴時儘量保持逐字節一致,以便繼承 prompt 緩存。
這是什麼¶
dsh-message-edit 是 DSH Web 的客戶端插件(分類:客戶端):在用戶氣泡、AI 回答和待發送隊列上插入鉛筆按鈕,改文本後按規則切分會話,原會話歸檔(側欄「已歸檔」可找回),新會話承接相同前綴並繼續(用戶消息編輯會重發;AI 回答編輯不自動重發)。
- 目錄頁:skillhub.cn/plugins/lxl8182/dsh-message-edit
- 源碼與說明:github.com/lxl8182/dsh-message-edit
- 許可證:MIT(見倉庫 README)
- 當前 package 版本:0.1.0(以倉庫
package.json爲準)
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' ]
典型用法¶
安裝並重啓宿主、刷新頁面後,在會話界面找鉛筆按鈕即可,無需額外配置文件。
改某一輪用戶提問
- 在目標用戶氣泡動作行點鉛筆。
- 編輯器預填原文;改過文本後按鈕爲「編輯並重發」,未改則爲「重發」;空白或超過 10 萬字符時禁用。
Ctrl/Cmd + Enter提交;Esc、點卡片外或「取消」關閉。- 確認後切換到新會話(
ctx.uiWorkspace.openSession);舊會話進入側欄「已歸檔」。
改某條 AI 最終回答
- 在已閉合回合最後一條回答的動作行點鉛筆。
- 同樣規則編輯文本並確認;不會自動再調模型,需自行繼續對話。
改待發送 steering
- 在 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