dsh-always-there:讓 DSH agent 有機會自己開口

前言

在 DSH 裏跑 agent,常見交互是「你問一句,它答一句」。若希望 agent 像同事一樣偶爾主動搭話——不是定時彙報,也不是任務完成後的機械播報——需要在宿主里加一層「叫醒」機制,並把「說不說、說什麼」留給模型自己決定。dsh-always-there 走的就是這條路:插件只負責在合適時機把當前會話叫醒,agent 看完上下文後想說就說,不想說就回 SILENT。維護者是 LingDangZaiXiang,分類爲工作流;倉庫 README 也寫明方案尚未完全成熟,部分界面代價目前只能接受。

這是什麼

一句話:住在 DSH 裏的「偶爾主動說一句話」的工作流插件——觸發器只敲鈴,不替 agent 寫臺詞。

它解決的是「被動問答」模式下的空白:心跳或事件把一句話送進正在聊的那個會話,agent 在同一身份、同一會話裏醒來決策,而不是另起一個隱藏會話代發(後者在 README 裏被明確否掉,因爲會變成「另一個拿着你名字的人在說話」)。

設計取捨與未解決問題

README 把已否掉的做法寫得很清楚:

  1. 定時推送:到點就發,容易變成打卡,沒內容也像鬧鐘。
  2. 後臺會話代發:提示看不見,但不是「我」在說話。

當前選路是在當前會話裏叫醒。代價也寫明瞭:叫醒用的提示詞會出現在界面上;若回 SILENT,主人也可能看見(或由發送層攔掉,界面仍可能留一行)。作者認爲這比「換一個人說話」更可接受。

尚未解決的核心問題是:怎樣讓「叫醒」既不可見、又仍是同一個 agent。README 列過不可見前綴、空字符串、塞進系統提示等方向,並說明 DSH 沒有「無消息的叫醒」通道——誰有更好的繞法可以自己做一套,這裏只是把坑標出來。

核心功能

觸發只有兩種,都只負責叫醒,不負責說什麼:

事件:監視一個日誌文件,出現結束標記時叫醒(默認不填 eventLog 則不生效)。默認提示詞 eventPrompt 強調「有想說的麼?沒有就回 SILENT——不用爲了彙報而說話」,避免接成「任務完成彙報」。

心跳:每 N 分鐘一次。提示詞關鍵是「輪到你了,開口吧……不用等有事才說話」——少了後半句,模型容易一直判自己沒內容可說而永遠沉默。

安靜時段默認 01:00–07:00 不叫醒(配置項 quietFrom / quietTo,示例爲 1 與 7)。

無人值守時,倉庫版喚醒語裏帶有軟約束:不確定主人在不在則只讀、只寫便籤;改文件、跑命令、動配置留到主人回來。README 說明這是靠模型自覺遵守,不是沙箱;作者本地用法是去掉這句話,用的人需自行評估風險。

版本 0.1.0,許可證 MIT(見 package.json 與 README)。

安裝與啓用

官方安裝命令如下(<profile> 按你的 DSH 起法選,例如桌面客戶端多爲 desktop):

dsh plugin --profile <profile> add dsh-always-there

裝完默認關閉(enabled: false)。不填 sessionId 什麼也不會發生——不是壞了,是沒指定要叫醒哪個會話。

在 profile 的 cordis.patch.yml 裏按插件 id 覆蓋,例如:

- id: dsh-always-there
  config:
    enabled: true
    sessionId: session-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  # 要被叫醒的會話
    heartbeatMinutes: 120
    quietFrom: 1
    quietTo: 7
    # 可選:事件觸發
    eventLog: C:\Users\you\.dsh\some-task\duty.log
    eventMarker: 任務結束

sessionId 即會話目錄名:~/.dsh/sessions/<workspace>/session-xxxx/ 下以 session- 開頭的文件夾名。

出口與 SILENT

「不想說話」靠回 SILENT 表達。若消息要發到 QQ、Telegram 等,發送層需識別並攔截,否則主人會收到兩個字母。README 建議在發送函數最前面加過濾:

const raw = String(text ?? '').trim()
if (/^(silent|\[靜默\])\W*$/i.test(raw)) return

典型用法

  1. 安裝插件,在 cordis.patch.yml 裏設 enabled: true 並填好 sessionId。
  2. 按需設 heartbeatMinutes(示例 120 分鐘一次心跳叫醒)。
  3. 若要用事件而非彙報:配置 eventLog 與 eventMarker,並理解默認 eventPrompt 是「允許沉默」,不是「必須彙報」。
  4. 若對接外部聊天,在發送層加上對 SILENT / [靜默] 的過濾。

適用場景與注意

適合:希望在同一會話、同一 agent 身份下,用事件或 gentle heartbeat 給模型「開口機會」,且能接受叫醒提示在界面可見、沉默可能被看見或需發送層攔截。

務必注意:

  • 插件以當前 DSH 進程權限運行;心跳/事件喚醒來的是普通一輪會話,權限與人在電腦前時相同。安裝前請閱讀 GitHub 倉庫 源碼與 MIT 許可證。
  • 方案在 README 中標註爲未完成;生態上 DSH 強調「一切皆插件」,社區目錄站點 SkillHub 插件頁 爲獨立收錄,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-always-there 的價值在於把「主動搭話」拆成「叫醒 + agent 自決」,並公開寫清定時推送、代發會話等路線的失敗原因與當前代價。若你要的是任務完成通知或嚴格不可見的叫醒,README 建議用別的工具或自研更成熟方案。

  • 目錄頁:https://www.skillhub.cn/plugins/LingDangZaiXiang/dsh-always-there
  • GitHub:https://github.com/LingDangZaiXiang/dsh-always-there
羽毛球分组比赛记分
小程序二维码

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

小夜