前言¶
在 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。