前言¶
用 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、幻方無官方從屬關係。