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

VoceChat 会话桥 AdRainty/dsh-vocechat-bridge

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

在 VoceChat 聊天中收发消息,直接使用已有会话

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add AdRainty/dsh-vocechat-bridge
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · chat
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 38 处,展示前 35 条)
  • 发起网络请求
    client/index.js:23
    const response=await fetch(API,{credentials:'same-origin',signal:controller.signal,
  • 执行外部命令来自配置/变量
    src/audio.ts:134
    execFile(program, args, { timeout: timeoutMs, signal, windowsHide: true, maxBuffer: 1024 * 1024, encoding: 'utf8' }, (error, stdout) => {
  • 发起网络请求
    src/audio.ts:298
    response = await fetch(this.endpoint, {
  • 写入本地文件
    src/bridge.ts:69
    await mkdir(this.config.tempDir,{recursive:true,mode:0o700});
  • 写入本地文件
    src/bridge.ts:322
    await mkdir(dir,{recursive:true,mode:0o700});
  • 删除本地文件递归
    src/bridge.ts:349
    await rm(dir,{recursive:true,force:true});
  • 写入本地文件
    src/bridge.ts:363
    await writeFile(localPath,bytes.bytes,{mode:0o600});
  • 删除本地文件递归
    src/bridge.ts:416
    }finally{await rm(dir,{recursive:true,force:true});this.activeTempDirs.delete(dir);}
  • 写入本地文件
    src/bridge.ts:428
    const dir=join(this.config.tempDir,`job-${randomUUID()}`);this.activeTempDirs.add(dir);await mkdir(dir,{recursive:true,mode:0o700});
  • 写入本地文件
    src/bridge.ts:429
    try{const file=join(dir,'outgoing.media');await writeFile(file,bytes,{mode:0o600});await probeAudio({path:file,name,mime},{maxBytes:this.config.maxMed
  • 删除本地文件递归
    src/bridge.ts:430
    finally{await rm(dir,{recursive:true,force:true});this.activeTempDirs.delete(dir);}
  • 读取本地文件
    src/bridge.ts:443
    for(const entry of await readdir(this.config.tempDir,{withFileTypes:true})) {
  • 删除本地文件递归
    src/bridge.ts:447
    try{if(Date.now()-(await stat(p)).mtimeMs>this.config.retentionMs)await rm(p,{recursive:true,force:true});}
  • 读取本地文件
    src/bridge.ts:447
    try{if(Date.now()-(await stat(p)).mtimeMs>this.config.retentionMs)await rm(p,{recursive:true,force:true});}
  • 读取本地文件
    src/dsh.ts:203
    if ((await stat(item.localPath)).size > maxBytes) throw new Error('ATTACHMENT_TOO_LARGE');
  • 读取本地文件
    src/dsh.ts:204
    const data = new Uint8Array(await readFile(item.localPath));
  • 发起网络请求
    src/senders.ts:40
    const requested = Promise.resolve().then(() => this.request(id, signal)).then(value => {
  • 读取本地文件
    src/settings.ts:27
    try { raw=JSON.parse(await readFile(this.filename,'utf8')); }
  • 写入本地文件
    src/settings.ts:44
    await mkdir(dirname(this.filename),{recursive:true,mode:0o700});
  • 写入本地文件
    src/settings.ts:46
    try { await writeFile(temporary,JSON.stringify({version:1,values})+'\n',{mode:0o600});await rename(temporary,this.filename); }
  • 写入本地文件
    src/settings.ts:46
    try { await writeFile(temporary,JSON.stringify({version:1,values})+'\n',{mode:0o600});await rename(temporary,this.filename); }
  • 删除本地文件
    src/settings.ts:47
    finally { await rm(temporary,{force:true}); }
  • 发起网络请求
    src/speech.ts:53
    response = await fetch(url, { method:'POST', headers:{ 'Content-Type':'application/json', ...(key ? { Authorization:`Bearer ${key}` } : {}) },
  • 读取本地文件
    src/state.ts:33
    const value = JSON.parse(await readFile(this.path, 'utf8'));
  • 写入本地文件
    src/state.ts:86
    await mkdir(dirname(this.path), {recursive:true,mode:0o700});
  • 写入本地文件
    src/state.ts:88
    await writeFile(tmp, JSON.stringify({version:2,jobs,batches}), {mode:0o600});
  • 写入本地文件
    src/state.ts:89
    await rename(tmp, this.path);
  • 发起网络请求
    src/vocechat.ts:83
    const response = await fetch(new URL(endpoint, this.baseUrl), { ...init, headers, signal, redirect: 'error' });
  • 发起网络请求
    src/vocechat.ts:98
    const result = await this.request(this.endpoint(destination, options.replyTo), {
  • 发起网络请求
    src/vocechat.ts:107
    const result = await this.request(`api/bot/user/${uid}?uid=${uid}`, { signal });
  • 发起网络请求
    src/vocechat.ts:119
    const result=await this.request(`api/bot/${destination.kind}/${destination.id}/messages?context=${limit}`,{signal},2*1024*1024);
  • 发起网络请求
    src/vocechat.ts:147
    const prepared = await this.request('api/bot/file/prepare', {
  • 发起网络请求
    src/vocechat.ts:158
    const uploaded = await this.request('api/bot/file/upload', { method: 'POST', body: form, signal: meta.signal });
  • 读取本地文件
    src/vocechat.ts:216
    const filename = await realpath(expandHomePath(value)).catch(() => { throw new Error('LOCAL_MEDIA_NOT_FOUND'); });
  • 读取本地文件
    src/vocechat.ts:217
    const roots = await Promise.all((this.options.allowedLocalRoots ?? []).map(root => realpath(expandHomePath(root)).catch(() => '')));
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-llm@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

连接 DeepSeek Harness(DSH) 与 VoceChat 的第三方插件。在 VoceChat 私聊或群聊中使用已有 DSH 会话,收发文字、图片、文件与语音,并保留该会话原有的人格、记忆和工具权限。

README

由 DeepSeek 最新模型翻译生成
dsh-vocechat-bridge 连接 DeepSeek Harness(DSH) 与 VoceChat 的第三方插件。在 VoceChat 私聊或群聊中使用已有 DSH 会话,收发文字、图片、文件与语音,并保留该会话原有的人格、记忆和工具权限。 当前版本:0.4.7 · 许可证:Apache-2.0 - GitHub - GitLab - 上游:DSH · VoceChat Server · VoceChat 文档 功能 - 双向消息:私聊、群聊、普通文本、Markdown、图片、文件、已有音频及组合发送。 - 语音:支持标准 OpenAI 协议和小米 MiMo 的识别与合成。语音输入同时附带真实转写与原始文件;识别失败会标明原因。 - 固定会话:绑定已有 DSH Session,按当前消息的来源回复;主动发送要求明确目标并受配置限制。 - 消息缓冲:按频道、会话、目标和发送者分别持久化防抖批次,支持忙碌排队、崩溃恢复与重复投递去重。 - 历史上下文:每批默认附带 6 条更早的同会话消息,另有私聊、群聊最近 N 条查询工具。 - 发送者显示名:当前消息、历史和引用同时提供 senderId 与 senderName,正文也标出名称和 UID;名字用于阅读,身份与路由仍使用 ID。
展开完整文档(README 剩余 1 节)
dsh-vocechat-bridge

连接 DeepSeek Harness(DSH) 与 VoceChat 的第三方插件。在 VoceChat 私聊或群聊中使用已有 DSH 会话,收发文字、图片、文件与语音,并保留该会话原有的人格、记忆和工具权限。

当前版本:0.4.7 · 许可证:Apache-2.0

- GitHub
- GitLab
- 上游:DSH · VoceChat Server · VoceChat 文档

功能

- 双向消息:私聊、群聊、普通文本、Markdown、图片、文件、已有音频及组合发送。
- 语音:支持标准 OpenAI 协议和小米 MiMo 的识别与合成。语音输入同时附带真实转写与原始文件;识别失败会标明原因。
- 固定会话:绑定已有 DSH Session,按当前消息的来源回复;主动发送要求明确目标并受配置限制。
- 消息缓冲:按频道、会话、目标和发送者分别持久化防抖批次,支持忙碌排队、崩溃恢复与重复投递去重。
- 历史上下文:每批默认附带 6 条更早的同会话消息,另有私聊、群聊最近 N 条查询工具。
- 发送者显示名:当前消息、历史和引用同时提供 senderId 与 senderName,正文也标出名称和 UID;名字用于阅读,身份与路由仍使用 ID。
- 引用上下文:入站 Reply 保留被引用消息 ID,补齐原文、附件和已有语音转写,作为背景与本次新消息一起交给 DSH;图片可直接进入模型的图片内容块。
- 设置页:在 DSH 的“设置 → VoceChat”配置连接、白名单和语音,控制启动、停止和重载。启用状态会保存,DSH 下次启动时自动恢复。

插件负责通信和媒体处理;人格、长期记忆与自主调度由 DSH 及相应插件管理。

运行要求

| 组件 | 要求 |
| DSH | 已在 0.2.1-rc.3 核实插件接口;升级宿主后应重新验证兼容性 |
| Node.js | 22.19.0 或更新版本 |
| VoceChat | 可使用 Bot API 和 Webhook;主要联调版本为 0.5.38 |
| FFprobe / FFmpeg | 压缩音频探测、格式转换或 MiMo 音频归一化时需要 |
| ASR / TTS 服务 | 可选;配置服务端点、模型和凭据引用后分别启用 |

桥接、ASR 和 TTS 默认关闭。默认绑定 127.0.0.1:8898;私聊和群聊白名单默认均为空,对应渠道不会被接收。

安装

从任一代码仓库克隆,然后在插件目录中构建并安装:

git clone https://github.com/AdRainty/dsh-vocechat-bridge.git
cd dsh-vocechat-bridge
npm ci --legacy-peer-deps
npm run build
dsh plugin --profile web add "$PWD"

源码仓库不保留 dist/;上述构建步骤会生成插件入口 dist/index.js。运行时所需的三个 @deepseek-ai/ peer dependency 由 DSH 宿主提供。

也可以直接下载 GitHub Releases 中的插件 tgz。发布包内含 dist/、客户端入口、配置和许可文件,无需自行编译;可通过 DSH 插件安装器安装。维护者运行 npm pack 可生成相同结构的 dsh-vocechat-bridge-0.4.7.tgz。

链接安装更新代码后,需要重载插件包才能替换已加载模块;宿主启用 HMR 时也可能自动重载。“保存并重载后端”用于应用连接配置,不负责重新导入代码。详见安装与运行。

首次配置

1. 在 VoceChat 创建 Bot,取得 Bot API Key 和 Bot 自身 UID。
2. 在 DSH 打开“设置 → VoceChat”,填写 VoceChat 基址、Bot UID、已有 Session ID,以及允许通信的私聊 UID / 群聊 GID。
3. 保存 Bot Key 到 DSH 凭据库。配置中的 botApiKeyRef 填引用名,例如 VOCECHAT_BOT_API_KEY,不要把真实 Key 写进 YAML、源码或仓库。
4. 使用已验证的访问令牌模式:在插件中开启“校验 Webhook 访问令牌”,保存专用令牌,并将 webhookSecretRef 指向相应凭据引用,例如 VOCECHAT_WEBHOOK_TOKEN。配置监听和反向代理后启动桥接。
5. 在 VoceChat 填写 Webhook:https://bridge.example.com/vocehook?secret=YOUR_WEBHOOK_TOKEN。把占位值替换为同一实际访问令牌的 URL 编码值。
6. GET 返回 200 只表示地址验证通过;POST 还需通过访问令牌校验。发送一条授权私聊或群聊消息,检查它是否进入绑定的 DSH 会话,以及回复是否回到原目标。

上述带 ?secret=... 的地址已验证可用,POST 内容仍是明文 JSON。URL 中的 secret 是本插件的访问令牌,用于接收端认证。

VoceChat 文档中的 set/get secret 是另一套可选消息加密接口:不设置时发送原始 JSON;设置 16 字节字符串后,服务端才会对推送内容做 AES 加密,接收端需要解密并进行 PKCS#7 去填充。当前插件不做 AES 解密,因此使用上述接入方式时保持该加密接口未设置。Bot API Key 独立用于访问 Bot API。

配置文件方式见 config.example.yml。示例域名和 ID 均为占位值,实际连接信息需由部署者填写。

智能体工具

| 工具 | 用途 |
| voce_send_text | 发送普通文本或 Markdown,replyTo 支持原生 Reply 引用 |
| voce_send_image / voce_send_audio / voce_send_file | 上传并发送本地或允许来源的媒体 |
| voce_send_message | 按顺序组合文字、媒体和可选合成语音 |
| voce_speak | 使用已配置的 TTS 合成并发送语音 |
| voce_get_private_history / voce_get_group_history | 查询指定私聊或群聊最近 N 条消息 |
| voce_quiet | 安静结束当前 VoceChat 回合 |
| voce_bridge_status | 查看生命周期、缓冲与入站诊断,不返回凭据或消息正文 |

所有发送工具都要求显式传入 destination: { kind: 'user' | 'group', id: 数字 },并检查目标白名单。主动发送需开启 allowProactive。本地媒体走 DSH 的文件读取能力,相对路径按当前会话工作区解析,支持 ~/…。设置页的 allowedLocalRoots 留空即可跟随宿主读取权限;填写目录则增加额外限制。远程媒体仍受来源及网络访问规则限制。

普通自动回复在 DSH 回合完成后发送最终文本;成功使用发送工具后,会抑制重复自动回复。已核实的记忆召回、时间快照和模型切换通知属于内部上下文,不会被当成其他渠道输入。

消息缓冲与默认行为

| 参数 | 默认值 |
| 私聊静默窗口 | 4 秒 |
| 群聊静默窗口 | 1.5 秒 |
| 单批最长等待 | 12 秒 |
| 每批最多原始消息数 | 10 条 |
| 自动附带历史 | 6 条;可设为 0 关闭 |
| 历史工具条数 | 默认 20,范围 1–100 |
| 长文本发送分段 | 每条最多 2000 个 Unicode code point |

新消息会重置静默计时,最长等待到期则封批;不同发送者不会合并。批次保留原始顺序、消息 ID、附件和已有转写。提交结果不确定的批次不会在重启后自动重放,避免重复回复。

算法和恢复语义见防抖合并。

为什么另一只 Bot 的消息收不到

在已验证的官方 VoceChat 0.5.38 Linux amd64 发行包和镜像中,Webhook 转发函数会跳过 is_bot = true 的发送者。因此 Bot 消息可以出现在聊天历史和 SSE 中,却没有被 POST 到接收插件。给 Bot 改密码,或换成普通用户 Token 调用发送接口,都不会改变其 Bot 身份。

插件会忽略自身消息;允许范围内的其他 Bot 消息如果确实被投递到 Webhook,会正常进入队列。群聊可通过 groupSenderWhitelist 选择允许触发回复的用户或 Bot。

SSE 是可行的另一条入站路径:Bot 的用户登录 Token 可以订阅用户事件流并收到其他 Bot 消息,Bot API Key 则不能替代该 Token。当前插件尚未实现 SSE 接收。

详见 Bot 消息的现象、结论与 SSE 方案。

安全与配置

- 默认基址、Bot UID、Session 为空或未配置值;未配置完整时无法启动。
- Key 保存在 DSH credentials 或进程环境中;源码中的 _API_KEY 是引用名。
- 设置页不回传已有 Key,日志及入站诊断不输出凭据或消息正文。
- 本地媒体通过 DSH 文件系统读取,可额外限制目录;远程媒体默认拒绝,下载禁止重定向并检查地址和大小。
- 历史内容作为外部背景传入,不作为新的用户请求执行。

不要提交真实 .env、凭据库、部署配置、会话日志、媒体或运行状态。变更部署前保留配置备份,并确保同一 Bot 的相同事件只有一个有效处理入口。

文档与开发

固定会话与渠道桥接方式参考了 sj244/dsh-qq-bridge。

- 安装、配置和工具说明
- 升级、配置迁移与回滚
- 语音 Provider、OpenAI 与 MiMo
- DSH 接口 · VoceChat API
- 验证记录与限制
- 开发约定与原始验收要求

npm run check
npm pack

当前功能基线通过 105 项自动化检查,并有真实发行库兼容性、媒体探测、VoceChat 消息收发及隔离服务端验证记录。具体版本和真实服务联调范围以验证文档为准。

维护者推送与 package.json 版本一致的 v* 标签时,GitHub Actions 会构建并发布 tgz 和 SHA256SUMS;构建产物不提交到 Git。

许可证与上游

本项目原创插件代码采用 Apache License 2.0,版权与归属见 NOTICE。DSH 使用 MIT;VoceChat 服务端、官方镜像和 Web 客户端具有各自的许可,其中包含商业使用限制或 copyleft 条款。本项目不重新许可这些上游组件。

完整范围、上游链接及保留声明见 THIRD_PARTY_NOTICES.md。本项目为独立第三方集成,不代表 DeepSeek 或 Privoce 官方。
预览分享卡片长什么样 ↓AdRainty/dsh-vocechat-bridge
分享 · DeepSeek Harness Hub
AdRainty/dsh-vocechat-bridge

在 VoceChat 聊天中收发消息,直接使用已有会话

这是你的仓库?认领条目

回到顶部