🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

企微智能桥 MHfire/dsh-im-bridge

DeepSeek Harness
MHfire24 天前有提交已提供中文文档扫描:含敏感能力

即时通讯渠道企微、飞书等 ⇄ DeepSeek Harness Agent 桥接

36.3/100
综合分
4
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/12 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add MHfire/dsh-im-bridge
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · tool
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/10/23·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 24 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-im-bridge(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 20:27:17

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量
查看扫描证据(共 48 处,展示前 36 条)
  • 读取本地文件
    bridge.js:26
    const config = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf8'));
  • 执行外部命令来自配置/变量
    bridge.js:49
    const child = spawn(process.execPath, args, {
  • 读取本地文件
    bridge.js:167
    if (!fs.existsSync(DSH_CLI)) {
  • 读取本地文件
    bridge.js:171
    if (!fs.existsSync(path.join(process.env.USERPROFILE || '', '.dsh', 'profiles', 'headless'))) {
  • 读取本地文件
    bridge.js:175
    if (!fs.existsSync(HEADLESS_PATCH)) {
  • 读取本地文件
    plugin/lib/index.js:121
    size = statSync(real).size;
  • 读取本地文件
    plugin/lib/index.js:132
    buffer = readFileSync(real);
  • 读取密钥环境变量
    plugin/lib/index.js:6567
    if (node_process.env.LOG_TOKENS) console.log("|", cst.prettyToken(source));
  • 写入本地文件
    plugin/lib/index.js:7582
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    plugin/lib/index.js:7676
    mkdirSync(dest, { recursive: true });
  • 读取本地文件
    plugin/lib/index.js:7680
    if (existsSync(skillDir)) rmSync(skillDir, {
  • 删除本地文件
    plugin/lib/index.js:7680
    if (existsSync(skillDir)) rmSync(skillDir, {
  • 写入本地文件
    plugin/lib/index.js:7689
    mkdirSync(dirname(target), { recursive: true });
  • 写入本地文件
    plugin/lib/index.js:7690
    writeFileSync(target, entry.data);
  • 读取本地文件
    plugin/lib/index.js:7830
    const raw = readFileSync(pkgJsonPath, "utf8");
  • 读取本地文件
    plugin/lib/index.js:7835
    return existsSync(binJs) ? binJs : void 0;
  • 读取本地文件
    plugin/lib/index.js:7853
    for (const name of names) if (existsSync(join(dir, name))) return true;
  • 写入本地文件
    plugin/lib/index.js:7887
    mkdirSync(shimDir, { recursive: true });
  • 写入本地文件
    plugin/lib/index.js:7889
    writeFileSync(join(shimDir, "wecom-cli.cmd"), `@echo off\r\necho ${WECOM_CLI_SHIM_DENY_MESSAGE}\r\nexit /b 1\r\n`, "utf8");
  • 读取本地文件
    plugin/src/index.ts:471
    return readFileSync(config.personaFile, 'utf8')
  • 读取本地文件
    plugin/src/index.ts:480
    return stripLeadingHashComments(readFileSync(file, 'utf8'))
  • 读取本地文件
    plugin/src/reply-images.ts:160
    size = statSync(real).size
  • 读取本地文件
    plugin/src/reply-images.ts:171
    buffer = readFileSync(real)
  • 写入本地文件
    plugin/src/wecom-cli.ts:323
    mkdirSync(dir, { recursive: true })
  • 写入本地文件
    plugin/src/wecom-cli.ts:426
    mkdirSync(dest, { recursive: true })
  • 读取本地文件
    plugin/src/wecom-cli.ts:430
    if (existsSync(skillDir)) rmSync(skillDir, { recursive: true, force: true })
  • 删除本地文件递归
    plugin/src/wecom-cli.ts:430
    if (existsSync(skillDir)) rmSync(skillDir, { recursive: true, force: true })
  • 写入本地文件
    plugin/src/wecom-cli.ts:438
    mkdirSync(dirname(target), { recursive: true })
  • 写入本地文件
    plugin/src/wecom-cli.ts:439
    writeFileSync(target, entry.data)
  • 读取本地文件
    plugin/src/wecom-cli.ts:608
    const raw = readFileSync(pkgJsonPath, 'utf8')
  • 读取本地文件
    plugin/src/wecom-cli.ts:613
    return existsSync(binJs) ? binJs : undefined
  • 读取本地文件
    plugin/src/wecom-cli.ts:633
    if (existsSync(join(dir, name))) return true
  • 写入本地文件
    plugin/src/wecom-cli.ts:674
    mkdirSync(shimDir, { recursive: true })
  • 写入本地文件
    plugin/src/wecom-cli.ts:676
    writeFileSync(
  • 读取本地文件
    plugin/src/wecom-cli.ts:998
    if (!existsSync(dir)) return []
  • 读取本地文件
    plugin/src/wecom-cli.ts:1001
    entries = readdirSync(dir, { withFileTypes: true })
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

1 张 · 点击查看大图

功能亮点

  • 企微飞书渠道桥接

README

由 DeepSeek 最新模型翻译生成
dsh-im-bridge 企业微信智能机器人 ⇄ DeepSeek Harness Agent 桥接 通过企业微信智能机器人的 WebSocket 长连接,把企业微信消息交给 DeepSeek Harness 的 Agent 处理,再将结果流式回复到微信。 📦 项目简介 本仓库提供两种运行形态: | 形态 | 说明 | 状态 | | plugin/ | DSH 插件(推荐):挂进 dsh profile,进程内创建 Agent,按企微窗口拆分持久会话,会话在 Web GUI 实时可见,含 Settings 配置卡片 | ✅ 推荐 | | bridge.js | 旧版独立脚本:每条消息 spawn dsh --profile headless 子进程(无状态) | 保留作回退 | ✨ 特性 - ✅ WebSocket 直连:无需公网 URL、无需消息加解密、无需 IP 白名单 - ✅ 进程内 Agent:不 spawn 子进程,会话与 GUI 同进程注册,实时可见、可续聊 - ✅ 按企微窗口拆分会话:单聊一人一条,同一群共用一条;同一个人的私聊和群聊互不串上下文 - ✅ GUI 标题带渠道前缀:侧栏为「企微·私聊/群」+ 第一句用户话;群聊入站去掉开头的 @机器人
展开完整文档(README 剩余 1 节)
dsh-im-bridge

企业微信智能机器人 ⇄ DeepSeek Harness Agent 桥接

通过企业微信智能机器人的 WebSocket 长连接,把企业微信消息交给 DeepSeek Harness 的 Agent 处理,再将结果流式回复到微信。

📦 项目简介

本仓库提供两种运行形态:

| 形态 | 说明 | 状态 |
| plugin/ | DSH 插件(推荐):挂进 dsh profile,进程内创建 Agent,按企微窗口拆分持久会话,会话在 Web GUI 实时可见,含 Settings 配置卡片 | ✅ 推荐 |
| bridge.js | 旧版独立脚本:每条消息 spawn dsh --profile headless 子进程(无状态) | 保留作回退 |

✨ 特性

- ✅ WebSocket 直连:无需公网 URL、无需消息加解密、无需 IP 白名单
- ✅ 进程内 Agent:不 spawn 子进程,会话与 GUI 同进程注册,实时可见、可续聊
- ✅ 按企微窗口拆分会话:单聊一人一条,同一群共用一条;同一个人的私聊和群聊互不串上下文
- ✅ GUI 标题带渠道前缀:侧栏为「企微·私聊/群」+ 第一句用户话;群聊入站去掉开头的 @机器人
- ✅ 归档后开新会话:在 GUI 归档该条后,下一条消息静默用 wecom-<hash>-2 开新会话,旧会话不再写入
- ✅ 可选企微办公能力:内置 @wecom/cli;开启后办公 1:1 通过门控工具 wecom_cli 查通讯录、文档、日程等(须非空 wecomCli.allowFrom;群聊与 GUI 看不到该工具)
- ✅ 人设可定制:包内中/英默认人设跟 Settings 语言;可用 profile 同目录 persona.md 覆盖
- ✅ Settings 配置卡:凭证、白名单、超时、提示语、模型覆盖可在 GUI 填写;热字段下一轮消息生效,改凭证须重启才连 WebSocket
- ✅ 流式动画 + 执行简报:处理中显示阶段状态/进度条/剩余估算,完成附耗时简报
- ✅ 回复里的工作区 PNG:最终回复中的 说明 会在文字之后作为独立图片消息发出
- ✅ 自动认证 / 心跳保活 / 断线指数退避重连(SDK 内置)
- ✅ 同一企微窗口内消息串行处理,防并发踩上下文

🏗️ 架构

flowchart LR
U[企业微信用户] -- WebSocket --> B[dsh-im-bridge]
B -->|plugin 形态| A1[进程内 Agentagents.create + 按窗口会话]
B -->|bridge.js 形态| A2[dsh --profile headless每条消息独立进程]
A1 --> S[(会话/设置GUI 实时可见)]
A2 --> S
B -- replyStream 流式 Markdown --> U

📑 目录

- 兼容的 DeepSeek Harness 版本
- 快速开始
- Settings 插件配置卡
- 配置说明
- 人设提示词
- 旧版 bridge.js
- 已知边界
- 安全说明
- 许可证

📌 兼容的 DeepSeek Harness 版本

DeepSeek Harness 仍是 developer preview,对外置插件没有 semver 兼容承诺。插件 0.4.4 按实际调用的 API 对齐已发布 tag(细则见 plugin/README.md):

| DSH | 本仓库插件 |
| 0.2.0-rc.2 | 可适配(对照开发与验证的一线) |
| 0.1.2-rc.1 及更早 | 不可适配。这些版本没有 configForms、plugins.item,也没有这套 volatile 表单 |
| 未打 tag 的 HEAD | 未保证。升级 dsh 后请再验插件页卡片和企微连线 |

建议把 dsh 钉在 0.2.0-rc.2,例如 npx @deepseek-ai/dsh@0.2.0-rc.2 web,不要只跑浮动的 latest。旧版 bridge.js 只要求本机有 dsh CLI,不受上表约束。

🚀 快速开始

前提

- Node.js 18+(旧版 bridge.js 需要;插件随 dsh 运行)
- 已安装 DeepSeek Harness 0.2.0-rc.2(见上一节)

1. 企业微信侧:创建智能机器人(一次性)

1. 登录企业微信管理后台
2. 应用管理 → 智能机器人 → 创建智能机器人,填写名称/头像
3. 记录凭证(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.4.4

2) 在 $DSH_HOME/profiles/web/cordis.patch.yml 中补密钥(其余为 bundle 默认,可按需覆盖)
- id: im-bridge
config:
botId: "<你的 BotID>" secret: "<你的 Secret>" 可选:workspace / personaFile 等

3) 重启 dsh 进程(建议钉版本,如 npx @deepseek-ai/dsh@0.2.0-rc.2 web)
4) 也可在侧栏 插件 → 官方 → 企业微信桥接 填写 botId/secret 后重启
5) 在企业微信给机器人发消息即可使用

从源码 / 本地开发(备选)

dsh plugin --profile web add <本仓库路径>/plugin

3. 验证

企业微信收到机器人回复;同时该会话出现在 DSH Web GUI 的会话列表中(可实时查看、续聊)。

🧩 Settings 插件配置卡

安装插件并启动 dsh web 后,打开侧栏 插件 → 官方 → 企业微信桥接。保存 写入该 profile 的 cordis.patch.yml。

| 卡片项 | 对应配置 | 保存后 |
| Bot ID / Secret | botId / secret | 徽章变为「已配置」;须重启进程 才会连 WebSocket。留空再保存不会清空已存凭证 |
| 允许的发送者 userid | allowFrom | 下一轮消息生效 |
| 单任务超时(秒) | agentTimeoutSec | 下一轮消息生效 |
| 开始处理时的占位提示 | startHint | 下一轮消息生效 |
| 非白名单拒绝文案 / 欢迎语 | deniedMessage / welcomeMessage | 下一轮消息生效 |
| 企微专用 provider / model | provider / model | 只影响之后新建的企微窗口会话;须两项都填才覆盖 |

workspace、人设、thinking 等不在卡片上,见下表或 plugin/README.md。

⚙️ 配置说明

复制 config.example.json 为 config.json 并填写(config.json 含密钥,不入库):

| 字段 | 说明 |
| botId / secret | 企业微信智能机器人凭证 |
| workspace | 智能体的工作目录(会话 cwd) |
| dshCli | dsh CLI 的入口脚本路径(仅旧版 bridge.js 需要) |
| agentTimeoutSec | 单任务最长执行时间(秒) |
| provider / model | 企微专用模型;两者都填才覆盖 GUI 的 agent-default-model |
| allowFrom | 允许的发送者 userid 列表;留空 [] = 允许所有人 |
| startHint | 开始处理时的占位提示语 |
| thinking | 流式动画:工具 / 模型推理与输出阶段 / 时间轴兜底(见 plugin/README.md) |
| deniedMessage / welcomeMessage | 拒绝文案 / 进入会话欢迎语 |

patch 字段(旧版 bridge.js 专用,可选):指向工作区的 --patch 覆盖层文件(默认 workspace/headless.patch.yml,本地配置文件,不在本仓库内)。示例配置已移除该字段,需要时自行添加,例如 "patch": "headless.patch.yml"。

插件字段也可在侧栏 插件 → 官方 → 企业微信桥接 编辑(见上一节),或写在 profile patch。完整字段说明见 plugin/README.md。

🤖 人设提示词(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 入站仅处理文本(图片/语音/文件消息会忽略);出站可把回复 Markdown 中的工作区 PNG 上传后作为独立图片发出(见 plugin/README.md)
- 旧版 bridge.js 在受限沙箱内测试可能报 spawn EPERM,请以普通方式启动
- 旧版每条消息起一个 agent 进程,开销较高;插件形态无此问题
- agent 输出超过约 20KB 会截断(企微 replyStream 上限 20480 字节)
- 可选 wecom-cli 办公能力:wecomcli- 与门控工具 wecom_cli 只注入办公单聊智能体;PATH 上的 wecom-cli 一律拒绝;群聊不注入办公层;工作区残留的 wecomcli- 仍会泄漏给 GUI;凭证在工作区 .dsh/wecom-cli(须 gitignore)、无 GUI 审批;企微通道禁止 ask_user_question(细则见 plugin/README.md)

🔒 安全说明

- config.json、plugin/persona.md 已被 .gitignore 排除,请勿强制添加或发布
- 发布到公开仓库前,请检查 docs/、示例文件等是否含有环境专属信息

📄 许可证

MIT

🔗 参考

- 📚 企业微信渠道接入说明
- 企业微信智能机器人官方 SDK(文档副本:docs/aibot-node-sdk-README.md)
- DeepSeek Harness
预览分享卡片长什么样 ↓MHfire/dsh-im-bridge
分享 · DeepSeek Harness Hub
MHfire/dsh-im-bridge

即时通讯渠道企微、飞书等 ⇄ DeepSeek Harness Agent 桥接

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部