开源Centaur:多人、自托管、安全的AI代理

Paradigm 和 Tempo 开源了 Centaur,一个自托管的运行时,用于构建多人、安全的 AI 代理。Centaur 作为共享代理,可在 Slack 或 API 中使用,支持长时间运行、崩溃恢复、工具集成和工作流共享。其架构基于服务,所有状态存储在 Postgres 中,每个会话拥有隔离的沙箱容器,代理通过防火墙安全访问 API 密钥,避免凭据泄露。Centaur 支持扩展工具、技能和工作流,已内部使用数月,覆盖投资、工程、设计等多个领域。

今天我们开源了 Centaur,这是 Paradigm 和 Tempo 联合开发的自托管运行时,专为多玩家、安全的 AI 智能体设计。自一月份以来,我们一直在使用 Centaur,它彻底改变了我们在投资、工程、设计、招聘、活动、客户支持等广泛任务上的工作方式。

Centaur 是一个共享智能体,可以使用工具,运行数小时或数天,在重启后依然存活,并能使用真实凭据操作,且原始密钥对智能体完全不可见。你可以通过 Slack 或 API 与它对话。你只需添加一次工具,所有智能体就能使用它。你只需植入一个工作流,整个组织就能立刻获得该能力。每天结束时,它会反思自己的表现并自我改进。

除了开源 代码 以及用于 扩展运维 Centaur 的模板仓库外,我们还深入探讨了系统的架构、服务间的接口、安全边界以及执行模型。这些是我们认为值得复制、调整和重新实现的部分。让我们开始吧。

个人智能体的问题

大多数智能体框架仍然是为一台机器上的一个用户设计的。一旦你试图构建协作工作流,就会出现一系列不同的需求:

  1. 智能体必须在你合上笔记本电脑后继续工作(我们都知道那些因为智能体还在运行而不得不一直开着笔记本电脑走来走去的人)。
  2. 智能体必须在协作发生的地方可访问,例如 Slack。
  3. 智能体必须能够应对崩溃、部署、断开连接和部分故障。
  4. 它必须足够安全,能够在不提供原始 API 密钥的情况下信任它操作真实系统。
  5. 它必须是可观察和可审计的,以便进行安全审查和优化。

大多数系统只解决了上述部分需求。有些是优秀的编码智能体,有些是优秀的浏览器智能体,有些是优秀的工作流引擎。很少有系统是专为团队共享基础设施而设计的。而且它们都成本高昂,并将你锁定在某个供应商的路线上,你只能被动跟随其发展。

我们认为,组织应该有能力拥有自己的技术栈,以所需的速度前进,并在协作而非孤立的环境中使用 AI。这正是 Centaur 所要填补的空白。

如何使用 Centaur?

将 Centaur 视为一名虚拟员工。Slack 线程就是界面。你可以像标记其他员工一样标记 Centaur,Centaur 会回复。根据任务的不同,Centaur 会运行几秒、几分钟甚至数小时以上,并调用一系列集成的 SKILL.md 或工具。它知道自己是在哪个 Slack 线程中被召唤的,并可靠地回复相关主题和问题,而不是从你的所有知识库中随机拼凑上下文。

Centaur 开箱即可与电子表格、文档、幻灯片、文件签名、PDF 以及你能想到的任何其他类型的文件附件进行交互。它可以搜索 Slack、网络,使用 GitHub,生成图像和图表,创建或更新 Google 文档、幻灯片和/或表格、交互式演示等等。

Centaur 的代码库仍然相对年轻,我们仍在不断进行增强和改进。但它的体验确实令人难以置信,我们认为它已经改变了我们组织的运作方式。我们强烈建议创建一个全公司的 #ai-agent Slack 频道,邀请所有人加入。在这个频道中,重要的是:

  1. 公司领导者要使用它,并树立榜样。
  2. 人们能够提出疑问而不必担心显得愚蠢。
  3. 那些 AI 更加熟练的人可以在现有线程中提示他人:“看,你可以这样用 AI 来解决卡点”。

Centaur 是如何工作的?

在设计 Centaur 时,我们特别注重两件事:

  1. 一个 Slack 线程 = 一个隔离的智能体会话。 当你在一个线程中标记 Centaur 时,系统会为该对话分配一个专用的沙箱容器。在容器内部,一个完整的 Linux 环境运行着你选择的 AI 框架:Amp、Claude Code、Codex 或任何基于 CLI 的智能体。容器预装了 Node.js、Python、Rust 和 git,因此智能体可以 git clone、cargo build、运行测试,并在真实环境中编写真实代码。
  2. 每个会话都可以访问组织级工具和技能。 智能体喜欢数据,所以如果你给它们连接和工具,它们会自己想办法完成你希望它们做的事。一个工具就是一个封装了 API(如 Slack、GitHub、Google Sheets)的小型 Python 类。将文件放入 tools/ 目录,每个智能体就能立即调用它。技能的工作方式相同:一个 SKILL.md 文件,教会智能体某个工作流或指令集,一旦添加,每个对话都能使用。

在底层,Centaur 是一个基于服务的架构,所有状态都存储在 Postgres 中,每个服务都是无状态的。这意味着系统能够在重启、部署和崩溃后继续运行,而不会丢失工作。以下是每个组件如何相互通信:

以下是每个服务的详细介绍:

  1. Slackbot:一个轻量级的 Next.js webhook 监听器。当有人在 Slack 中标记 Centaur 时,slackbot 接收事件并调用 API 的持久化协议:生成一个运行时,持久化消息,并执行这次对话回合。
  2. API:编排所有内容的 FastAPI 控制平面。它管理智能体会话的生命周期(生成 → 消息 → 执行),为每个工具插件提供自动生成的 REST 端点,运行持久化工作流引擎,并将执行事件流式返回给客户端。持久化工作流引擎深受 Absurd 启发,更多内容见下文。
  3. Postgres:唯一的事实来源。线程分配、执行状态、工作流检查点、API 密钥、审计日志——所有持久化内容都存储在这里。由于每个服务都是无状态的,你可以重启任何服务而不会丢失上下文。
  4. 沙箱:每个对话在内部网络中拥有自己的沙箱容器。智能体在容器内运行,并通过 REST 回调 API 以获取工具访问权限。容器可以进行资源限制,主机文件系统以只读方式挂载。一个由预生成容器构成的温池消除了冷启动延迟。
  5. 防火墙:一个 iron-proxy Pod 位于每个沙箱和外部世界之间。智能体或用户从未持有真实的 API 密钥。相反,代理会拦截所有出口流量,并且只要流量不违反任何防火墙规则,它就会在飞行中动态注入正确的凭据,匹配目标主机和源工具。使用 Linear 工具对 api.linear.app 的请求会获得 Linear 密钥,而使用 gsuite 则会注入 Google OAuth 凭据。
  6. 可观测性:每个服务都将结构化的 JSON 日志写入标准输出。我们允许用户选择自己的可观测性技术栈,并为 Centaur 编写工具来发现其自身的指标、日志和跟踪。默认情况下,Centaur 附带用于 VictoriaLogs/VictoriaMetrics 的工具。

公司特定的覆盖层

可扩展性是 Centaur 的一等公民——每个公司(包括 Tempo 和 Paradigm)使用不同的工具,将数据存储在不同的源,并拥有可以提炼成技能的公司特定知识。

该框架支持“覆盖”——将一个 Docker 镜像挂载到核心 Centaur 服务之上,并为 API/沙箱提供专门为你构建的工具、技能和工作流的访问权限。

共享技能

技能是 Markdown 文件(.agents/skills/*/SKILL.md),用于教会智能体如何执行特定任务,例如招聘流程、合规检查、QA 工作流。添加一个技能文件,每个智能体会话都会继承该知识。这在团队中已经很成熟,但与其传递技能文件,你只需将自己的技能添加到 Centaur 的 .agent/skills 目录,整个团队就能获得访问权限。

可扩展工具

工具是最简单的扩展点。一个工具是一个目录中的 Python 类,包含 client.py 和 pyproject.toml。API 在启动时自动发现它,生成 /tools/{name}/{method} 的 REST 端点,并在文件更改时热重载。以下是一个工具的示例:

将该文件放入 tools/my-tool/,几秒钟后,你组织中的每个智能体对话都能调用它。工具在其 pyproject.toml 中声明其需要的 API 主机和密钥,以便防火墙处理凭据注入。

可扩展工作流

一个工作流是一个导出名称和处理函数的单个 Python 文件。将其放入 workflows/,它就可以通过 cron 使用,通过 API 触发,或与其他工作流组合。

工作流引擎将每一步检查点到 Postgres。如果进程在工作流中间崩溃,它会从上次中断的地方恢复,不会重复工作,也不会丢失状态。在步骤之间休眠 24 小时不会消耗任何资源;工作流会挂起,引擎会在时间到时唤醒它。对于细心的读者来说,这是一种日益流行的持久化工作流模式。该设计深受 Absurd 基于 Postgres 的架构启发。

Centaur 有多安全?

大多数智能体框架处理密钥的方式和你个人电脑上的方式一样:将 API 密钥转存到环境变量中,希望智能体不会泄露它们。这对个人使用有效。但当你将公司 Slack、GitHub、云基础设施和财务系统的凭据交给智能体时,这种方法就行不通了。

Centaur 采用不同的方法:智能体从不持有你的密钥。不在环境变量中,不在磁盘上,也不在内存中。相反,凭据只存在于一个隔离的密钥管理器中,一个网络级防火墙在请求离开沙箱、到达外部 API 之前,将其动态注入到出站请求中。

具体来说是这样的:

  1. 一个工具在其 pyproject.toml 中声明它需要,比如说,SLACK_BOT_TOKEN 并且与 api.slack.com 通信。
  2. 在沙箱启动时,Iron 代理构建一个映射:api.slack.com -> SLACK_BOT_TOKEN。
  3. 当智能体调用 Slack 时,请求经过防火墙。防火墙看到目标主机,从你的密钥管理器中查找正确的密钥,并将其注入到请求头中。
  4. 智能体看到成功的响应,但从未见过该Token。

这意味着,即使智能体被攻破或遭受提示注入攻击,也无法窃取你的凭据。它可以通过代理发出经过身份验证的请求(必须如此,这是它的工作方式),但它无法提取原始密钥值、将其发送到其他主机或将其偷偷带出响应。

这种安全性通过网络策略强制执行,使得任何容器都不能:

  1. 直接访问密钥服务
  2. 不先经过防火墙就访问互联网。

这意味着所有密钥都受到保护,每个进出请求都经过防火墙。除此之外,每个沙箱的每个出站请求都由防火墙记录,并且来自 LLM API 的响应体会实时扫描泄露的密钥值并实时修订。这种级别的可观测性使我们能够快速检测泄露和故障,并及时修复,让 Centaur 成为自己的 AI SRE。

Centaur 的下一步是什么?

Centaur 的架构有意将一个小型、可审计的核心与一个宽阔的扩展表面分离:

  • 内核:核心(API、防火墙、密钥管理器)
  • 用户空间:工具、工作流和技能。

这种分离使我们最近能够通过夜间反思引入自我改进:智能体审查自己的性能,识别差距,并修复自己的技能和工具,而不触及内核。我们可以让系统自我进化,因为爆炸半径在结构上是受限的。

今天的发布版是 Paradigm 和 Tempo 自一月份以来在生产环境中运行的内核。接下来是让用户空间更强大。我们认为工作流将演变为完整的应用程序容器,即长期运行的服务,它们利用系统的其余部分进行工具访问、密钥管理和可观测性,但运行自己的逻辑。

你可以在不 fork 仓库的情况下,用自己的工具和工作流扩展 Centaur 的用户空间。查看我们的文档。

Centaur 在 Apache 2.0 许可下是 开源的。它已经改变了我们的工作方式,我们希望它也能改变你的。开始使用:https://centaur.run。

如果你是一位出色的 AI 工程师,并希望帮助公开维护和发展 Centaur,或者从事 Paradigm 专有的 AI 工具工作,请联系 georgios@paradigm.xyzarjun@paradigm.xyz

## tools/my-tool/client.py — 这是完整的文件
import httpx

class MyToolClient:
    def search(self, query: str, limit: int = 10) -> dict:
        """搜索某物。"""
        return httpx.get(f"https://api.example.com/search?q={query}&limit={limit}").json()

def _client():
    return MyToolClient()
## workflows/daily_digest.py — 放入此文件即可生效
WORKFLOW_NAME = "daily_digest"

async def handler(inp, ctx):
    data = await ctx.step("fetch", lambda: fetch_metrics())
    await ctx.sleep("wait", timedelta(hours=24))
    await ctx.run_agent("summarize", text=f"总结:{data}")
  • 原文链接: paradigm.xyz/2026/05/ope...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Paradigm
Paradigm
Paradigm 是一家研究驱动型技术投资公司 https://www.paradigm.xyz/