中文 | English
dsh-im-bridge
企业微信智能机器人 ⇄ DeepSeek Harness Agent 桥接
通过企业微信智能机器人的 WebSocket 长连接,把企业微信消息交给 DeepSeek Harness 的 Agent 处理,再将结果流式回复到微信。
📦 项目简介
本仓库提供两种运行形态:
| 形态 | 说明 | 状态 |
|---|---|---|
plugin/ |
DSH 插件(推荐):挂进 dsh profile,进程内创建 Agent,per-sender 持久会话,会话在 Web GUI 实时可见,含 Settings 配置卡片 | ✅ 推荐 |
bridge.js |
旧版独立脚本:每条消息 spawn dsh --profile headless 子进程(无状态) |
保留作回退 |
✨ 特性
- ✅ WebSocket 直连:无需公网 URL、无需消息加解密、无需 IP 白名单
- ✅ 进程内 Agent:不 spawn 子进程,会话与 GUI 同进程注册,实时可见、可续聊
- ✅ per-sender 持久会话:同一企业微信用户复用同一会话,有上下文记忆
- ✅ 人设可定制:包内中/英默认人设跟 Settings 语言;可用 profile 同目录
persona.md覆盖 - ✅ 配置热生效:
allowFrom/agentTimeoutSec/startHint可在 Settings 插件配置页或settings.yaml修改,无需重启 - ✅ 流式动画 + 执行简报:处理中显示阶段状态/进度条/剩余估算,完成附耗时简报
- ✅ 自动认证 / 心跳保活 / 断线指数退避重连(SDK 内置)
- ✅ 同一发送者消息串行处理,防并发错乱
🏗️ 架构
flowchart LR
U[企业微信用户] -- WebSocket --> B[dsh-im-bridge]
B -->|plugin 形态| A1[进程内 Agent<br/>agents.create + per-sender 会话]
B -->|bridge.js 形态| A2[dsh --profile headless<br/>每条消息独立进程]
A1 --> S[(会话/设置<br/>GUI 实时可见)]
A2 --> S
B -- replyStream 流式 Markdown --> U
📑 目录
🚀 快速开始
前提
- Node.js 18+(旧版
bridge.js需要;插件随 dsh 运行) - 已安装 DeepSeek Harness
1. 企业微信侧:创建智能机器人(一次性)
- 登录企业微信管理后台
- 应用管理 → 智能机器人 → 创建智能机器人,填写名称/头像
- 记录凭证(Secret 只显示一次,立即保存):
BotID与Secret
2. 安装插件(推荐:npm 包)
# 1) 从 npm 装进目标 profile(如 web)
dsh plugin --profile web add @mhfire/dsh-im-bridge
# 或钉版本:dsh plugin --profile web add @mhfire/dsh-im-bridge@0.1.2
# 2) 在 $DSH_HOME/profiles/web/cordis.patch.yml 中补密钥(其余为 bundle 默认,可按需覆盖)
# - id: im-bridge
# config:
# botId: "<你的 BotID>"
# secret: "<你的 Secret>"
# # 可选:workspace / personaFile 等
# 3) 重启 dsh 进程(如 dsh web / pnpm dsh web)
# 4) 在企业微信给机器人发消息即可使用
从源码 / 本地开发(备选)
dsh plugin --profile web add <本仓库路径>/plugin
3. 验证
企业微信收到机器人回复;同时该会话出现在 DSH Web GUI 的会话列表中(可实时查看、续聊)。
⚙️ 配置说明
复制 config.example.json 为 config.json 并填写(config.json 含密钥,不入库):
| 字段 | 说明 |
|---|---|
botId / secret |
企业微信智能机器人凭证 |
workspace |
Agent 的工作目录(会话 cwd) |
dshCli |
dsh CLI 的入口脚本路径(仅旧版 bridge.js 需要) |
agentTimeoutSec |
单任务最长执行时间(秒) |
allowFrom |
允许的发送者 userid 列表;留空 [] = 允许所有人 |
startHint |
开始处理时的占位提示语 |
thinking |
流式思考动画素材(phases / spin / eggs 等,见 plugin/README.md) |
deniedMessage / welcomeMessage |
拒绝文案 / 进入会话欢迎语 |
patch字段(旧版bridge.js专用,可选):指向工作区的--patch覆盖层文件 (默认workspace/headless.patch.yml,本地配置文件,不在本仓库内)。示例配置已移除该字段, 需要时自行添加,例如"patch": "headless.patch.yml"。
插件运行时,allowFrom / agentTimeoutSec / startHint 可在 Settings → 插件配置 页面编辑,
写入 settings.yaml 热生效,也可直接修改 profile patch。
🤖 人设提示词(persona.md)
优先级:personaFile → persona 字符串 → 包内默认(按 Host locale.preference 选中/英,未设置则中文)。
- 推荐:在
$DSH_HOME/profiles/<name>/与cordis.patch.yml同目录放置persona.md,用绝对路径配置personaFile(覆盖不跟语言切换) - 默认:
plugin/persona.default.md/plugin/persona.default.en.md;模板:plugin/persona.example.md - 含环境凭据的人设文件不入库,请勿提交
- 支持
{{model}}/{{cwd}}占位符(未知变量会直接报错)
🛠️ 旧版 bridge.js(legacy)
cd <本仓库路径>
npm install
node bridge.js
看到 [bridge] 认证成功, 等待消息... 即可使用。每条消息会 spawn 一个独立的
dsh --profile headless 进程(无状态);config.json 在启动时读取一次,改动需重启。
⚠️ 已知边界
- v1 仅处理文本消息(图片/语音/文件消息会忽略,SDK 支持但未接入)
- 旧版
bridge.js在受限沙箱内测试可能报spawn EPERM,请以普通方式启动 - 旧版每条消息起一个 agent 进程,开销较高;插件形态无此问题
- agent 输出超过约 20KB 会截断(企微 replyStream 上限 20480 字节)
🔒 安全说明
config.json、plugin/persona.md已被.gitignore排除,请勿强制添加或发布- 发布到公开仓库前,请检查
docs/、示例文件等是否含有环境专属信息
📄 许可证
🔗 参考
- 📚 企业微信渠道接入说明
- 企业微信智能机器人官方 SDK(文档副本:
docs/aibot-node-sdk-README.md) - DeepSeek Harness
No comments yet. Be the first to write one.