系统架构总览

📎 引用文件

本文引用的文件 - agent/api_server.py - agent/mcp_server.py - frontend/src/main.tsx - desktop/electron/src/main.ts - docker-compose.yml - agent/src/agent/__init__.py - agent/src/agent/loop.py - agent/src/tools/__init__.py - agent/src/agent/tools.py - agent/src/memory/persistent.py - agent/src/session/service.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与可扩展性
  8. 可观测性与监控
  9. 故障排查指南
  10. 结论
  11. 附录:部署拓扑图

简介

本文件为 Vibe-Trading 的系统架构总览,面向产品、研发与运维读者,说明前后端分离的设计模式:React 前端通过 REST API 和 WebSocket/SSE 与 FastAPI 后端通信;Electron 桌面应用作为本地客户端封装并管理后端进程。文档重点阐述 API 网关、Agent 核心、工具注册表、记忆系统与会话管理等关键组件,解释数据流向(用户请求→API 路由→Agent 处理→工具调用→数据获取→结果返回),并给出生产部署拓扑与可观测性建议。

项目结构

graph TB FE["前端 React<br/>Vite"] --> |REST / SSE| API["FastAPI 网关<br/>api_server.py"] DESK["Electron 桌面<br/>main.ts"] --> |进程管理+鉴权| API API --> |路由分发| ROUTES["业务路由模块"] ROUTES --> SESS["会话服务<br/>service.py"] SESS --> LOOP["Agent 核心循环<br/>loop.py"] LOOP --> REG["工具注册表<br/>tools/__init__.py"] REG --> TOOLS["工具实现<br/>BaseTool/ToolRegistry"] LOOP --> MEM["记忆系统<br/>persistent.py"] API --> MCP["MCP 服务器<br/>mcp_server.py"]

图表来源 - agent/api_server.py:163-239 - agent/src/session/service.py:53-91 - agent/src/agent/loop.py:1-12 - agent/src/tools/__init__.py:66-115 - agent/mcp_server.py:1-50

章节来源 - agent/api_server.py:163-239 - frontend/src/main.tsx:1-36 - desktop/electron/src/main.ts:65-117 - docker-compose.yml:1-66

核心组件

章节来源 - agent/api_server.py:127-183 - agent/src/agent/loop.py:1-12 - agent/src/tools/__init__.py:66-115 - agent/src/memory/persistent.py:196-200 - agent/src/session/service.py:53-91

架构总览

整体采用前后端分离与模块化微服务思想: - 前端(React)通过 REST 与 SSE/WebSocket 与后端交互,Electron 作为本地客户端封装后端进程并提供安全边界。 - 后端以 FastAPI 为统一入口,按领域拆分路由模块,内部通过会话服务协调 Agent 循环与工具执行。 - 工具体系支持本地与远程 MCP 工具,便于扩展第三方能力并保持安全隔离。 - 记忆与会话提供跨会话状态与事件流,支撑长时研究与多轮对话。

sequenceDiagram participant U as "用户" participant FE as "前端 React" participant API as "FastAPI 网关" participant S as "会话服务" participant A as "Agent 核心" participant R as "工具注册表" participant T as "工具实现" participant M as "记忆系统" U->>FE : 输入问题/指令 FE->>API : POST /sessions/{id}/messages (REST) API->>S : send_message(session_id, content) S->>A : 调度 AgentLoop A->>R : 解析意图并选择工具 R->>T : 执行工具(读/写批量并行) T-->>A : 工具结果 A->>M : 写入/检索记忆 A-->>S : 生成助手消息/进度 S-->>FE : SSE 事件推送 FE-->>U : 展示结果

图表来源 - agent/src/session/service.py:158-200 - agent/src/agent/loop.py:1-12 - agent/src/tools/__init__.py:66-115 - agent/src/memory/persistent.py:196-200

详细组件分析

API 网关(FastAPI)

flowchart TD Start(["启动 serve_main"]) --> Preflight["运行预检与迁移"] Preflight --> MountRoutes["挂载各功能路由模块"] MountRoutes --> Static["挂载前端静态资源或启动 Vite"] Static --> RunServer["启动 Uvicorn 服务"] RunServer --> Shutdown{"关闭信号?"} Shutdown --> |是| Stop["停止通道与定时任务"] Shutdown --> |否| RunServer

图表来源 - agent/api_server.py:127-183 - agent/api_server.py:321-395

章节来源 - agent/api_server.py:127-183 - agent/api_server.py:321-395

Agent 核心(ReAct 循环)

classDiagram class AgentLoop { +run() +build_context() +execute_tools_parallel() +record_llm_usage() } class ContextBuilder { +build() } class WorkspaceMemory { +read() +write() } class ToolRegistry { +get_definitions() +execute(name, params) } AgentLoop --> ContextBuilder : "构建上下文" AgentLoop --> WorkspaceMemory : "读写记忆" AgentLoop --> ToolRegistry : "调用工具"

图表来源 - agent/src/agent/loop.py:1-12 - agent/src/agent/tools.py:54-95

章节来源 - agent/src/agent/loop.py:1-12 - agent/src/agent/tools.py:54-95

工具注册表

flowchart TD Build["build_registry()"] --> Discover["扫描 BaseTool 子类"] Discover --> RegisterLocal["注册本地工具"] RegisterLocal --> CheckMCP{"是否配置 MCP 服务器?"} CheckMCP --> |否| ReturnReg["返回 ToolRegistry"] CheckMCP --> |是| WrapMCP["构建 MCP 工具包装器"] WrapMCP --> LiveCheck{"是否为活券商通道?"} LiveCheck --> |是| WrapLive["包装并授权检查"] LiveCheck --> |否| AppendMCP["直接追加到注册表"] WrapLive --> AppendMCP AppendMCP --> ReturnReg

图表来源 - agent/src/tools/__init__.py:66-115 - agent/src/tools/__init__.py:155-245

章节来源 - agent/src/tools/__init__.py:66-115 - agent/src/tools/__init__.py:155-245

记忆系统

flowchart TD Write["写入记忆"] --> Lock["获取文件锁"] Lock --> Dedup{"去重命中?"} Dedup --> |是| Update["更新元数据/时间戳"] Dedup --> |否| Create["创建新条目"] Update --> Index["更新索引"] Create --> Index Index --> Unlock["释放锁"]

图表来源 - agent/src/memory/persistent.py:41-73 - agent/src/memory/persistent.py:196-200

章节来源 - agent/src/memory/persistent.py:41-73 - agent/src/memory/persistent.py:196-200

会话管理

sequenceDiagram participant API as "API 路由" participant S as "会话服务" participant E as "事件总线" participant A as "AgentLoop" API->>S : send_message(session_id, content) S->>S : _reserve_session() S->>E : emit("message.received") S->>A : 调度执行 A-->>S : 进度/结果 S->>E : emit("attempt.completed/cancelled/failed")

图表来源 - agent/src/session/service.py:53-91 - agent/src/session/service.py:158-200

章节来源 - agent/src/session/service.py:53-91 - agent/src/session/service.py:158-200

MCP 服务器(可选扩展点)

graph LR Client["MCP 客户端"] --> |HTTP/SSE| HostGuard["Host 守卫中间件"] HostGuard --> OriginGuard["Origin 守卫中间件"] OriginGuard --> FastMCP["FastMCP 应用"] FastMCP --> Tools["工具集合<br/>本地+远程"]

图表来源 - agent/mcp_server.py:131-317 - agent/mcp_server.py:1-50

章节来源 - agent/mcp_server.py:131-317 - agent/mcp_server.py:1-50

前端与 Electron 客户端

graph TB Main["Electron 主进程<br/>main.ts"] --> Window["BrowserWindow"] Main --> Backend["BackendManager"] Backend --> API["FastAPI 后端"] Window --> FE["React 前端"] FE --> |REST/SSE| API

图表来源 - desktop/electron/src/main.ts:65-117 - desktop/electron/src/main.ts:159-192 - frontend/src/main.tsx:1-36

章节来源 - desktop/electron/src/main.ts:65-117 - desktop/electron/src/main.ts:159-192 - frontend/src/main.tsx:1-36

依赖关系分析

graph TB API["API 网关"] --> SESS["会话服务"] SESS --> LOOP["Agent 核心"] LOOP --> REG["工具注册表"] REG --> TOOLS["工具实现"] API --> MCP["MCP 服务器"] API --> ROUTES["路由模块"]

图表来源 - agent/api_server.py:163-239 - agent/src/session/service.py:53-91 - agent/src/agent/loop.py:1-12 - agent/src/tools/__init__.py:66-115

章节来源 - agent/api_server.py:163-239 - agent/src/session/service.py:53-91 - agent/src/agent/loop.py:1-12 - agent/src/tools/__init__.py:66-115

性能与可扩展性

[本节提供通用指导,无需特定文件引用]

可观测性与监控

章节来源 - agent/api_server.py:384-387 - agent/src/agent/loop.py:175-200 - frontend/src/main.tsx:28-35

故障排查指南

章节来源 - agent/src/session/service.py:43-50 - agent/src/tools/__init__.py:136-153 - agent/mcp_server.py:229-286 - agent/api_server.py:371-377

结论

Vibe-Trading 采用前后端分离与模块化设计,通过 FastAPI 统一网关、ReAct Agent 核心、工具注册表、记忆系统与会话管理,实现了高内聚、低耦合的金融研究与交易辅助平台。其优势在于: - 模块化:按领域拆分路由与组件,易于维护与测试。 - 可扩展性:工具注册表支持本地与远程 MCP 工具,灵活接入第三方能力。 - 独立部署:容器化与资源限制保障稳定性,便于横向扩展。 - 可观测性:日志、指标与事件流覆盖全链路,便于监控与排障。

[本节总结性内容,无需特定文件引用]

附录:部署拓扑图

生产环境建议拓扑: - 反向代理(Nginx/云厂商 LB):终止 TLS,转发至后端与前端。 - 后端服务(FastAPI):单实例或多副本,共享卷持久化 runs/sessions/uploads。 - 前端服务(React 静态资源):由后端或 CDN 托管。 - 数据库/缓存(可选):会话索引或缓存加速。 - 外部服务:LLM(本地 Ollama 或云端)、数据源(交易所/行情 API)。

graph TB subgraph "客户端" FE["浏览器/桌面 Electron"] end subgraph "边缘" LB["负载均衡/反向代理"] end subgraph "后端" API["FastAPI 网关"] AGENT["Agent 核心"] REG["工具注册表"] MEM["记忆系统"] SES["会话服务"] end subgraph "外部" LLM["LLM 服务"] DATA["数据源/交易所"] end FE --> LB LB --> API API --> SES SES --> AGENT AGENT --> REG REG --> DATA AGENT --> MEM AGENT --> LLM

图表来源 - docker-compose.yml:1-66 - agent/api_server.py:163-239 - agent/src/session/service.py:53-91 - agent/src/agent/loop.py:1-12 - agent/src/tools/__init__.py:66-115 - agent/src/memory/persistent.py:196-200