dsh-WeCom-notify:在 DeepSeek Harness 中用企业微信接收任务通知

前言

在 DeepSeek Harness(dsh)里,goal 任务常常需要运行一段时间。对开发者来说,比较实际的诉求是:goal 完成或阻塞时能收到提示,每轮 agent 回复结束后能看到摘要,而不需要一直盯终端,也不希望完全依赖模型“记得调用工具”。

已有 dsh-wechat-notify 尝试过用第三方通道推送。本文介绍 GuZhengSVTdsh-WeCom-notify:它改走企业微信官方群机器人 webhook,在 dsh 的关键节点自动推送通知,并提供 wechat_notify 工具。

这是什么

dsh-WeCom-notify 是 DeepSeek Harness(dsh)插件。它通过企业微信官方群机器人 webhook(qyapi.weixin.qq.com),在 goal 完成/阻塞和每轮对话完成时自动推送通知,并暴露 wechat_notify 工具,供 agent 主动发送进度。

插件由 GuZhengSVT 维护,许可证为 MIT。通知逻辑基于事件驱动,订阅 session/eventgoal/changed,不依赖 LLM 主动调用;未配置 webhook key 时插件正常加载,并降级为日志提示。

核心能力

  • goal 任务完成/阻塞时自动推送。
  • 每轮对话完成时自动推送该轮 agent 回复总结。
  • 提供 wechat_notify 工具,供 agent 主动发进度。
  • 支持多个 webhook key,一条通知同时发送到所有已配置群。
  • 支持 mentionUserid,在通知中 @ 指定成员。
  • 提供 dsh 设置 → 企业微信通知 面板,粘贴 key、保存后热生效。
  • 异步 fetch 发送,不阻塞事件循环。
  • 内置串行队列、节流、内容去重、指数退避重试、超时控制。
  • UTF-8 按码点截断,避免截断 emoji 代理对;同时做 markdown 转义。
  • 单条消息上限 4096 字节,默认 3800;节流默认 10000ms,去重默认 30000ms。

安装与启用

前置条件

  • DeepSeek Harness(dsh)运行环境。插件的 peerDependencies 包括:@deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/schemastery@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-slots
  • 一个企业微信群,以及群机器人 webhook。添加群机器人后,复制 webhook 地址中的 key

构建插件

先构建插件:

npm install && npm run build

构建会产出 host 入口 lib/index.js 和设置面板 lib/client.js

方式 A:bundle 装配

如果需要使用设置面板,推荐用 bundle 装配。将插件链接到 profile 的 node_modules

ln -s /绝对/路径/dsh-WeCom-notify ~/.dsh/profiles/web/node_modules/dsh-wecom-notify

再在 package.json 中声明 dependenciesdsh.profile.bundles,加入 dsh-wecom-notify

完成装配后,重启 dsh web。启动日志中出现 [wechat-notify] plugin loaded 表示插件已加载。

方式 B:patch 挂载

如果只需要 host 侧通知功能,也可以在 ~/.dsh/profiles/web/cordis.patch.yml 中挂载:

- insert:
    - id: wechat-notify
      name: 'file:///绝对/路径/dsh-WeCom-notify/lib/index.js'
      config: {}

注意:方式 B 的 file:// 入口不带设置面板;设置面板需要通过方式 A 的 bundle 装配加载。

一键写入 patch

也可以使用仓库提供的安装脚本:

npm run install-dsh

该命令会构建并写入 patch 配置,默认写入 ~/.dsh/profiles/web/,属于方式 B。

典型用法

通过设置面板配置

打开 dsh 设置 → 企业微信通知

  1. 粘贴 webhook key,可填多个,多个群同时通知。
  2. 点击「发送测试消息」验证。
  3. 点击「保存配置」,保存后立即生效。

设置面板保存后,配置会持久化到:

<DSH_HOME>/wecom-notify/config.json

文件权限为 0600。当该文件存在时,以文件中的配置为准;删除该文件可回到静态配置或环境变量配置。

配置优先级

配置读取优先级如下:

设置面板文件 > cordis.yml config > 环境变量 > 默认值

cordis.yml 静态配置

也可以在 cordis.patch.ymlconfig 中写入:

- insert:
    - id: wechat-notify
      name: 'file:///绝对/路径/dsh-WeCom-notify/lib/index.js'
      config:
        webhookKeys:
          - '第一个群机器人 webhook key'
          - '第二个群机器人 webhook key'

可选字段包括 webhookUrlmentionUseridminIntervalMsdedupeWindowMstriggerOnAgentIdleturnSummaryEnabledmaxBytes

环境变量

未使用设置面板或静态配置时,也可以使用环境变量:

WECHAT_WEBHOOK_KEY=<你的key> node scripts/smoke.ts
WECHAT_WEBHOOK_KEYS='key1,key2' node scripts/smoke.ts

相关环境变量包括 WECHAT_WEBHOOK_KEYSWECHAT_WEBHOOK_KEYWECHAT_WEBHOOK_URLWECHAT_MENTION_USERIDNOTIFY_MIN_INTERVAL_MSNOTIFY_DEDUPE_WINDOW_MSNOTIFY_TRIGGER_AGENT_IDLENOTIFY_TURN_SUMMARYNOTIFY_MAX_BYTES

验证

运行测试与类型检查:

npm test
npm run typecheck

如果已经完成配置,也可以给 dsh 一个带 goal 的任务,在 goal 完成或阻塞时查看企业微信群是否收到通知。

适用场景与注意

适合以下情况:

  • dsh 长时间运行 goal,希望完成/阻塞时被动接收通知。
  • 希望每轮对话完成后收到 agent 回复摘要。
  • 需要把同一份通知发到多个企业微信群。
  • 希望使用企业微信官方群机器人 webhook,而不是第三方中转通道。

需要注意:

  • 插件运行在 dsh 进程内,拥有当前 dsh 进程可见的权限。安装前应检查源码与许可证;本插件许可证为 MIT
  • 仓库本身不包含本机路径与密钥;key 仅保存在用户数据目录。
  • 未配置 webhook key 时,插件会正常加载,但通知会降级为日志提示,不会向企业微信发送。
  • 方式 B 的 file:// 挂载不包含设置面板;需要面板时使用方式 A bundle 装配。
  • 设置面板生成的 config.json 优先级最高。若修改了 cordis.yml 或环境变量但未生效,可检查 <DSH_HOME>/wecom-notify/config.json 是否仍存在。
  • 企业微信 webhook 消息有字节限制。本插件单条上限 4096 字节,默认 3800。
  • npm install 可能因 @deepseek-ai/dsh-compact 报 404;构建脚本可回退到 DSH checkout 的 tsdown。

结尾

dsh-WeCom-notify 把 dsh 的 goal 状态和每轮对话结果接入企业微信群机器人 webhook。它的核心价值在于:事件驱动、自动触发、多群通知,并提供设置面板降低配置成本。

仓库地址:

https://github.com/GuZhengSVT/dsh-WeCom-notify

目录页:可在 DeepSeek Harness 社区目录中按插件名 dsh-WeCom-notify 查找;已核实资料未提供独立目录 URL。

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

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

Xiaoye