前言¶
在 DeepSeek Harness(dsh)里,goal 任务常常需要运行一段时间。对开发者来说,比较实际的诉求是:goal 完成或阻塞时能收到提示,每轮 agent 回复结束后能看到摘要,而不需要一直盯终端,也不希望完全依赖模型“记得调用工具”。
已有 dsh-wechat-notify 尝试过用第三方通道推送。本文介绍 GuZhengSVT 的 dsh-WeCom-notify:它改走企业微信官方群机器人 webhook,在 dsh 的关键节点自动推送通知,并提供 wechat_notify 工具。
这是什么¶
dsh-WeCom-notify 是 DeepSeek Harness(dsh)插件。它通过企业微信官方群机器人 webhook(qyapi.weixin.qq.com),在 goal 完成/阻塞和每轮对话完成时自动推送通知,并暴露 wechat_notify 工具,供 agent 主动发送进度。
插件由 GuZhengSVT 维护,许可证为 MIT。通知逻辑基于事件驱动,订阅 session/event 与 goal/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 中声明 dependencies 与 dsh.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 设置 → 企业微信通知:
- 粘贴 webhook key,可填多个,多个群同时通知。
- 点击「发送测试消息」验证。
- 点击「保存配置」,保存后立即生效。
设置面板保存后,配置会持久化到:
<DSH_HOME>/wecom-notify/config.json
文件权限为 0600。当该文件存在时,以文件中的配置为准;删除该文件可回到静态配置或环境变量配置。
配置优先级¶
配置读取优先级如下:
设置面板文件 > cordis.yml config > 环境变量 > 默认值
cordis.yml 静态配置¶
也可以在 cordis.patch.yml 的 config 中写入:
- insert:
- id: wechat-notify
name: 'file:///绝对/路径/dsh-WeCom-notify/lib/index.js'
config:
webhookKeys:
- '第一个群机器人 webhook key'
- '第二个群机器人 webhook key'
可选字段包括 webhookUrl、mentionUserid、minIntervalMs、dedupeWindowMs、triggerOnAgentIdle、turnSummaryEnabled、maxBytes。
环境变量¶
未使用设置面板或静态配置时,也可以使用环境变量:
WECHAT_WEBHOOK_KEY=<你的key> node scripts/smoke.ts
WECHAT_WEBHOOK_KEYS='key1,key2' node scripts/smoke.ts
相关环境变量包括 WECHAT_WEBHOOK_KEYS、WECHAT_WEBHOOK_KEY、WECHAT_WEBHOOK_URL、WECHAT_MENTION_USERID、NOTIFY_MIN_INTERVAL_MS、NOTIFY_DEDUPE_WINDOW_MS、NOTIFY_TRIGGER_AGENT_IDLE、NOTIFY_TURN_SUMMARY、NOTIFY_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。