返回博客列表

Octop 深度解析:腾讯云开源的多人 Agent 平台,为什么坚持单进程

2026-10-05T16:00:00+08:00
Octop腾讯云Agent自托管MCPACPHarness开源

Octop 深度解析:腾讯云开源的多人 Agent 平台,为什么坚持单进程

大多数 Agent 平台在往上堆服务,它反过来把复杂度收进一个进程。

今年 7 月 8 日,腾讯云在 GitHub 上开了一个叫 Octop 的仓库,自我描述只有一句:"A smarter, self-hosted AI assistant — multi-user, multi-agent."。三个月后它有 6,748 stars、836 forks,MIT 许可,Python 实现,最新版本 v1.0.2b6 发布于 10 月 4 日——而 9 月 23 日还是 b2,十天里发了五个 beta。

同期还有一件更能说明意图的事:9 月 24 日,四个配套仓库在同一天创建——octop-harness、octop-gateway、octop-memory、octop-browser。这不是一个人写的小工具,是一次有组织的开源发布:一个应用 + 四个运行时。

这篇文章拆它的架构选择和边界。最值得看的不是功能列表,而是一个反直觉的工程决定:它坚持单进程,还专门写了 ADR 来论证这件事。

本文提纲

  1. 它是什么:家庭与小团队的自托管助手
  2. 架构上最值得学的:单进程 + 控制面/工作区分层
  3. 四个兄弟仓库:harness / gateway / memory / browser
  4. 能力面:多用户专家体系、IM 全通道、ACP 双向
  5. 三块"重"能力:终端、浏览器、远程桌面
  6. 安全模型,以及它的真实风险
  7. 上手与选型边界

它是什么:家庭与小团队的自托管助手

Octop 的定位写得比多数开源项目诚实:for households and small teams(家庭与小团队),一个 admin 账户全家或全组共用,每个成员可以有自己的一组专家(agent)。

它跑起来的形态是一个进程同时提供 Web 控制台、CLI、IM 通道和定时任务,全部共享 ~/.octop/ 下的一个控制面数据库(默认 SQLite,WAL 模式;可选 PostgreSQL):

~/.octop/                          ← 安装与数据根目录
├── config.json                    # 进程配置
├── octop.db                       # SQLite — 用户、agent、通道、cron…
├── secrets/                       # JWT 密钥、通道令牌
├── agents//             # 每个 agent 的工作区(SOUL.md、skills…)
├── security/tool_guard/           # shell 命令允许/拒绝规则
├── logs/
├── venv/                          # 安装器用 uv 管理的 Python
└── bin/octop                      # PATH 包装脚本

它的设计目标宣言我也照抄一句,因为它解释了后面所有取舍:

keep every conversation, workspace, and credential on your own machine, while giving each user a personal team of specialized agents they can switch between per task.

"每个人有一个可切换的专家团队"——这句话是理解它功能布局的钥匙。多专家、专家共享、专家市场、AgentTeams,都是围绕它长出来的。

架构上最值得学的:单进程 + 控制面/工作区分层

这是我看这个项目最感兴趣的部分。它的架构图大致是这样:

OctopServer
 ├─ DatabasePool            SQLite (WAL) 或 PostgreSQL
 ├─ SharedServices        DI 根 — 所有 repo + 配置
 ├─ ExpertCatalog         启动时扫描 agents/experts/library/
 ├─ UserManager
 │   └─ HarnessAgentManager(每用户)
 │       └─ AgentRuntime(每 agent)
 │           ├─ HarnessAgent      Agent 运行时(octop-harness)
 │           ├─ HarnessProcessor  IM / UI / cron 的统一入口
 │           ├─ ChannelManager    IM 连接(octop-gateway)
 │           └─ CronManager       APScheduler
 └─ FastAPI app (uvicorn)

两个决定值得展开。

第一,没有外部队列或消息中间件。 官方原话是:Web UI、IM、cron 三个入口全部走同一个进程内的 HarnessProcessor,而不是丢进 Kafka/RabbitMQ 再由 worker 消费。收益很直接——重启安全:进程一起来,整个状态从控制面数据库重建,不需要协调分布式组件的启动顺序。对一个"装在自己机器上、可能一周重启三次"的自托管产品,这个选择的用户体验优势远大于架构上的"不够现代"。

代价当然也有:所有通道和定时任务挤在一个进程里,一个阻塞点就可能影响全局;它本质上不可水平扩展——想扩就得换架构。这大概率就是为什么他们要专门写一份 docs/adr/001-single-process-model.md:这不是随手写的,是一个被明确权衡过、并且愿意对外解释的决定。

第二,控制面与工作区是分开的。 控制面数据库管用户、agent、通道、cron 这类元数据;而 agent 的文件工作区可以放本地磁盘、Docker 沙箱、PostgreSQL、COS/S3 或其他远程存储。这个分离很实用:元数据要强一致、要事务,文件要能大、要能挂到对象存储,两者的最佳载体本来就不一样。README 里还专门提醒——换成 PostgreSQL 时,agent 记忆默认复用同一个 DSN(每个 agent 一个 schema),想继续用文件式记忆得显式配置 "memory": { "backend": { "type": "sqlite" } }。

这种"把边界画在配置里,而不是画在代码里"的做法,是它号称 no vendor lock-in 的底气:换 LLM provider、换存储后端、换通道,都不用重写 agent。

四个兄弟仓库:harness / gateway / memory / browser

四件套各自解决一个正交的问题,这也是我认为这次开源发布最有价值的部分——它不是把一个大项目拆成模块,而是把四个可复用的运行时单独开源:

仓库 角色 说明
octop-harness Agent 运行时 模型路由、工具、skills、对话 checkpoint;自我描述为"从 Harness Engineering 理念构建的生产级 agent runtime"
octop-gateway IM 通道桥 多平台消息统一成一条处理管线
octop-memory 记忆 分层召回 + 全文检索;记忆跟着 workspace 走,可以迁移到下一个 agent
octop-browser 浏览器自动化 直连 CDP,不用 Playwright,主打 agent-first 的准确与可靠

四个仓库都是 9 月 24 日创建、MIT 许可、Python,目前星数在 22–33 之间——明显是配套发布,主仓库才是流量入口。这个结构对读者有实际参考意义:如果你只想借一块,比如要一个"消息统一抽象层"或者"可迁移的记忆后端",可以直接看对应仓库,而不是把整个 Octop 拖进来。

octop-memory 还有一组挺特别的能力暴露在 CLI 上:

octop memory list                 # 列出可做记忆维护的、正在运行的 agent(不改数据库)
octop memory slim [--agent ID]    # 备份并瘦身 SQLite 记忆,显示终端与面板进度
octop memory slim --all           # 依次维护所有符合条件的 agent,遇错即停

聊天里还能用 /memory slim 查看影响、--confirm 才开始,/memory status 看进度。"记忆会膨胀"是长期运行的 Agent 迟早要面对的问题,把它做成一个有备份、有影响确认、有进度的运维命令,比写十篇"记忆架构设计"都实在。

能力面:多用户专家体系、IM 全通道、ACP 双向

多用户专家体系是它的主线:admin 角色、JWT 多用户隔离;每个用户可以建多个专家,每个专家有自己的工作区、provider、通道和 cron;专家可以发布给同一部署内的其他人复用(expert sharing),还有启动时扫描的专家库(infra/agents/experts/library/)和共享的 skill / 子 agent 资源池。另外有个有趣的小设计:16 种 MBTI 人格模板 + 一个互动测验,给每个 agent 一个明确性格——这类东西看起来是"趣味功能",但对"我该找哪个 agent 干这件事"的多 agent 场景,实际是在解决辨识度问题。

IM 通道是它和海外同类最大的差异点:

通道 凭据
飞书 App ID、App Secret
钉钉 App Key、App Secret
QQ Bot AppID、Token
微信 扫码绑定 / 账号凭据
企业微信 Corp ID、Agent Secret
Telegram Bot Token
Discord Bot Token(默认可访问全部频道,可选白名单)
Web Dashboard 默认开启

加上 HTTP / SSE / WebSocket 的完整编程接口,以及 Windows / macOS / Linux 桌面客户端(还有 FnOS NAS 的 .fpk 安装包)——它的接入面是按照"国内团队实际用什么聊天"来设计的,这一点决定了它在同类项目里的位置。

ACP(Agent Client Protocol)双向支持是我认为最聪明的一处取舍。inbound 方向,外部工具可以用你的 Octop agent:

octop acp --agent main   # stdio ACP server,供 Zed、OpenCode 等使用

outbound 方向,Octop 可以把编码任务委派出去给 OpenCode、CodeBuddy、Claude Code、Codex,还带权限门(permission gates)。也就是说:它不打算自己卷编码 agent,而是把外部最强的编码 agent 当成可调用的 runner。 对资源有限的开源项目,这个判断很务实。

三块"重"能力:终端、浏览器、远程桌面

这三块把它和"聊天框 Agent"区分开了,也带来了最大的风险面:

  • Terminal AI+:浏览器里的交互式 shell,AI 辅助执行命令和排障;
  • Browser AI+:基于 CDP 的持久化 profile 会话,做网页自动化、截图、远程浏览;
  • Remote desktop:从控制台看宿主机的实时屏幕并注入输入,Linux / Windows / macOS 都支持;无头 Linux 上可以一键起隔离桌面。

组合起来的画面是:一台机器上的终端、浏览器、桌面,全部变成 Agent 可操作的表面。 这是它的能力上限,也是它风险的下限——下一节专门讲。

安装本身设计得挺克制,不要求预装 Python,安装器用 uv 在 ~/.octop/ 里建隔离 venv:

# macOS / Linux 一行安装
curl -fsSL https://finnie-1258344699.cos.ap-guangzhou.myqcloud.com/octop/install.sh | bash

octop init     # 交互式向导:建库、JWT 密钥、第一个管理员
octop run      # 前台启动 API + Web 控制台 → http://127.0.0.1:8088
octop service start   # 注册成系统服务(systemd / launchd / Windows 服务)

生产环境推荐 Docker:

docker compose -f docker/docker-compose.yml up -d

注意它的首启行为:Docker 首次初始化会生成随机管理员密码并写进 /data/.octop/credential.txt,除非你显式设 OCTOP_DEFAULT_PASSWORD;而你设的密码必须至少 8 位且含字母和数字,太弱的会被密码策略拒绝并回落到随机密码。

安全模型,以及它的真实风险

它做对的几件事:

  • 本地优先:配置、对话、工作区、凭据都在 ~/.octop/ 下,不出本机;
  • 多用户隔离:JWT 认证 + 按用户隔离的 agent 与工作区;
  • PII 脱敏 + 工具审批:敏感数据离开工作区前脱敏,风险工具与 shell 命令需要在 guardrail 规则下显式批准;
  • 工具护栏可编辑:规则放在 ~/.octop/security/tool_guard/,不是硬编码;
  • API 文档默认关闭:/api/docs 要显式在 config.json 里设 "enable_api_docs": true 才开。

最后这条我想专门点一下:默认关掉交互式 API 文档,是个很清醒的默认值。它牺牲了一点开发便利,换掉了一个常被忽视的暴露面。

但我得把风险讲清楚,因为这篇文章不是软文:

  1. 项目非常年轻。 3 个月、版本号还在 1.0.2bX、804 个 open issues、AgentTeams 自标 Beta、移动端闭测、Managed Agents 与插件市场还在 roadmap 的 planned 里。当玩具和当生产基础设施是两个评估标准。
  2. 权限极大。 终端 + 浏览器 + 远程桌面 + shell 执行,等于把宿主机交给一个 Agent 平台。本地优先说的是数据不出门,不等于操作风险小——你的机器就是攻击面。真要跑,建议放独立机器或容器里,而不是你日常开发的主力机。
  3. 单进程是双刃剑。 一个 IM 通道的异常理论上会影响同进程内的其他表面;它也不做水平扩展。
  4. 运维成本自己扛。 备份(有 octop backup,但得你记得跑)、升级(octop update)、TLS、PostgreSQL 选型,都是你的活。
  5. 模型要你自己接。 OpenAI 兼容 API、DashScope(Qwen)、Ollama 等预设,效果取决于你接的模型与你的提示词工程。

上手与选型边界

适合它的场景:家里或小团队想要一个"自己的 Jarvis"——统一的多用户入口,能通过飞书/企微接活、能定时跑任务、能让不同专家分管不同事、数据不出本机。也适合想研究单进程 Agent 平台架构的人,docs/adr/ 下的两份 ADR(单进程模型、数据库后端)比大多数项目的架构文档都值得读。

不适合的场景:需要多租户 SaaS、需要水平扩展到几十个节点、需要严格 SLA 的场景;以及你只想"评估一下 Agent 能干什么"——直接上个 CLI 工具更省事。

一个比较现实的建议:如果你已经在用 Claude Code / Codex 这类编码 agent,Octop 的价值不在替代它们,而在给它加一层"多用户 + IM 入口 + 定时任务 + 长期记忆"的平台外壳,并让编码任务通过 ACP 委派出去。这个组合比"再换一个 agent"更可能真的省时间。

参考链接

你会在自己家里跑一个这样权限的 Agent 平台吗?还是觉得"本地优先"抵不过"它能操作我的机器"?评论区聊聊你的底线,觉得有用点个赞。


作者: itech001 来源: 公众号:AI人工智能时代(the-ai-era) 网站: https://www.theaiera.top/ 关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top

本文首发于 AI人工智能时代,转载请注明出处。

分享给朋友