前言¶
用 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:
- Settings UI 的「微信桥接」页签
/wechat斜杠命令settings.yaml的wechat-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(防挂起),问题与选项改为纯文本,用户以普通微信消息回复。
安装与启用¶
前置条件¶
- 已安装 DeepSeek Harness,
dsh web可运行。 - 一个具备 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.yaml 的 wechat-bridge: 段,编辑保存即热生效:
wechat-bridge:
enabled: true
mediaEnabled: true
defaultProvider: ''
defaultModel: ''
allowedPeers: ''
notifyEnabled: true
enabled:桥接总开关。mediaEnabled:是否接收入站媒体。defaultProvider、defaultModel:桥接会话使用的 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 里跑,人在外面时用微信发消息、收回复和会话简讯。
几点注意:
- 插件以当前 dsh 进程权限运行,安装前建议阅读插件源码并确认许可证(本项目为 MIT)。
allowedPeers是默认拒绝的闸门:留空 = 拒绝所有人,而不是放行所有人。- 回复分片至多 4096 字符 × 5 段,超出部分会被截断。
ask_user_question等交互式选项工具在微信会话中不可用,交互改为纯文本一问一答。- 如果之前用过旧的 weixin-bridge,数据目录与设置段会一次性自动更名为
wechat-*。
小结¶
这个插件把微信私聊变成 DSH agent 的输入输出通道:白名单控制谁能驱动会话,每日会话保持隔离,轮询结构上崩溃安全,通知机制补齐了会话进展的触达。装好插件、扫码绑定、发一条消息,三步就能跑通。
- GitHub:https://github.com/NattoCB/dsh-plugin-wechat-bridge
- 社区目录页:https://www.skillhub.cn/plugins/NattoCB/dsh-plugin-wechat-bridge