dsh-turn-chime:在用戶任務真正完成時響一聲

前言

在 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"

觸發條件(三者同時滿足)

  1. 收到 session/event 的 user/message,且 source.kind === "user"(時間上下文注入、子智能體反饋、hook 注入不算);
  2. 收到 session/event 的 turn/end,且 reason.kind === "completed"(aborted、error、blocked、觸達 max-tokens 不響);
  3. 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。

典型用法

  1. 按上一節完成安裝並重啓 DSH。
  2. 打開 Settings → Chime,開啓 Enable chime,選 Voice 和 Volume。
  3. 在對話裏發送一條用戶消息,等待任務正常跑完;應聽到一聲提示。若中途點停止或報錯,不應響。
  4. 需要排查時,看設置裏 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
羽毛球分组比赛记分
小程序二维码

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

小夜