前言¶
在 DSH 裏跑智能體任務,常見需求是把「任務失敗、待審批、工具報錯」推到手機或 IM。社區裏已有不少「收到事件就轉發」的插件,但多數只負責投遞,不回答更棘手的問題:同一條失敗是否該再發、凌晨兩點是否該吵醒你、二十條告警能否合成一條、通道短暫不可用時是否丟消息。
下面介紹維護者 Archaofan 的 dsh-notify-relay(GitHub:Archaofan/dsh-notify-relay,SkillHub 分類:聯網工具)。它的定位是 外聯通知的規則中樞:生命週期事件先經去重、免打擾、摘要合批等策略,再路由到 Bark、Server醬、Telegram、企業微信、飛書、釘釘、ntfy 或通用 webhook;投遞失敗會退避重試,隊列在進程重啓後仍可恢復。插件零運行時依賴,無需構建步驟。
這是什麼¶
dsh-notify-relay 是 DeepSeek Harness 的 Web 側插件:監聽 DSH 生命週期事件(任務完成/失敗/中止/阻塞、請求失敗、審批詢問/決定、工具失敗等),在「是否發送、何時發送、發往哪些通道」上集中決策,再調用各通道的薄適配層發出消息。
維護者:Archaofan。
社區目錄頁:https://www.skillhub.cn/plugins/Archaofan/dsh-notify-relay
源碼與文檔:https://github.com/Archaofan/dsh-notify-relay
與「單純轉發」的插件相比,README 強調產品價值在規則層:dedup、quiet hours、digest、mute、按通道過濾、密鑰脫敏,以及審批類事件在免打擾/摘要下不被 hold(避免任務拖到早上才繼續)。
核心功能¶
規則層¶
| 能力 | 作用 |
|---|---|
| Dedup(去重) | 對 (kind, session, title, body) 指紋,在 1–1440 分鐘窗口內抑制重複推送 |
| Quiet hours(免打擾) | 支持跨午夜區間(如 22:00 → 08:00);重複通知可丟棄或進入 digest |
| Digest(摘要合批) | 被 hold 的通知按 N 分鐘合併爲一條,也可手動 flush |
| Mute | 通過 /notify mute <minutes> 臨時屏蔽一切(含新指紋) |
| Approval pierce | 審批請求不受 quiet hours / digest hold |
| Retry | 失敗投遞進入持久 outbox,退避 30s → 1m → 2m → … → 30min;重啓不丟 |
| Routing | 每個通道可設事件過濾器(如 Telegram 只收失敗) |
| Redaction | 密鑰在 API 響應中以 •••••••• 掩碼展示,不出現在投遞日誌 |
package.json 描述中還提到:嚴重度映射到各通道原生字段(如 Bark level/call、ntfy Priority、釘釘 isAtAll)、單通道熔斷、抖動退避、外聯自檢告警。具體行爲以倉庫當前版本文檔爲準。
界面與可觀測性¶
- 設置頁:Settings → Outbound relay — 總開關、八種事件開關、去重窗口、免打擾(起止/模式)、摘要間隔、投遞語言、待重試隊列、通道編輯器。
- 通道編輯器:增刪改通道;名稱、類型、endpoint、密鑰、事件過濾;Test 會向該通道發一條真實投遞。
- 側欄底部:狀態 pill(開/關、最近投遞結果);點擊可打開近期投遞日誌。
- 投遞日誌:包含規則層 決定不發送 的記錄及原因(dedup / muted / quiet-hold / digest / no channel),便於排查「到底發沒發」。
UI 語言跟隨 DSH;推送到手機/IM 的文案語言由配置項 language(zh / en)單獨控制。
支持的通道¶
| Kind | 配置要點 |
|---|---|
bark |
Bark 服務器 URL;iOS 推送,group 爲 dsh-notify-relay |
serverchan |
SendKey(Server醬) |
telegram |
bot token + chat id;任務完成類可 silent |
wecom |
企業微信機器人 webhook key,markdown |
feishu |
飛書 webhook token,交互卡片 |
dingtalk |
access token,可選 sign secret;markdown;critical 可 @所有人 |
ntfy |
topic(可選自定義 server),JSON publish |
webhook |
任意 URL,通用 JSON POST;可選自定義 header 攜帶密鑰 |
每通道事件過濾默認 *(全部)。未知 channel kind 在校驗階段丟棄,避免新版本配置拖垮啓動;已知 kind 內未識別的 secret 字段會保留,避免誤刪憑證。
Slash 命令(不經過模型)¶
/notify status/notify test [channel]/notify mute <minutes>//notify unmute/notify flush//notify retry
安裝與啓用¶
README 寫明已在 DSH 0.1.6-alpha.2 與 0.1.7-rc.2 上驗證;package.json 中 engines.dsh 爲 >=0.1.6-alpha.1 <0.1.7 || >=0.1.7-alpha.1 <0.2.0-0。安裝時請使用資料中的命令,不要自行拼接倉庫名。
生產 profile 從 GitHub 安裝:
dsh plugin --profile web add github:Archaofan/dsh-notify-relay --ignore-scripts
或從本地 tarball(README 示例文件名爲 dsh-notify-relay-0.3.3.tgz):
dsh plugin --profile web add file:./dsh-notify-relay-0.3.3.tgz --ignore-scripts
--ignore-scripts 建議保留:插件無 install script、無運行時依賴,跳過腳本更快也更安全。
安裝後重啓 DSH(或重載 Web 應用),打開 Settings → Outbound relay 完成配置。
若第二次安裝報 ERR_PNPM_MISSING_TARBALL_INTEGRITY¶
這是 pnpm 在 lockfile 缺少 tarball integrity 時的已知問題,第一次安裝通常成功;在同一 profile 再裝第二個插件時可能觸發。README 給出的修復是在對應 profile 目錄下刪除 node_modules 與 pnpm-lock.yaml 後重裝(僅刪 lockfile 不夠)。路徑形如 <DSH_HOME>/profiles/<profile>/。
典型配置¶
最快路徑是官方設置頁。也可直接編輯 <DSH_HOME>/storages/notify-relay/config.json;加載時會校驗,非法值回退默認而非崩潰。
示例骨架(字段以 README 爲準):
{
"enabled": true,
"language": "en",
"events": {
"task.done": false,
"task.failed": true,
"task.aborted": true,
"task.blocked": true,
"request.failed": true,
"approval.asked": true,
"approval.decided": false,
"tool.failed": true
},
"dedup": { "windowMinutes": 10 },
"quiet": { "enabled": false, "start": "22:00", "end": "08:00", "mode": "digest" },
"digest": { "enabled": false, "intervalMinutes": 30 },
"deepLink": "",
"channels": [
{
"id": "phone",
"name": "My phone",
"kind": "bark",
"url": "https://api.day.app/YOUR_KEY",
"secrets": {},
"events": ["*"]
}
]
}
quiet.mode 爲 digest(hold 後合併發送)或 drop。通道編輯器裏密鑰爲掩碼展示;未修改密鑰時保存不會清空已有 token。
典型工作流:
- 安裝插件並打開 Outbound relay,打開總開關。
- 按需要勾選事件(例如失敗、審批、工具失敗開,任務完成關)。
- 在通道編輯器添加 Bark/Telegram 等,設置 endpoint 與密鑰,用 Test 驗證。
- 按需開啓去重窗口、免打擾與摘要;審批類事件會自動穿透 hold。
- 運行任務或執行
/notify test;在投遞日誌中確認「已發送」或「被規則抑制」及原因。
適用場景與注意¶
適合誰
- 長時間 unattended 跑 DSH 任務,需要手機/IM 告警但不想被重複失敗刷屏。
- 多通道分流:例如 Bark 收全部、Telegram 只收失敗與審批。
- 需要在日誌裏區分「沒配通道」與「被 dedup/免打擾攔住」的開發者。
使用前請注意
- DSH 生態是「一切皆插件」;SkillHub 等社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
- 插件以 當前 DSH 進程權限 運行,會向配置的外網 endpoint 發送任務標題、正文等;安裝前請閱讀源碼與 MIT 許可證,自行評估密鑰與數據出境風險。
- 外聯通道憑證保存在本地配置中;雖 API 與日誌有脫敏,仍應限制 DSH 主機與備份文件的訪問權限。
結尾¶
dsh-notify-relay 把「要不要發、怎麼發、發到哪裏」從各通道插件裏抽成一層規則中樞,並補全投遞日誌與失敗重試,適合作爲 DSH 外聯通知的默認入口。進一步細節見倉庫 README 與中文說明 README.zh.md。