dsh-wechat-wake:微信社交模式下的定时唤醒

前言

在 DeepSeek Harness(DSH)里把 agent 接到微信,常见需求之一是「过一会儿再提醒一句」或「到点主动发一条消息」。DSH 自带的 @deepseek-ai/dsh-tool-schedule 在社交模式里往往用不了:bridge 会用 controlTool 前缀把这类工具挡在工具表外。bridge 自带的「到点把结果发回微信」(adoptScheduledTurn)又只在 workMode === 'assistant' 时执行。陪聊、人格类会话多在社交模式,这两条路都走不通。

社区插件 dsh-wechat-wake(维护者 epsilonH-eps,GitHub 仓库 epsilonH-eps/dsh-wechat-wake,SkillHub 分类为工作流)用不撞前缀的工具名 remind_* 绕开第一道限制,再用自有的 followup 与投递链路,把「到点说话 → 落进当前微信聊天」跑通。授权仍按聊天在 WeChatAgent 里勾选,不替代现有权限模型。

这是什么

dsh-wechat-wake 给绑定微信的 agent 提供一组定时工具:到点由插件触发唤醒,生成或直发的内容通过本机微信 hook 进入当前会话对应的聊天。目标场景是微信里的陪聊 / 人格会话(社交模式);助手模式应继续用原生 schedule_create,插件在助手模式被调用时会提示改用 schedule_create,避免与 bridge 对非请求唤醒的校验冲突。

插件以 MIT 许可发布,当前 package 版本为 0.1.0,要求 Node >= 18。它不读聊天记录、不上传数据;待触发列表只写在 $DSH_HOME/wechat-wake.json。

为什么需要单独一套 remind 工具

下面是对 README 里对照表的简要归纳,说明「现成能力卡在哪」以及本插件补什么。

现成能力 限制
@deepseek-ai/dsh-tool-schedule 社交模式下被 bridge 的 controlTool 前缀挡掉
bridge 的 adoptScheduledTurn 仅在 workMode === 'assistant' 时执行

本插件注册 remind_later、remind_list、remind_cancel,命名上不触发上述前缀规则;到点后走 agent.followup()(wake 模式)或原样发 note(text 模式),再经 POST http://127.0.0.1:30001/SendTextMsg 投递。

核心功能

三个工具

工具 作用
remind_later(note, delay_seconds \| at, mode?) 定一条一次性唤醒。默认 mode=wake 到点开一轮 agent;mode=text 原样发 note、不经过模型
remind_list() 查看本会话未触发项及最近错过项
remind_cancel(id) 取消一条

到点流程(概要)

  1. 复查聊天是否仍在 WeChatAgent 白名单。
  2. wake 模式:agent.followup() 叫醒会话,抓取本轮正文(去掉 RESPOND: 前缀)后发微信。
  3. 若无正文、本轮报错或超时 120 秒,退化为发送 ⏰ note,保证到点有反馈。
  4. text 模式:直接投递 note。

状态与边界(摘自文档):待触发列表在 $DSH_HOME/wechat-wake.json,进程重启后重新挂表;关进程期间 10 分钟内到点的可补发,更早的记为 missed;每会话最多 12 条待触发,单条最长 7 天;两次发送至少间隔 1.5 秒;聊天移出白名单则记 skipped 不发。只能唤醒仍存活的会话,冷会话退化为静态文本。

安装与启用

通过 dsh profile 安装

README 给出的命令如下(会读取包内 dsh.bundle.patch):

dsh plugin --profile web add github:heyikai060215-jpg/dsh-wechat-wake

说明:已抓取资料中 package.json 的 repository.url 指向 heyikai060215-jpg/dsh-wechat-wake;SkillHub 条目为 epsilonH-eps/dsh-wechat-wake。安装以 README 原文命令为准;若 fork 与目录不一致,以你实际添加的 GitHub 源为准。

手动安装(与其它 dsh-mod 插件相同)

  1. 将仓库放到例如 D:/dsh-mod/dsh-wechat-wake。
  2. 在 profiles/<profile>/package.json 的 dependencies 增加 "dsh-wechat-wake": "link:D:/dsh-mod/dsh-wechat-wake",在 dsh.profile.bundles 增加 "dsh-wechat-wake"。
  3. 将 profiles/<profile>/node_modules/dsh-wechat-wake 链到该目录。
  4. 重启 DSH,或改动 profile 的 package.json 触发热加载。
  5. 在 WeChatAgent 为目标聊天勾选三个 remind_* 工具。

装完自检(只读,不发消息)

node tools/selftest.mjs wechat:private:<聊天号>

也可直接传入会话 id,由脚本反查聊天键:

node tools/selftest.mjs social-xxxxxxxx

通道齐全时会打印 reader / hook / chat / target / mode 并返回 0;缺项返回 1。示例输出字段包括 reader、hook、chat、mode: "social"、target 等。

典型用法

授权(必做)

插件不自行判断「哪个聊天能用」。在 WeChatAgent:

  • 界面:聊天 → 设置此聊天 → 能力与权限,勾选 remind_later、remind_list、remind_cancel。
  • 等价配置:config/wechatagent.json → wechat.dshAccess.chats["<聊天键>"].tools。

社交模式聊天勾选即可;助手模式聊天不要勾选本插件工具。

对话侧

用户可在微信里自然表达「几分钟后提醒我……」;agent 在已授权且工具可见时调用 remind_later。README 实测中模型曾选择 mode: "text",约 3 分钟后定时器触发(误差 0.5 秒内),投递后微信回执 confirmed: true。mode: "wake" 走 followup + 抓 turn/end 正文,文档建议首次使用 wake 任务时单独试一次。

依赖的既有通道

插件不改微信本体、不改 WeChatAgent 源码,依赖:

  1. state/accounts/<账号>/dsh-sessions.json 的 conversations(会话与聊天映射)。
  2. state/wechat-io-config.json 的 reader 地址与令牌。
  3. state/hook/native-token.txt 与本地 hook 的 SendTextMsg。

与 dsh-tts-bridge-wechatagent-bridge 发语音条使用的是同一套 hook 路径。

适用场景与注意

适合:已在 DSH + WeChatAgent 下跑微信私聊、社交模式、人格或陪聊类会话,需要会话内定时提醒或到点主动发言,且愿意按聊天逐项授权工具。

不适合或需换方案:助手模式定时应使用原生 schedule_create;工作群或高敏感聊天应先在无人打扰的私聊里验证。

运行与安全:插件在本机 DSH 进程权限下运行,会通过 hook 真实发送微信消息。安装前应阅读仓库源码与 MIT 许可证,自行评估微信风控、发错人、发错时间等风险。直发 hook 绕过 WeChatAgent 发送队列,失败只记日志不重试;微信升级导致 hook 偏移变化时发送可能失败。

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

卸载

  1. 从 profiles/<profile>/package.json 删除 dsh-wechat-wake 依赖及 bundles 条目。
  2. 删除 profiles/<profile>/node_modules/dsh-wechat-wake 链接。
  3. 删除仓库目录,并取消 WeChatAgent 中三个工具勾选。
  4. 可选:删除 $DSH_HOME/wechat-wake.json。

dsh-wechat-wake 补的是社交模式下 schedule 与 bridge 定时投递的缺口:三个 remind_* 工具、WeChatAgent 按聊天授权、到点 followup 或直发并落进当前聊天。进一步了解可查看 SkillHub 目录页 与 GitHub 仓库。

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

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

小夜