前言¶
跑長工具鏈的 agent 有個常見現象:模型連續調用工具,幾十分鐘裏界面上只有工具卡片在滾,直到最後才吐一段結果。新人不知道模型在幹什麼,只能等。dsh-progress-beat 就是解決這個問題的 DSH 插件:它在「思考 + 工具調用」的中途插入用戶可見的進度說明,讓 agent 邊做邊說,而不是一路靜默到結束。插件由 Mabinogi-Cichol 維護,分類爲「工作流」。
這是什麼¶
一句話定位:一個 DSH 插件,把進度播報塞回 agent 執行過程。它不改會話內容、不吞工具結果、不阻塞調用,注入的提醒走 source.form = 'notice',模型可見、帶歸屬、可審計。
它針對的是較新的 flash 類模型(如 1017 版本)在 agent 任務裏「連續調用工具、只在最終答覆時輸出文本」的行爲傾向。插件不試圖改寫模型,只通過常駐規則加週期提醒提高它開口的概率。
三條互補的機制¶
插件提供三條機制,默認開啓「常駐進度規則 + 沉默提醒」,用戶輪提醒默認關閉。
1、常駐進度規則,掛在 ctx.systemPrompt.section(),每次請求都帶一段規則,要求模型預計多次調用時先講計劃,進入新階段或長時間沒說明時先播報。節奏由 promptEvery(文案裏「每約 N 次」的 N,默認 6)和 sectionOrder(插入位置,默認 4)控制。
2、用戶輪提醒,掛在 agent/pre-step,按輪次在該輪 messages 注入一條提醒。開關字段 nudgeOnUserTurn,默認關;打開後按 nudgeEveryTurns(默認 1,可取 1–20)的節奏注入,同一輪的後續 step 不重複。
3、沉默提醒,同樣掛在 agent/pre-step,但它是按沉默算、不按調用總數算:自上次播報以來累計 N 次調用、或沉默超過 T 秒,先到先算。節奏字段是 every(默認 8)、silentSeconds(默認 180 秒),另有 minGapSeconds / maxRemindersPerTurn / dripSeconds 控制間隔與預算。資料提到一次 200 次調用的實測裏,這路只注入 6 條。
三路都關掉時,插件只貢獻一個 system prompt section,連 agent/pre-step 鉤子都不註冊。
控制面板與配置¶
插件列表裏 dsh-progress-beat 這一行多出「配置」入口,打開是可視化表單,不必手改 YAML。面板按三個機制分成三個可摺疊分組,摺疊態只留機制名與開關,展開才露出細項。面板是「暫存 + 保存」模型:改動先留在表單裏,點保存才寫入;每個字段可單獨重置,也可以全部重置,被改過的字段旁會顯示「已覆蓋」。
保存走宿主的 settings 服務,寫進 profile 的 cordis.patch.yml,由 Loader 熱應用,重啓後仍然有效。插件側的 Config schema(每個字段聲明瞭 .volatile())是這套表單的依據,宿主把它投影成表單,面板只負責渲染與暫存,不自建存儲。面板註冊在插件管理頁的 plugins.row.config 插槽,鍵爲 dsh-progress-beat#dsh-progress-beat。
也可以直接在 profile patch 裏寫配置,等價於面板保存的結果:
- insert:
- id: dsh-progress-beat
name: 'dsh-progress-beat'
inject: [systemPrompt]
config:
# ① 常駐進度規則(system prompt section)
injectPrompt: true # 是否註冊常駐規則
promptEvery: 6 # 規則文本里「每累計約 N 次」的 N(2–50,僅影響過程播報)
sectionOrder: 4 # section 排序號(0–99,默認 4,工具聲明在 100 起)
# ② 用戶輪提醒(agent/pre-step)
nudgeOnUserTurn: false # 是否隨用戶輸入注入(默認關)
nudgeEveryTurns: 1 # 每幾輪提醒一次:1 每輪,3 每三輪(1–20)
# ③ 沉默提醒(agent/pre-step,按沉默而非調用總數)
nudgeOnToolCalls: true # 是否開啓(默認開)
every: 8 # 沉默調用閾值:自上次播報以來累計多少次調用(2–100)
silentSeconds: 180 # 沉默時間閾值(秒),與調用次數先到先算
maxRemindersPerTurn: 6 # 每輪預算;0 表示關掉這一路
minGapSeconds: 60 # 兩條提醒之間的最小間隔(秒)
dripSeconds: 300 # 預算用盡後的慢速提醒間隔(秒),不會徹底靜音
# promptText / userTurnText / nudgeText 可整段替換,支持 {{every}} / {{count}} / {{seconds}} / {{remind}} 佔位
安裝與啓用¶
profile 名按入口選:桌面版 GUI 啓動的是 desktop profile,dsh web / 瀏覽器版用的是 web profile。從 GitHub 直接裝:
dsh plugin --profile desktop add github:Mabinogi-Cichol/dsh-progress-beat
也可以本地克隆後裝:
git clone git@github.com:Mabinogi-Cichol/dsh-progress-beat.git
dsh plugin --profile desktop add <克隆目錄的絕對路徑>
裝完確認 profile 的 package.json 裏 dsh.profile.bundles 含 dsh-progress-beat。運行中的 loader 會熱加載新增條目;若「插件列表」沒刷新,切走再切回該標籤頁(它只在掛載時拉一次快照),或刷新頁面讓瀏覽器半側重新入圖。裝錯 profile 時插件在界面上完全不可見,因爲「插件列表」是 cordis loader 條目的只讀投影。
依賴解析:Host 半側 import @deepseek-ai/schemastery。以 link: 方式安裝時,Node 從倉庫目錄向上解析,因此本機需要一個指向 DSH 安裝的 node_modules:
$target = "<DSH>\resources\app\dsh\node_modules\@deepseek-ai"
New-Item -ItemType Junction -Path .\node_modules\@deepseek-ai -Target $target
node_modules/ 已在 .gitignore 內。缺少這一步時插件加載失敗、進度播報整體不生效,而不僅是面板。
卸載:
dsh plugin --profile desktop remove dsh-progress-beat
# 並從 profile package.json 的 dsh.profile.bundles 中刪掉同名條目
自測¶
倉庫自帶兩個冒煙腳本:
node test\smoke.mjs # Host:注入節奏、配額、block 透傳、輪次清零
node test\panel-smoke.mjs # Client:註冊鍵、注入面、summary/page 兩視圖
smoke.mjs 覆蓋 section 註冊與佔位符替換、注入節奏、單輪配額、block 分支透傳、無 agent 直連調用不計數、新用戶提示詞清零、關閉 prompt 注入。panel-smoke.mjs 用 mock 的 ModuleLoader 與 React 執行瀏覽器半側,覆蓋 factory 能被 load() 接收、apply 不拋錯、面板註冊到 plugins.row.config、注入面含表單控制器、字段與保存控件都被渲染。
適用場景與注意¶
適合在長工具鏈任務裏給用戶可見反饋的 DSH 使用者,或者說給那些界面上只有工具卡片在滾、沒人知道進度的 agent 場景。想節奏更密就把 every 調到 2–3;覺得吵就調到 6–8,或把 injectPrompt 關掉只留兜底提醒。
要注意的是:進度是否「說得好」本質仍是模型行爲,插件只能通過常駐規則加週期提醒提高概率,不能 100% 程序化鎖死。插件以當前 dsh 進程權限運行,裝前應檢查源碼與許可證(MIT);許可證、版本號(0.3.1)、字段默認值都以倉庫 README 和 package.json 爲準。
結尾¶
dsh-progress-beat 的價值在於把「靜默執行」改成「邊做邊說」,且默認不過度打擾:常駐規則 + 沉默提醒即可工作,需要更密或更安靜時再調參。目錄頁:https://www.skillhub.cn/plugins/Mabinogi-Cichol/dsh-progress-beat ;倉庫:https://github.com/Mabinogi-Cichol/dsh-progress-beat 。社區目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係。