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

圆桌讨论室 madc1989/dsh1989

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

把多个 AI 模型拉进群聊,让它们互相辩论、交叉验证结论

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

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

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

状态速览

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

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 52 处,展示前 26 条)
  • 写入本地文件
    server.mjs:54
    mkdirSync(DATA, { recursive: true });
  • 写入本地文件
    server.mjs:55
    if (!existsSync(MEMBERS_FILE)) writeFileSync(MEMBERS_FILE, JSON.stringify([
  • 读取本地文件
    server.mjs:55
    if (!existsSync(MEMBERS_FILE)) writeFileSync(MEMBERS_FILE, JSON.stringify([
  • 读取本地文件
    server.mjs:63
    const members = JSON.parse(readFileSync(MEMBERS_FILE, 'utf8'));
  • 写入本地文件
    server.mjs:64
    const saveMembers = () => writeFileSync(MEMBERS_FILE, JSON.stringify(members, null, 2), 'utf8');
  • 写入本地文件
    server.mjs:68
    if (!existsSync(ROOMS_FILE)) writeFileSync(ROOMS_FILE, JSON.stringify({
  • 读取本地文件
    server.mjs:68
    if (!existsSync(ROOMS_FILE)) writeFileSync(ROOMS_FILE, JSON.stringify({
  • 读取本地文件
    server.mjs:72
    let rooms = JSON.parse(readFileSync(ROOMS_FILE, 'utf8'));
  • 写入本地文件
    server.mjs:73
    const saveRooms = () => writeFileSync(ROOMS_FILE, JSON.stringify(rooms, null, 2), 'utf8');
  • 读取本地文件
    server.mjs:81
    let roomSettings = existsSync(SETTINGS_FILE) ? JSON.parse(readFileSync(SETTINGS_FILE, 'utf8')) : {};
  • 读取本地文件
    server.mjs:81
    let roomSettings = existsSync(SETTINGS_FILE) ? JSON.parse(readFileSync(SETTINGS_FILE, 'utf8')) : {};
  • 写入本地文件
    server.mjs:82
    const saveSettings = () => writeFileSync(SETTINGS_FILE, JSON.stringify(roomSettings, null, 2), 'utf8');
  • 请求外部主机api.deepseek.com
    server.mjs:100
    const r = await fetch('https://api.deepseek.com/chat/completions', {
  • 发起网络请求
    server.mjs:100
    const r = await fetch('https://api.deepseek.com/chat/completions', {
  • 执行外部命令来自配置/变量
    server.mjs:121
    const probe = spawnSync(FFPROBE, ['-v', 'error', '-show_entries', 'format=duration', '-of', 'csv=p=0', filePath], { encoding: 'utf8', timeout: 20_000
  • 执行外部命令来自配置/变量
    server.mjs:133
    const fr = spawnSync(FFMPEG, ['-v', 'error', '-ss', String(marks[i].toFixed(2)), '-i', filePath,
  • 执行外部命令来自配置/变量
    server.mjs:200
    const r = spawnSync(process.execPath, [KIMI_PROBE], { encoding: 'utf8', timeout: 60_000 });
  • 发起网络请求
    server.mjs:216
    const res = await fetch(route.base + '/chat/completions', {
  • 请求外部主机api.kimi.com
    server.mjs:231
    const res = await fetch('https://api.kimi.com/coding/v1/messages', {
  • 发起网络请求
    server.mjs:231
    const res = await fetch('https://api.kimi.com/coding/v1/messages', {
  • 发起网络请求
    server.mjs:391
    try { await fetch(NET_PROBE_URL, { method: 'HEAD', signal: AbortSignal.timeout(3000) }); ok = true; } catch { ok = false; }
  • 请求外部主机api.deepseek.com
    server.mjs:945
    const r = await fetch('https://api.deepseek.com/chat/completions', {
  • 发起网络请求
    server.mjs:945
    const r = await fetch('https://api.deepseek.com/chat/completions', {
  • 执行外部命令来自配置/变量
    supervise.mjs:40
    child = spawn(NODE, [SERVER, '--port', PORT, '--host', HOST], {
  • 发起网络请求
    test-sse.mjs:6
    const res = await fetch(base + '/api/events');
  • 发起网络请求
    test-sse.mjs:11
    fetch(base + '/api/send', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ room, text }) });
扫描于 2026/11/4(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库
涉及外部主机:api.deepseek.com、api.kimi.com

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

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

README

由 DeepSeek 最新模型翻译生成
圆桌 · 多模型讨论室 一个本地运行的「多模型群聊」应用:把不同厂商的 AI 模型拉进同一个界面,像微信一样分组、私聊、@人、转发,让它们互相讨论,用来交叉验证结论、降低单模型出错的概率。 零依赖(只用 Node 内置模块),单文件前端,数据全部存在本地。 界面预览 左侧是群聊与联系人,右侧是群内多模型轮流发言,底部可输入、@ 选人、发附件。 功能 - 两种群 + 私聊:内置群、自建群、以及和单个模型的一对一私聊,互不干扰 - 轮流发言:群里直接说话,成员按可调顺序依次回答;@名字 只让指定成员回答 - 互搏:让A和B讨论… 让两个模型来回辩论,轮数可设,随时能喊「停」中断 - 会话模式:圆桌模式(轮流发言,后一位能看到前一位)/ 独立模式(同时作答、本轮互不可见)/ 自由模式(一拍一人,谁开口按"发言倾向"随机,被点名的优先)/ 设定模式(给每个成员单独写人设,按角色分工) - 转发:勾选消息转发到任意会话,带评论、带来源链路,接收方当"参考材料"读 - 删除留痕:删除消息后在原位置留下系统提示,让模型知道上下文有断点 - 附件:图片自动转成文字描述、文本文件读取正文,再喂给模型 - 断网降级:断网时云端成员自动跳过,本机模型继续可用 - 断路器:连续失败的成员自动下线,冷却后再重试
展开完整文档(README 剩余 1 节)
圆桌 · 多模型讨论室

一个本地运行的「多模型群聊」应用:把不同厂商的 AI 模型拉进同一个界面,像微信一样分组、私聊、@人、转发,让它们互相讨论,用来交叉验证结论、降低单模型出错的概率。

零依赖(只用 Node 内置模块),单文件前端,数据全部存在本地。

界面预览

左侧是群聊与联系人,右侧是群内多模型轮流发言,底部可输入、@ 选人、发附件。

功能

- 两种群 + 私聊:内置群、自建群、以及和单个模型的一对一私聊,互不干扰
- 轮流发言:群里直接说话,成员按可调顺序依次回答;@名字 只让指定成员回答
- 互搏:让A和B讨论… 让两个模型来回辩论,轮数可设,随时能喊「停」中断
- 会话模式:圆桌模式(轮流发言,后一位能看到前一位)/ 独立模式(同时作答、本轮互不可见)/ 自由模式(一拍一人,谁开口按"发言倾向"随机,被点名的优先)/ 设定模式(给每个成员单独写人设,按角色分工)
- 转发:勾选消息转发到任意会话,带评论、带来源链路,接收方当"参考材料"读
- 删除留痕:删除消息后在原位置留下系统提示,让模型知道上下文有断点
- 附件:图片自动转成文字描述、文本文件读取正文,再喂给模型
- 断网降级:断网时云端成员自动跳过,本机模型继续可用
- 断路器:连续失败的成员自动下线,冷却后再重试
- 备份/导入:会话可导出为 JSON + Markdown,也可从备份导入到指定会话

运行

需要 Node.js 18+(用到内置 fetch 和 AbortSignal.any)。

node server.mjs --port 3000

然后浏览器打开 http://127.0.0.1:3000

可选参数:

| 参数 | 默认 | 说明 |
| --port | 3000 | 监听端口 |
| --max-rounds | 6 | 互搏最大轮数(每个会话也可单独设置) |

配置

模型线路

在 server.mjs 顶部的 ROUTES 里声明线路,CATALOG 里列出可选模型:

const ROUTES = {
'deepseek-official': { kind: 'openai', base: 'https://api.deepseek.com', ref: 'DEEPSEEK_API_KEY' },
'qwen3-8b': { kind: 'openai', base: 'http://127.0.0.1:1234/v1', ref: null },
'kimi-coding': { kind: 'anthropic', base: 'https://api.kimi.com/coding' },
// ...
};

- kind: 'openai' 走 /chat/completions(OpenAI 兼容)
- kind: 'anthropic' 走 /v1/messages(Anthropic 兼容)
- ref 是 API Key 在凭据文件里的名字;null 表示本机服务不需要鉴权

凭据

密钥从 ~/.dsh/.credentials.yaml 的 refs: 段读取(该文件不由本仓库管理)。
如果想换成自己的密钥管理方式,改 readCred() 与 refs 的加载逻辑即可。

数据

全部保存在 data/(已被 .gitignore 排除):

| 文件 | 内容 |
| room.jsonl | 全部消息记录 |
| members.json | 成员(模型)列表与全局人设 |
| rooms.json | 群与成员关系、发言顺序 |
| settings.json | 每个会话的上下文长度、模式、人设、互搏轮数 |
| uploads/ | 附件原文件 |

备份:左侧栏 ⚙ 设置 → 生成备份,可选会话、选目录,导出 JSON + 每个会话一份 Markdown。

目录结构

圆桌/ ├── server.mjs # 服务端:路由、编排、模型适配、附件与上下文 ├── public/index.html # 前端:单文件,无构建步骤 ├── docs/screenshot.png # 界面截图 ├── data/ # 运行时数据(不提交) └── README.md

已知限制

- 单用户、单进程,无鉴权;不要暴露到公网
- 模型看不懂图片本身,图片靠视觉模型转述文字
- 附件正文默认只取前 6000 字符
- 上下文窗口按字符数粗估,不精确对应 token

许可

MIT
预览分享卡片长什么样 ↓madc1989/dsh1989
分享 · DeepSeek Harness Hub
madc1989/dsh1989

把多个 AI 模型拉进群聊,让它们互相辩论、交叉验证结论

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