Logo
热心市民王先生

02-技术架构深度解析

AI Agent 架构设计 技术栈

Suna平台的系统架构、核心组件、技术选型及数据流分析

2.1 整体架构概览

Suna采用微服务风格的分层架构,由四个核心组件构成,通过明确的接口边界实现关注点分离。这种架构设计兼顾了开发效率、运行时隔离和水平扩展能力。

graph TB
    subgraph "Frontend Layer"
        FE[Next.js Dashboard<br/>React + TypeScript]
    end
    
    subgraph "API Layer"
        API[FastAPI Backend<br/>Python + LiteLLM]
    end
    
    subgraph "Runtime Layer"
        AR[Agent Runtime<br/>Docker Containers]
    end
    
    subgraph "Data Layer"
        DB[(Supabase<br/>PostgreSQL + Storage)]
    end
    
    FE <-->|REST/WebSocket| API
    API <-->|gRPC/HTTP| AR
    API <-->|SQL/Realtime| DB
    AR -->|State Persist| DB

2.1.1 架构设计哲学

Suna的架构设计体现了以下核心原则:

  1. 关注点分离:前端、API、运行时、数据层各司其职
  2. 运行时隔离:每个Agent运行在独立的Docker容器中,确保安全
  3. 可扩展性:各组件可独立水平扩展
  4. 开发效率:采用主流技术栈,降低学习成本

2.2 核心组件详解

2.2.1 Backend API(Python/FastAPI)

技术栈:Python 3.11+, FastAPI, LiteLLM, Pydantic

Backend API是Suna平台的核心大脑,负责:

Agent编排与生命周期管理

# 概念性代码展示Agent编排核心逻辑
class AgentOrchestrator:
    async def execute_task(self, agent_id: str, task: Task) -> TaskResult:
        # 1. 加载Agent配置
        agent_config = await self.get_agent_config(agent_id)
        
        # 2. 创建执行线程
        thread = await self.create_thread(agent_id, task)
        
        # 3. 调用LLM进行规划
        plan = await self.llm.plan(task, agent_config.tools)
        
        # 4. 执行计划步骤
        for step in plan.steps:
            result = await self.execute_step(step, thread)
            thread.add_observation(result)
            
        # 5. 返回结果
        return TaskResult(thread=thread, output=thread.get_final_output())

LLM集成(LiteLLM)

Suna通过LiteLLM实现对多厂商LLM的统一调用:

LLM提供商支持状态用途
Anthropic (Claude)✅ 完全支持主力模型,推理能力强
OpenAI (GPT-4)✅ 完全支持通用任务
Groq✅ 支持高速推理
本地模型⚠️ 实验性隐私敏感场景

设计亮点:通过LiteLLM的抽象层,Suna可以在不修改业务代码的情况下切换LLM提供商,便于成本优化和故障转移。

工具系统(Tool System)

工具系统是Suna实现Agent行动能力的关键:

# 工具注册与调用示例
class ToolRegistry:
    def register_tool(self, tool: BaseTool):
        """注册工具到全局注册表"""
        self._tools[tool.name] = tool
    
    async def execute(self, tool_name: str, params: dict) -> ToolResult:
        """执行指定工具"""
        tool = self._tools.get(tool_name)
        if not tool:
            raise ToolNotFoundError(tool_name)
        return await tool.execute(params)

内置工具类别

类别工具示例实现方式
浏览器navigate, click, extractPlaywright + Browserless
文件read_file, write_file, searchPython标准库 + 沙箱
搜索web_search, crawlTavily/Firecrawl API
系统execute_command, run_codeDocker执行环境

2.2.2 Frontend Dashboard(Next.js/React)

技术栈:Next.js 14, React 18, TypeScript, Tailwind CSS, Shadcn UI

Frontend提供可视化的Agent管理和交互界面

核心功能模块

graph LR
    subgraph "Dashboard"
        A[Agent管理] --> B[可视化构建器]
        A --> C[聊天界面]
        B --> D[工具配置]
        C --> E[实时监控]
    end
  1. Agent管理界面

    • Agent列表和状态查看
    • 配置编辑和版本管理
    • 部署控制(启动/停止/重启)
  2. 可视化构建器

    • 拖拽式工具配置
    • 工作流编排界面
    • 提示词模板编辑器
  3. 聊天界面

    • 类ChatGPT的对话体验
    • 实时消息流(WebSocket)
    • 执行过程可视化(思考链、工具调用)

技术亮点

  • Server Components:大量使用Next.js Server Components减少客户端JS体积
  • 实时通信:WebSocket实现Agent执行状态的实时推送
  • 响应式设计:支持桌面和移动设备

2.2.3 Agent Runtime(Docker)

技术栈:Docker, Python, Playwright, 沙箱环境

Agent Runtime是Suna架构中最具特色的部分——每个Agent实例运行在独立的Docker容器中

运行时架构

graph TB
    subgraph "Host Machine"
        subgraph "Agent Container A"
            AA[Agent Process]
            AB[Browser<br/>Playwright]
            AC[File System<br/>Volume Mount]
        end
        
        subgraph "Agent Container B"
            BA[Agent Process]
            BB[Browser<br/>Playwright]
            BC[File System<br/>Volume Mount]
        end
        
        D[Docker Daemon]
    end
    
    D --> AA
    D --> BA

安全隔离机制

隔离维度实现方式安全效果
进程隔离独立Docker容器Agent崩溃不影响其他Agent
网络隔离容器网络命名空间限制Agent的网络访问范围
文件隔离Volume Mount限制Agent只能访问指定目录
资源限制Docker资源配额防止单个Agent耗尽资源

设计优势

  1. 安全性:即使Agent执行恶意代码,影响范围仅限于容器内部
  2. 稳定性:单个Agent的崩溃不会影响平台其他部分
  3. 可扩展性:容器可快速启动和销毁,支持动态扩缩容

2.2.4 Database & Storage(Supabase)

技术栈:PostgreSQL, Supabase Auth, Supabase Storage, Realtime

Supabase为Suna提供一站式数据层

数据模型概览

-- 核心数据表(概念展示)
-- Agent定义表
CREATE TABLE agents (
    id UUID PRIMARY KEY,
    name VARCHAR(255),
    config JSONB,          -- Agent配置(工具、提示词等)
    owner_id UUID,
    created_at TIMESTAMP
);

-- 对话线程表
CREATE TABLE threads (
    id UUID PRIMARY KEY,
    agent_id UUID,
    status VARCHAR(50),    -- running, completed, error
    context JSONB,         -- 对话上下文
    created_at TIMESTAMP
);

-- 执行日志表
CREATE TABLE executions (
    id UUID PRIMARY KEY,
    thread_id UUID,
    tool_name VARCHAR(255),
    input JSONB,
    output JSONB,
    duration_ms INTEGER,
    created_at TIMESTAMP
);

Supabase特性应用

特性用途价值
Auth用户认证和授权内置多因素认证,安全可靠
Row Level Security数据访问控制细粒度的权限管理
Realtime实时数据订阅Agent状态实时推送到前端
Storage文件存储Agent生成的文件持久化

2.3 技术选型分析

2.3.1 为什么选择FastAPI而非Node.js?

Suna前端使用Next.js(Node.js生态),但Backend选择Python/FastAPI,原因包括:

因素Python/FastAPI优势
AI生态Python是AI/ML领域的事实标准,工具库丰富
同步/异步FastAPI原生支持async/await,适合I/O密集型Agent任务
类型安全Pydantic提供强大的数据验证和序列化
开发效率Python代码简洁,快速迭代

2.3.2 为什么选择Supabase而非自建数据库?

因素Supabase优势
开发速度内置Auth、Storage、Realtime,减少自建工作量
开源可自托管符合Suna开源可自托管的定位
PostgreSQL成熟的关系型数据库,支持复杂查询和JSON操作
成本小团队可免费使用,大团队可平滑升级

2.3.3 为什么选择Docker而非进程隔离?

方案Docker优势进程隔离局限
隔离性完整的OS级隔离共享内核,隔离不彻底
可移植性镜像可跨环境运行依赖主机环境
资源管理Docker内置资源限制需要额外的cgroups配置
生态丰富的镜像和工具链需要自建工具

2.4 数据流与执行流程

2.4.1 Agent执行完整流程

sequenceDiagram
    participant U as 用户
    participant F as Frontend
    participant A as FastAPI
    participant D as Docker Runtime
    participant L as LLM Provider
    participant B as Browser/Tool
    participant DB as Supabase

    U->>F: 发送任务
    F->>A: POST /api/execute
    A->>DB: 创建线程记录
    A->>D: 启动Agent容器
    D->>A: 容器就绪
    
    loop 任务执行
        A->>L: 请求LLM决策
        L->>A: 返回下一步动作
        
        alt 需要工具执行
            A->>D: 发送工具调用指令
            D->>B: 执行浏览器/系统操作
            B->>D: 返回执行结果
            D->>A: 返回观察结果
        end
        
        A->>DB: 保存执行日志
        A->>F: WebSocket推送状态
    end
    
    A->>DB: 更新线程状态
    A->>F: 返回最终结果
    F->>U: 展示结果

2.4.2 关键设计模式

模式1:ReAct循环(Reasoning + Acting)

Suna的Agent核心采用ReAct模式:

Thought(思考)→ Action(行动)→ Observation(观察)→ ... → Answer(回答)

这种设计使Agent能够:

  • 显式展示推理过程(可解释性)
  • 根据观察结果动态调整策略(适应性)
  • 错误时自我纠正(鲁棒性)

模式2:工具调用模式(Function Calling)

# LLM决策后返回结构化工具调用
{
    "thought": "我需要搜索最新信息",
    "action": {
        "tool": "web_search",
        "params": {"query": "2026年AI Agent趋势"}
    }
}

优势

  • 结构化输出便于程序解析
  • 与主流LLM的function calling能力对齐
  • 支持工具调用的串行和并行执行

模式3:事件溯源(Event Sourcing)

Suna的线程(Thread)采用事件溯源模式存储执行历史:

interface ThreadEvent {
    id: string;
    type: 'user_message' | 'assistant_message' | 'tool_call' | 'tool_result';
    payload: unknown;
    timestamp: Date;
}

优势

  • 完整的执行历史可追溯
  • 支持从中断点恢复执行
  • 便于调试和审计

2.5 性能与扩展性考量

2.5.1 水平扩展策略

graph TB
    subgraph "Load Balancer"
        LB[Nginx/Traefik]
    end
    
    subgraph "API Cluster"
        API1[FastAPI Instance 1]
        API2[FastAPI Instance 2]
        API3[FastAPI Instance N]
    end
    
    subgraph "Runtime Cluster"
        RT1[Docker Host 1]
        RT2[Docker Host 2]
        RT3[Docker Host N]
    end
    
    LB --> API1
    LB --> API2
    LB --> API3
    API1 --> RT1
    API2 --> RT2
    API3 --> RT3

2.5.2 性能瓶颈分析

组件潜在瓶颈优化方向
LLM调用API延迟、Token限制实现流式响应、本地模型缓存
Browser操作页面加载时间并行执行、无头浏览器优化
Docker启动冷启动延迟预创建容器池、热池技术
数据库高并发写入读写分离、消息队列缓冲

2.6 参考资料