dsh-plugin-wechat-bridge:把微信私聊桥接进 DSH agent 会话

前言

用 DSH 跑 agent 会话,入口通常是 dsh web 的网页 GUI。人坐在电脑前没问题,一旦离开工位,既不方便给会话发消息,也看不到任务跑到哪一步。微信私聊是手机上常开的窗口——如果微信消息能直接驱动 agent、回复再发回来,就等于多了一个随身入口。

dsh-plugin-wechat-bridge 做的就是这件事:把微信(ilink bot)私聊消息桥接进 DSH agent 会话,回复以纯文本分片流式发回。下面按功能、安装、配置、使用的顺序介绍。

这是什么

dsh-plugin-wechat-bridge 是 NattoCB 维护的 DSH bundle 插件,许可证为 MIT。装进 web profile 后,扫码绑定一个具备 ilink bot 权限(bot_type=3)的微信账号,之后在微信里发私聊消息就能驱动 agent,回答以纯文本发回。

虽然入口换到了微信,上下文与 GUI 是等价的:每日会话注入 ~/.dsh/AGENTS.md 全文、可用 skill 目录,并挂载与 GUI 相同的 agent preset。

核心功能

消息桥接与每日会话

  • 支持多账号轮询微信 ilink bot API(getupdates),私聊消息驱动 DSH agent 会话。
  • 回复以纯文本分片发回:每片至多 4096 字符、至多 5 段,超出截断。
  • 每人每天一个会话:按本机时区在本地零点轮换,当天首条入站消息惰性创建。

运行时热插拔

启停有三种独立方式,改动实时生效,无需重启 dsh web

  1. Settings UI 的「微信桥接」页签
  2. /wechat 斜杠命令
  3. settings.yamlwechat-bridge:

单向会话通知

notifyEnabled 默认开启:DSH 内任何顶层会话的每个 turn 结束,都会向白名单微信推送一条固定模板简讯。三点行为值得知道:

  • 支持按工作区静音。
  • token 失效期间的通知自动暂存(至多 20 条、24 小时),下次入站消息后自动合并补发。
  • 只推送给至少发过一次消息的白名单联系人(协议需要 context_token),且不依赖当日微信会话是否存在。

崩溃安全与持久化

  • 跨进程轮询锁:~/.dsh/wechat-bridge/poll.lock
  • 消息按聊天串行处理,入站按 message_id 去重(至多处理一次)。
  • 损坏的会话日志被隔离为 .corrupt-<ts> 并自愈重建。
  • 账号、context_token、轮询偏移持久化在单个原子 JSON(~/.dsh/wechat-bridge/state.json),无需数据库。

白名单与媒体

  • 入站白名单 fail-closed:allowedPeers 留空即拒绝所有人。
  • 出站媒体:agent 调用 wechat_send_file 工具,把图片/视频/文件上传微信 CDN 发给当前对话人。
  • 入站媒体:图片/文件/视频/语音自动从 CDN 下载并 AES 解密,存入 WeChatSpace/inbox/<日期>/;模型声明图像输入时,图片以原生 image 内容附带。
  • ask_user_question 等交互式选项工具在微信会话中被 deny(防挂起),问题与选项改为纯文本,用户以普通微信消息回复。

安装与启用

前置条件

  1. 已安装 DeepSeek Harness,dsh web 可运行。
  2. 一个具备 ilink bot 权限(bot_type=3)的微信账号。

安装

一条命令装入 web profile:

dsh plugin --profile web add github:NattoCB/dsh-plugin-wechat-bridge

也可以手动安装:把插件复制到 ~/.dsh/profiles/web/node_modules/dsh-plugin-wechat-bridge,在 profile manifest 的 dependencies 里添加 file:<SRC>,并在 dsh.profile.bundles 注册。

注意:不要把 profile 树外的包符号链接进 ~/.dsh/profiles/node_modules(ESM 限制),应复制到 profile 下;file: 依赖加 dsh.profile.bundles 条目是正式注册方式。

扫码绑定

网页方式:Settings →「微信桥接」页签 →「扫码绑定账号」→ 页面渲染二维码 → 每 2 秒轮询扫码状态 → 微信确认后自动保存账号并启用。

命令行方式,先在任意 DSH 会话执行:

/wechat qrlogin

发起登录后返回 sessionId,再用 /wechat qrstatus <sessionId> 轮询状态,confirmed 时保存账号并启用。

验证

经过上面的步骤,给机器人发一条私聊消息(如「今天有什么安排」),agent 会像在 GUI 里一样回答,回复以纯文本发回。

配置

运行开关集中在 ~/.dsh/settings.yamlwechat-bridge: 段,编辑保存即热生效:

wechat-bridge:
  enabled: true
  mediaEnabled: true
  defaultProvider: ''
  defaultModel: ''
  allowedPeers: ''
  notifyEnabled: true
  • enabled:桥接总开关。
  • mediaEnabled:是否接收入站媒体。
  • defaultProviderdefaultModel:桥接会话使用的 provider 与 model。
  • allowedPeers:入站白名单,填机器人内部联系人 ID,留空即拒绝所有人。
  • notifyEnabled:单向会话通知开关。

allowedPeers 填的不是微信号,也不是昵称,而是微信机器人协议的内部联系人 ID(一串奇怪字符)。获取方式:让对方给机器人发一条消息,机器人会自动回复该 ID,该 ID 也会出现在 Settings 页签的 chip 列表里。

常用命令

斜杠命令在任意 DSH 会话可用:

/wechat status    # 查看状态
/wechat enable    # 启用
/wechat disable   # 停用
/wechat accounts  # 列出已配置账号
/wechat qrlogin   # 扫码登录

故障排查:errcode -14

getupdates 返回 errcode -14(session timeout)表示 bot 会话在服务端过期:轮询暂停 60 分钟,Settings 显示红字警告,恢复方式是重新扫码绑定。

context_token 过期时,通知发送失败会进入暂存队列(至多 20 条、24 小时),下次入站消息后自动合并补发。

适用场景与注意

适合已经把 DSH 当日常工作台的人:任务在 dsh web 里跑,人在外面时用微信发消息、收回复和会话简讯。

几点注意:

  1. 插件以当前 dsh 进程权限运行,安装前建议阅读插件源码并确认许可证(本项目为 MIT)。
  2. allowedPeers 是默认拒绝的闸门:留空 = 拒绝所有人,而不是放行所有人。
  3. 回复分片至多 4096 字符 × 5 段,超出部分会被截断。
  4. ask_user_question 等交互式选项工具在微信会话中不可用,交互改为纯文本一问一答。
  5. 如果之前用过旧的 weixin-bridge,数据目录与设置段会一次性自动更名为 wechat-*

小结

这个插件把微信私聊变成 DSH agent 的输入输出通道:白名单控制谁能驱动会话,每日会话保持隔离,轮询结构上崩溃安全,通知机制补齐了会话进展的触达。装好插件、扫码绑定、发一条消息,三步就能跑通。

  • GitHub:https://github.com/NattoCB/dsh-plugin-wechat-bridge
  • 社区目录页:https://www.skillhub.cn/plugins/NattoCB/dsh-plugin-wechat-bridge
羽毛球分组比赛记分
小程序二维码

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

小夜