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

AI 办公室平台 towNingtek/swarm

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

邀请客户开站,各自与 AI 员工协作办公

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · tool
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 32 天前
档位由哪些信号合成

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

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/11/4) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 37 处,展示前 36 条)
  • 读取本地文件
    platform/site_scripts/bd_hackmd.js:35
    try { token = fs.readFileSync(tokenPath, 'utf8').trim(); } catch { fail('token_unreadable'); }
  • 读取本地文件
    platform/site_scripts/bd_hackmd.js:42
    const read = (p) => { try { return fs.readFileSync(path.join(r.repo, p), 'utf8'); } catch { return null; } };
  • 读取本地文件
    platform/site_scripts/bd_hackmd.js:59
    cases = fs.readdirSync(caseDir).filter((f) => /^\d+.*\.md$/.test(f)).sort()
  • 读取本地文件
    platform/site_scripts/bd_hackmd.js:60
    .map((f) => caseSummary(f, fs.readFileSync(path.join(caseDir, f), 'utf8')));
  • 读取本地文件
    platform/site_scripts/bd_hackmd.js:88
    try { noteId = fs.readFileSync(idFile, 'utf8').trim() || null; } catch {}
  • 请求外部主机api.hackmd.io
    platform/site_scripts/bd_hackmd.js:93
    const res = await fetch('https://api.hackmd.io/v1' + url, {
  • 发起网络请求
    platform/site_scripts/bd_hackmd.js:93
    const res = await fetch('https://api.hackmd.io/v1' + url, {
  • 写入本地文件
    platform/site_scripts/bd_hackmd.js:119
    fs.writeFileSync(idFile, noteId + '\n');
  • 读取本地文件
    platform/site_scripts/line_agent.js:37
    const st = fs.statSync(full);
  • 读取本地文件
    platform/site_scripts/line_agent.js:39
    const value = fs.readFileSync(full, 'utf8').trim();
  • 发起网络请求
    platform/site_scripts/line_agent.js:48
    const res = await fetch(url, { ...init, signal: ctl.signal });
  • 读取本地文件
    plugins/synapse/build/build.mjs:14
    const parser = readFileSync(join(here, 'parse-hub.mjs'), 'utf8')
  • 读取本地文件
    plugins/synapse/build/build.mjs:17
    const html = readFileSync(join(here, 'template.html'), 'utf8')
  • 写入本地文件
    plugins/synapse/build/build.mjs:24
    mkdirSync(dirname(OUT), { recursive: true })
  • 写入本地文件
    plugins/synapse/build/build.mjs:25
    writeFileSync(OUT, html)
  • 读取本地文件
    plugins/synapse/build/parse-hub.mjs:93
    const md = readFileSync(process.argv[2] || 0, 'utf8');
  • 写入本地文件
    plugins/synapse/lib/fetcher.js:19
    writeFileSync(tmp, text, { mode: 0o600 })
  • 写入本地文件
    plugins/synapse/lib/fetcher.js:20
    renameSync(tmp, path)
  • 读取本地文件
    plugins/synapse/lib/fetcher.js:27
    if (!note || !tokenFile || !existsSync(tokenFile)) return { skipped: true }
  • 读取本地文件
    plugins/synapse/lib/fetcher.js:28
    const token = readFileSync(tokenFile, 'utf8').trim()
  • 读取本地文件
    plugins/synapse/lib/fetcher.js:34
    try { if (JSON.parse(readFileSync(out, 'utf8')).digest === digest) return { changed: false } } catch {}
  • 读取本地文件
    plugins/synapse/lib/fetcher.js:41
    if (!dir || !existsSync(dir)) return []
  • 读取本地文件
    plugins/synapse/lib/fetcher.js:42
    return readdirSync(dir, { withFileTypes: true }).filter((d) => d.isDirectory() && existsSync(join(dir, d.name, 'HIVE.md'))).map((d) => {
  • 读取本地文件
    plugins/synapse/lib/fetcher.js:42
    return readdirSync(dir, { withFileTypes: true }).filter((d) => d.isDirectory() && existsSync(join(dir, d.name, 'HIVE.md'))).map((d) => {
  • 执行外部命令来自配置/变量
    plugins/synapse/lib/fetcher.js:64
    return new Promise((resolve, reject) => execFile(gh, args, { timeout, maxBuffer: 32 << 20 }, (err, stdout, stderr) => {
  • 写入本地文件
    plugins/synapse/lib/fetcher.js:103
    mkdirSync(dataDir, { recursive: true })
  • 读取本地文件
    plugins/synapse/lib/index.js:68
    const v = JSON.parse(readFileSync(file, 'utf8'))
  • 读取本地文件
    plugins/synapse/lib/index.js:172
    try { page = readFileSync(pagePath, 'utf8') } catch (e) { logger.warn?.('synapse: page not found at %s', pagePath) }
  • 读取本地文件
    plugins/synapse/lib/index.js:173
    const launcher = readFileSync(LAUNCHER, 'utf8')
  • 读取本地文件
    plugins/synapse/lib/index.js:220
    try { return send(res, 200, 'application/json; charset=utf-8', head ? undefined : await readFile(join(dataDir, f), 'utf8')) }
  • 写入本地文件
    plugins/synapse/lib/index.js:234
    mkdirSync(dirname(canvasFile), { recursive: true })
  • 写入本地文件
    plugins/synapse/lib/index.js:236
    writeFileSync(tmp, JSON.stringify(next), { mode: 0o600 })
  • 写入本地文件
    plugins/synapse/lib/index.js:237
    renameSync(tmp, canvasFile)
  • 执行外部命令来自配置/变量
    site/templates/relay.mjs:36
    const dsh = spawn(DSH_BIN, dshArgs, { env: process.env, stdio: ["ignore", "pipe", "inherit"] });
  • 发起网络请求
    site/templates/relay.mjs:56
    const proxyReq = http.request(
  • 读取本地文件
    site/templates/test-relay-policy.mjs:59
    const source = readFileSync(new URL("./relay.mjs", import.meta.url), "utf8");
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
涉及外部主机:api.hackmd.io

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 邀请客户开站
  • 独立站点分配
  • 按量计费用量

运营你自己的 AI 办公平台:邀请客户,给每人一个独立的 DeepSeek Harness 站点,按量计费模型用量。

README

由 DeepSeek 最新模型翻译生成
Swarm 一套可以自己部署的 AI 办公室。你部署一个平台,邀请客户进来;每位客户拿到一个隔离的 DeepSeek Harness(DSH) 站点,里面已经放好办公室模板:公司、AI 员工角色、定时任务,以及存放自己密钥的地方。 运营者创建客户、发出邀请;客户激活账号、站点自动建好,在自己的站点里和 AI 一起工作 带字幕的完整视频:docs/media/demo.mp4。演示运行在一次性的测试安装上,模型是脚本,AI 的回复是预先写好的。 界面目前只有繁体中文。 功能 - 邀请制开站。 运营者在管理后台创建客户、选择办公室模板、设置每月模型额度,再发出一次性的邀请链接。用户名和密码由客户自己设置。 - 每位客户一个容器。 站点由平台自己创建:一个 DSH 容器,有自己的登录、数据和工作区,加上 nginx 路由和 DNS 记录(可选)。删除客户时这些都会一起移除。 - 带设置助手的平台首页。 客户能看到设置进度和建站状态。设置助手只根据平台实际记录的状态说明下一步,不会自己编造进度。 - 进站不用第二套密码。 点“进入我的站点”,平台会用一次性的入场票把已登录的客户交给站点。 - 平台的模型密钥不会进入站点。 每个站点有自己的起步密钥,而且只能在平台的 relay 上使用。relay 核对密钥和这个站点的每月额度,再用平台密钥转发。 - 第一次进站,办公室就在。
展开完整文档(README 剩余 1 节)
Swarm

一套可以自己部署的 AI 办公室。你部署一个平台,邀请客户进来;每位客户拿到一个隔离的 DeepSeek Harness(DSH) 站点,里面已经放好办公室模板:公司、AI 员工角色、定时任务,以及存放自己密钥的地方。

运营者创建客户、发出邀请;客户激活账号、站点自动建好,在自己的站点里和 AI 一起工作

带字幕的完整视频:docs/media/demo.mp4。演示运行在一次性的测试安装上,模型是脚本,AI 的回复是预先写好的。

界面目前只有繁体中文。

功能

- 邀请制开站。 运营者在管理后台创建客户、选择办公室模板、设置每月模型额度,再发出一次性的邀请链接。用户名和密码由客户自己设置。
- 每位客户一个容器。 站点由平台自己创建:一个 DSH 容器,有自己的登录、数据和工作区,加上 nginx 路由和 DNS 记录(可选)。删除客户时这些都会一起移除。
- 带设置助手的平台首页。 客户能看到设置进度和建站状态。设置助手只根据平台实际记录的状态说明下一步,不会自己编造进度。
- 进站不用第二套密码。 点“进入我的站点”,平台会用一次性的入场票把已登录的客户交给站点。
- 平台的模型密钥不会进入站点。 每个站点有自己的起步密钥,而且只能在平台的 relay 上使用。relay 核对密钥和这个站点的每月额度,再用平台密钥转发。
- 第一次进站,办公室就在。 工作区一开始就有办公室模板(AGENTS.md、新手指南、存放公司的文件夹)。客户之后可以接入自己的模型密钥。
- 对话分享。 每个站点都装了 dsh-share-room,客户可以邀请访客一起查看一段对话。
- 运营者总览。 一页列出每位客户的站点、额度策略和模板。客户需要人工时,运营者也在同一个后台回复。

截图

| 运营者 | 客户 |
| 一览所有客户:站点、额度策略、模板 | 用邀请链接激活账号 |
| 一次性邀请链接(截图已遮住) | 平台首页:站点已经建好 |

在客户自己的站点里:回复经过平台的 relay,用量计入每月额度。

在自己的站点里和 AI 工作

架构

flowchart LR
browser([浏览器]) -->|"HTTPS"| nginx["nginx"]
nginx -->|"platform.example.com"| platform["平台 :8210邀请、登录、平台首页、建站"]
nginx -->|"platform.example.com/admin"| admin["管理后台 :8211"]
nginx -->|"acme.example.com"| site["站点容器DSH + 登录 + 办公室"]
platform --- db[(SQLite)]
admin --- db
platform -->|"docker"| site
site -->|"站点密钥"| relay["站点模型 relay :8212核对密钥与额度"]
relay --- db
relay -->|"平台密钥"| gateway["你的 OpenAI 兼容模型 gateway"]

每个站点都在隔离的 Docker 网络里,主机上唯一能连到的是 relay,其他主机端口、内网和云 metadata 都连不到。平台本身从不执行 sudo,需要 root 的事交给两个小单元:一个管防火墙,一个应用 nginx 配置。细节见 docs/architecture.md 和 docs/security.md(英文)。

部署前请先了解

- 请使用专门给 Swarm 的主机。 平台用户在 docker 组里,等同 root。
- 容器不是虚拟机。 所有客户共用同一个内核和同一个 Docker daemon。DSH 自己的沙箱在容器里无法运行,所以隔离只靠容器、网络和防火墙。
- 站点可以访问外网。 客户的 AI 可以把该客户的数据发送到任何地方。
- 起步模型的费用由你承担。 每个站点的起步调用都经过你的 gateway、用你的密钥。每月上限会强制执行,但 token 数是估算的。
- TLS 需要自己处理。 这个仓库不处理 TLS,请在前面放 certbot、负载均衡或 tunnel。

完整清单见已知限制。

安装

需要:一台 Linux 主机(Ubuntu 22.04 或类似版本),装有 Docker 24 以上、nginx、Python 3.10 以上;站点镜像约需 2 GB 磁盘;一个 OpenAI 兼容的模型 gateway(例如 LiteLLM)。把 platform.<domain> 和 *.<domain> 指向这台主机。

sudo git clone https://github.com/towNingtek/swarm /opt/swarm
cd /opt/swarm
sudo python3 -m venv .venv && sudo .venv/bin/pip install -r requirements.txt
sudo docker build -f site/Dockerfile -t swarm-site:latest .
sudo deploy/install.sh
sudo editor /etc/swarm/platform.env # 域名、origin、模型 gateway
sudo editor /etc/swarm/secrets/model-key
sudo cp deploy/nginx/swarm-platform.conf.example /etc/nginx/conf.d/swarm-platform.conf
sudo editor /etc/nginx/conf.d/swarm-platform.conf && sudo nginx -t && sudo systemctl reload nginx
sudo deploy/install.sh --start

然后打开 https://platform.<domain>/admin,用 /etc/swarm/secrets/admin-password 里的密码登录。其他设置、日志和第一位客户的创建方式见 deploy/README.md(英文)。

整套安装流程会在一次性容器里从零测试:bash deploy/tests/clean-install/run.sh。

目录

| 路径 | 内容 |
| platform/ | 平台、管理后台、站点模型 relay |
| site/ | 建站引擎与 DSH 站点镜像 |
| office-template/ | 新站点一开就有的办公室 |
| plugins/ | 放在本仓库的 DSH 插件(品牌外观) |
| deploy/ | 用 systemd、Docker、nginx 在一台主机上安装 |
| demo/ | 上面演示用的脚本模型和录屏脚本 |
| docs/ | 架构、安全模型、HTTP API、设计记录(英文) |

开发

bash scripts/test.sh # 全部测试;Python 3.10 以上、Node 22

平台用 Python(FastAPI),页面由服务器生成。站点镜像是 DSH 加上 profile patch,不修改 DSH 本身。

名称

“一群协作的 agent”这个概念受 openai/swarm 启发。本项目独立开发,与 OpenAI 无关。

安全

发现漏洞请私下报告,见 SECURITY.md。

许可

MIT © towNingtek inc.
预览分享卡片长什么样 ↓towNingtek/swarm
分享 · DeepSeek Harness Hub
towNingtek/swarm

邀请客户开站,各自与 AI 员工协作办公

这是你的仓库?认领条目

回到顶部