数据截至 (上游 commit 8fe42dbd0c40)
第 6 章 · AgentOS 服务化平台
前 5 章讲的是「一个 agent/team/workflow 在进程里怎么跑」。这章讲 怎么把它们变成生产服务:
AgentOS接收一组 agent,生成一个完整的 FastAPI 应用——带 REST 端点、流式、权限、调度。这是 Agno 区别于纯「agent 库」的地方。
6.1 它解决的问题
你本地写好了 agent,现在要让前端/其他服务通过 HTTP 调用它:列出会话、发起一次 run、流式拿输出、暂停时人审批、定时跑任务、按用户隔离权限……这些「服务层」的活,AgentOS 全包了。
6.2 入口:AgentOS → get_app()
用法极简(回顾 index 的例子):你把 agent 列表交给 AgentOS,调 get_app() 拿到一个标准 FastAPI app。
# 示意,非源码
from agno.os import AgentOS
os_app = AgentOS(agents=[my_agent], teams=[my_team], workflows=[my_wf])
app = os_app.get_app() # 标准 FastAPI app
# 之后用 uvicorn 跑,或 os_app.serve(...) 一步到位
AgentOS.__init__(os/app.py:230)把三类资源存下来(os/app.py:329-331):
# os/app.py:303 —— AgentOS 持有的三类资源
self.agents = agents # List[Agent | RemoteAgent | AgentProtocol | AgentFactory]
self.teams = teams
self.workflows = workflows
注意类型里有 Remote* 和 *Factory ——意味着资源可以是远程的(跑在别处的 agent)或工厂(运行时再造),不只本地实例。
6.3 路由:50+ 端点是怎么挂上的
_add_built_in_routes(os/app.py:639)把一组 router 逐个加进 app。每个 router 管一类资源:
# os/app.py:515 —— 内建路由逐个挂载(节选)
self._add_router(app, get_health_router(health_endpoint="/health"))
self._add_router(app, get_info_router(self))
self._add_router(app, get_base_router(self, settings=self.settings))
self._add_router(app, get_agent_router(self, settings=self.settings, registry=self.registry))
self._add_router(app, get_team_router(self, settings=self.settings, registry=self.registry))
self._add_router(app, get_workflow_router(self, settings=self.settings))
各 router 的工厂分散在 os/router.py 和 os/routers/(如 approvals 路由 get_approval_router,在 os/app.py:48 import、:473 使用)。每个 router 暴露「列出/获取/运行/管理」这一类资源的端点,合起来就是文档说的 50+ 端点。
结构图(请求怎么找到你的 agent):
HTTP 请求 (POST /agents/{id}/runs)
│
▼
FastAPI app ← AgentOS.get_app()
│ 路由分发
▼
agent_router (os/router.py / os/routers/)
│ 鉴权(RBAC scope)→ 找到对应 Agent
▼
agent.arun(input, ...) ← 第 1 章那条流水线
│
▼
SSE 流 / JSON 响应 ──▶ 客户端
6.4 流式:SSE 与 WebSocket
第 1 章的 streaming 路径(_arun_stream 沿途 yield RunOutputEvent)在这里派上用场:agent router 把这些事件包成 SSE 推给客户端。Workflow 还有专门的 WebSocket 端点(get_websocket_router → workflow_websocket_endpoint,os/router.py:309、:297)。
6.5 RBAC:基于 scope 的权限
AgentOS 内建权限模型,基于 scope 字符串(os/scopes.py)。scope 有三种形态(os/scopes.py:5-7):
| 形态 | 例子 | 含义 |
|---|---|---|
| 全局资源 scope | agents:read | 对某类资源的某动作 |
| 单资源 scope | agents:<id>:run | 对特定资源的某动作 |
| 特殊 scope | admin | 管理员/通配 |
AgentOSScope 枚举(os/scopes.py:38)列出所有合法 scope,ParsedScope(:89)把一个 scope 字符串解析成 (type, resource, resource_id, action),用 is_global_resource_scope / is_per_resource_scope(:100、:105)判断它管哪一层。鉴权基于 JWT(os/auth.py),从 token 里取 scope 比对端点要求。
这套设计支持文档说的「多用户、多租户隔离」——同一个 OS 上不同用户凭 token 里的 scope 只能碰自己被授权的资源。