前言¶
在 DeepSeek Harness(DSH)裏跑長任務時,你往往不會一直盯着界面。常見做法是輪詢 api-session/status,看智能體是否從 busy 回到 idle,再當作「做完了」去處理後續事情。這個信號有兩個盲區:用戶點停止、運行報錯或被 hook 攔截時,狀態同樣會變 idle,和正常結束無法區分;一次用戶任務還可能經歷多個 driver(子智能體回傳、goal 輪次繼續等),每停一個 driver 就會 idle 一次,容易誤響多次。
下面介紹社區客戶端插件 dsh-turn-chime(維護者 MacilyDots,GitHub:MacilyDots/dsh-turn-chime)。它在主機側根據會話事件判斷「用戶發起的任務是否正常結束」,再通過 SSE 通知瀏覽器用 Web Audio 合成提示音,儘量做到只響一次、且不在中斷時響。
這是什麼¶
dsh-turn-chime 是 DSH 的會話完成提示音插件,分類爲客戶端。主機負責判定何時該響;聲音在渲染進程播放;音色由 Web Audio 現場合成,不依賴音頻文件。
社區目錄頁:skillhub.cn/plugins/MacilyDots/dsh-turn-chime。目錄站點與 DeepSeek / 幻方無官方從屬關係;DSH 生態本身是「一切皆插件」的思路,安裝第三方插件前建議自行查看源碼與許可證(本插件爲 MIT,當前 package 版本 0.2.0)。插件在當前 DSH 進程權限下運行,安裝前請確認你信任該倉庫。
核心功能¶
與直接看 idle 的差異¶
| 問題 | 僅看 api-session/status |
dsh-turn-chime |
|---|---|---|
| 正常結束 vs 中斷 | 無法區分 | 僅 turn/end 且 reason.kind === "completed" 才計入 |
| 多 driver 一次任務 | 可能多次 idle | 一條用戶消息對應一次 pending,首次響鈴後消費 |
| 誰發的消息 | 客戶端只有 busy 布爾值 | 主機校驗 user/message 且 source.kind === "user" |
觸發條件(三者同時滿足)¶
- 收到
session/event的user/message,且source.kind === "user"(時間上下文注入、子智能體反饋、hook 注入不算); - 收到
session/event的turn/end,且reason.kind === "completed"(aborted、error、blocked、觸達max-tokens不響); agent/status變爲idle(一個 driver 完全停下)。
判定結果經 SSE 推送到客戶端路徑 /dsh-turn-chime/events。
客戶端設置¶
在 DSH 界面 Settings → Chime 可配置:
| 項 | 說明 |
|---|---|
| Enable chime | 總開關 |
| Voice | Crisp ding / Bell / Short pluck / Short beep / Water drop / Xylophone / Retro two-tone / Soft bass / Muted |
| Volume | 0–100%,鬆開滑塊時自動試聽 |
| Ignore subagent sessions | 默認開啓;子智能體結束不計入「用戶在等的那件事」 |
| Event channel | 顯示 SSE 是否連接、已響次數 |
配置保存在瀏覽器 localStorage,鍵名 dsh-turn-chime:config:v1。
架構要點¶
聲音只能來自渲染進程:主機側若直接播放到系統,要麼冷啓動外部播放器(延遲大),要麼只能用 Electron shell.beep()(無法選音色)。Web Audio 無額外依賴、延遲低、跨平臺。
判定只能放在主機:turn/end 的 reason、user/message 的 source 只在主機事件總線上;客戶端拿到的 session status 不足以區分「完成」與「被停止」。
主要文件:lib/index.js(主機判定與路由)、lib/client.js(SSE、Web Audio、設置面板)、install.mjs(安裝腳本)。
安裝與啓用¶
將倉庫放到任意目錄後,在倉庫根目錄執行(命令來自官方 README):
node install.mjs # 安裝到 %DSH_HOME%\profiles\desktop
node install.mjs web # 安裝到命名 profile(可多次指定不同 profile)
node install.mjs X:\path\to\profile
安裝腳本會:在對應 profile 的 package.json 寫入 file: 依賴;把插件名加入 dsh.profile.bundles;在 node_modules/<plugin> 下創建指向本倉庫的 junction(改源碼即生效,無需再拷貝同步)。
安裝後必須重啓 DSH。客戶端模塊清單在啓動時生成,不重啓插件不會加載。
卸載:從 dsh.profile.bundles 去掉對應行,再刪除 node_modules/dsh-turn-chime。
典型用法¶
- 按上一節完成安裝並重啓 DSH。
- 打開 Settings → Chime,開啓 Enable chime,選 Voice 和 Volume。
- 在對話裏發送一條用戶消息,等待任務正常跑完;應聽到一聲提示。若中途點停止或報錯,不應響。
- 需要排查時,看設置裏 Event channel 的 SSE 狀態與響鈴計數。
瀏覽器控制台調試(README 提供):
__dshTurnChime.play('chime', 0.6) // 手動試聽
__dshTurnChime.status() // { connected, chimes, config }
__dshTurnChime.onChime('x') // 模擬完成事件,應響一次
主機側日誌默認路徑:
%DSH_HOME%\logs\dsh-turn-chime.log
正常結束一段日誌大致包含 client-ready、sse-open、chime、play(且 ok:true)。同插件還提供:
GET /dsh-turn-chime/events— SSE 完成事件流GET /dsh-turn-chime/log— 最近 120 行日誌POST /dsh-turn-chime/clear— 清空日誌
邏輯測試可在倉庫根目錄運行:
node test/test-logic.mjs # 或 npm test
覆蓋場景包括:正常結束響鈴、用戶中斷靜音、僅時間上下文注入靜音、一條消息兩個 driver 只響一次、錯誤靜音、中斷後新消息再完成再響。
適用場景與注意¶
適合:長時間讓 DSH 在後臺跑任務、希望「真正做完」時有可聽反饋、又不想被誤 idle 或子智能體多次結束打擾的開發者。
侷限(README 已說明):
- 僅在瀏覽器渲染進程發聲,DSH 完全關閉時沒有聲音。
- 依賴 DSH 內部事件形態(
session/event、agent/status);大版本升級後可能需要同步改lib/index.js。 - 默認只對
completed響;若希望錯誤也用另一種音,需改lib/index.js中的CHIME_REASON。
安全與信任:插件會訂閱會話事件並在本地寫日誌、開 SSE;安裝前請閱讀 GitHub 倉庫 源碼,確認符合你的環境策略。
結尾¶
dsh-turn-chime 把「完成」從單純的 idle 裏拆出來:主機看用戶消息與 turn 結束原因,客戶端用 Web Audio 響一聲,並可在設置裏選音色與音量。若你正在 DSH 裏做智能體開發、又需要可靠的完成提醒,可以從目錄頁或 GitHub 獲取倉庫,按 install.mjs 裝入 profile 後重啓即可試用。
- 目錄頁:https://www.skillhub.cn/plugins/MacilyDots/dsh-turn-chime
- GitHub:https://github.com/MacilyDots/dsh-turn-chime