dsh-ntfy:为 DSH 智能体接入 ntfy 推送通道

前言

DSH(DeepSeek Harness)里的智能体完成长时间任务后,结果往往还留在会话或日志里;若你不在终端前,告警、报告和作业结论很难及时落到手机或桌面通知。常见做法是另写脚本调 Webhook、邮件或第三方推送 API,再在工具链里单独挂一层。下面介绍的 dsh-ntfy 把这条路径收成一次工具调用:向 ntfy 主题(topic)发消息,订阅该主题的客户端或应用即可收到推送。插件无状态、不落地文件、无额外运行时依赖,适合在已有 DSH profile 上按需挂载。

这是什么

dsh-ntfy 是 DSH 的 out-of-tree 插件,维护者为 xuan25,在 SkillHub 插件目录 中归类为「联网工具」。它向智能体暴露 ntfy 工具:一次调用把标题、正文等发布到配置好的 ntfy 频道(channel),对应 ntfy 服务器上的 topic;作业结果、告警和报告可到达用户设备,或任何订阅该 topic 的应用与 feed。可与 ntfy.sh 或自建 ntfy 服务配合使用。

核心功能

根据仓库 README,当前版本(package.json 为 0.1.0)能力如下:

  • 单工具推送:插件注册 ntfy 工具,动词包括 send 与 channels;另提供 dsh-ntfy skill,说明完整参数、限制与排错。
  • 多频道、单次单目标:通过环境变量或 cordis 配置声明多个 channel;每次 send 只指向一个 channel。
  • 服务器灵活:默认使用 https://ntfy.sh,也可为每个 channel 指定自建 ntfy 的 base URL。
  • 认证可选:支持 Basic(USER + PASS 成对)或 Bearer TOKEN,二者不可与 USER/PASS 混用。
  • 长正文分片:正文超过 4096 UTF-8 字节时按序分块发送;某块失败则中止后续块,并在结果中说明已送达块数,剩余需显式重发。
  • 零本地状态:不创建文件,配置来自进程环境变量与可选 cordis patch 层。

安装与启用

在目标 dsh profile 下用官方命令安装(勿用未在文档出现的 github:owner/repo 形式):

dsh plugin --profile <name> add dsh-ntfy

配置分三层叠加:内置默认值、NTFY_* 环境变量、以及可选的 cordis config patch。环境变量在进程启动时生效;修改 env 后需重启 host 才会生效。插件本身不写配置文件。

环境变量

每个 channel 由 NTFY_<NAME>_TOPIC 声明(必填);<NAME> 仅含大写字母与数字,channel 名为其小写形式,须匹配 ^[a-z][a-z0-9-]{0,31}$(无下划线、不能以数字开头)。topic 字符串为寻址凭证,字符集 [-_A-Za-z0-9]{1,64}。

变量 必填 含义
NTFY_<NAME>_TOPIC 是 声明 channel <name>
NTFY_<NAME>_SERVER 否 服务 base URL,默认 https://ntfy.sh
NTFY_<NAME>_USER + NTFY_<NAME>_PASS 否(成对) Basic 认证
NTFY_<NAME>_TOKEN 否 Bearer token,不可与 USER/PASS 同用
NTFY_DEFAULT_CHANNEL 否 send 未指定 channel 时使用的频道名(大小写不敏感)

示例:

NTFY_DEFAULT_CHANNEL=dash
NTFY_DASH_TOPIC=dsh-alerts-Kx7pQm

命名不规范的 channel 会在启动时被丢弃并告警,不影响整体启动。无效 topic、半套 Basic 认证、或 token 与 Basic 并存等情况同样只告警。

cordis patch(可选)

可在 profile 的 cordis.patch.yml、用户全局 ~/.dsh/cordis.patch.yml 或 --patch 覆盖层中,以插件 id dsh-ntfy 写入 camelCase 的 config(如 defaultChannel、channels 映射)。优先级为:patch 交付值 > 环境变量 > 内置默认;patch 按 id 整段替换 config,不做深合并,覆盖某一字段时需写全要保留的字段。若环境支持 live patch reload,改 patch 可触插件重载;否则下次重启生效。

- id: dsh-ntfy
  config:
    defaultChannel: dash
    channels:
      dash:
        server: https://ntfy.example.com

典型用法

智能体或你在 harness 中的典型调用如下(参数以 skill 文档为准):

ntfy { verb: "send", body: "deploy finished", title: "CI", priority: "high" }
ntfy { verb: "send", body: "nightly backup done", channel: "backups" }
ntfy { verb: "channels" }

先用 channels 查看当前可用频道,再在 send 里指定 body、可选 title、priority、channel 等字段。

适用场景与注意

适合谁:需要在 DSH 任务结束或异常时,把短消息推到手机 ntfy 客户端、自建监控或任何订阅 topic 的消费者的开发者;多 channel 可区分 CI、备份、告警等业务线。

限制(来自 README):

  • ntfy.sh 对访客约 250 条/天;自建服务器限额自定;插件不做客户端限速。
  • 单条 body 上限 4096 字节(分块大小)、title 1 KB、tags 512 字节。
  • 消息发出后无法撤回(无 update/clear/delete 接口)。

安全与权限:插件在 当前 dsh 进程权限 下运行,会向配置的 ntfy 服务器发起 HTTP 请求;topic 相当于凭证,应使用足够随机、不易猜测的 topic 名,并妥善保管 TOKEN 或密码。安装前请自行查阅 GitHub 源码 与 MIT 许可证,确认符合你的合规要求。

DSH 生态强调「一切皆插件」;SkillHub 为社区目录站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-ntfy 把 ntfy 推送收成 DSH 内的一次 ntfy 工具调用,配置靠 NTFY_* 与可选 cordis patch,无本地状态文件。若你的智能体需要「任务完成即触达设备」,可按 profile 安装并配好 topic 后,在流程里直接 send。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye