# Nova智能体平台
**Repository Path**: agent-dev-team/nova-agent
## Basic Information
- **Project Name**: Nova智能体平台
- **Description**: 支持单Agent、沙箱、编排、监督者、群聊等多模式的通用AI智能体框架,内置浏览器自动化与MCP。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-07-15
- **Last Updated**: 2026-09-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Nova Agent 智能体平台
> 基于 ReAct 范式的 GUI 操作 Agent:让 AI 替你操作浏览器、Windows 桌面和微信,按身份(人设 + 模型 + 工具)组织成一支 AI 员工团队。
## 一、启动方式
**后端 :8000**
```powershell
cd backend
uv sync; uv run python -m main
```
**PC 客户端(Electron + Vue3)**
```powershell
cd pc-client
pnpm install; pnpm dev
```
**后台管理页 :6011**
```powershell
cd admin
pnpm install; pnpm dev
```
**产品官网 :6010**
```powershell
cd official-website
pnpm install; pnpm dev
```
**首次浏览器自动化配置**
```powershell
cd pc-client; uv run python -m playwright install
```
**部署(Docker Compose)**
```powershell
cd admin; pnpm install; pnpm build; cd ../official-website; pnpm install; pnpm build; cd ../backend
export JWT_SECRET=$(openssl rand -hex 32)
export MYSQL_ROOT_PASSWORD=your_strong_password
docker compose up -d --build
```
## 二、架构图
```mermaid
%%{init: {'themeVariables': {'fontSize': '15px', 'fontFamily': 'system-ui, -apple-system, sans-serif', 'primaryTextColor': '#ffffff', 'lineColor': '#94a3b8', 'subgraph': {'titleMargin': 10, 'lineHeight': 1.3}}}}%%
flowchart TD
%% ===== 第一行:后端(横跨两列,单独一行居中) =====
B["后端 数据同步 API 会话 · 任务 · 统计 · 记忆 · 鉴权 · SSE 推送"]
%% ===== 第二行:PC 客户端(左列) | 移动端(右列) =====
subgraph pc_box["PC 客户端"]
direction TB
Main["主进程"]
Renderer["渲染进程 Vue 3"]
end
Mob["移动端
对话 / 任务下发 / 进度"]
%% ===== 第三行:Agent 引擎(左列) | 空占位(右列) =====
subgraph agent_box["Agent 引擎"]
direction LR
StdioLayer["标准输入输出层"]
subgraph core_box["Agent 核心"]
direction TB
AgentCore["Agent 核心 / 工具 / 记忆 / 编排"]
Reporter["统一上报队列"]
end
end
Ghost[" "]
%% ===== 网格布局控制(不可见链接,仅用于对齐) =====
%% 第二行:PC 客户端 与 移动端 横向并排
pc_box ~~~ Mob
%% 第三行:Agent 引擎 与 空占位 横向并排
agent_box ~~~ Ghost
%% 列对齐:后端 → 第二行左右两列
B ~~~ pc_box
B ~~~ Mob
%% 列对齐:第二行 → 第三行左右两列
pc_box ~~~ agent_box
Mob ~~~ Ghost
%% ===== 实际交互连线 =====
StdioLayer -- "stdin/stdout
创建任务
中断任务
鉴权失败通知" --> Main
Main -- "IPC
鉴权失败
其他事件" --> Renderer
StdioLayer -- "调用" --> AgentCore
AgentCore -- "ReportTask" --> Reporter
Reporter -- "HTTP
事件上报
AskHuman数据推送" --> B
%% ===== AskHuman 交互链路 =====
B -- "SSE
AskHuman事件
其他事件" --> Renderer
Renderer -- "HTTP
提交AskHuman答案
获取会话记录" --> B
Renderer -- "IPC
提交AskHuman答案
创建任务" --> Main
Main -- "stdin/stdout
提交AskHuman答案
拉起子进程(token+backend URL)" --> StdioLayer
B -- "SSE
AskHuman事件
其他事件" --> Mob
Mob -- "POST
提交AskHuman答案
创建任务等其他请求" --> B
%% ===== 节点样式 =====
classDef mainNode fill:#4c1d95,stroke:#a78bfa,color:#fff,stroke-width:2px,rx:10,ry:10
classDef rendererNode fill:#1e40af,stroke:#93c5fd,color:#fff,stroke-width:2px,rx:10,ry:10
classDef apiNode fill:#065f46,stroke:#34d399,color:#fff,stroke-width:2px,rx:10,ry:10
classDef coreNode fill:#1e3a5f,stroke:#38bdf8,color:#fff,stroke-width:2px,rx:10,ry:10
classDef reporterNode fill:#78350f,stroke:#fbbf24,color:#fff,stroke-width:2px,rx:10,ry:10
classDef backendNode fill:#374151,stroke:#d1d5db,color:#fff,stroke-width:2px,rx:10,ry:10
classDef mobileNode fill:#7c2d12,stroke:#fb923c,color:#fff,stroke-width:2px,rx:10,ry:10
class Main mainNode
class Renderer rendererNode
class StdioLayer apiNode
class AgentCore coreNode
class Reporter reporterNode
class B backendNode
class Mob mobileNode
%% 空占位节点完全隐藏
style Ghost fill:none,stroke:none,color:transparent
%% subgraph 样式
style pc_box fill:#1e3a8a,stroke:#60a5fa,stroke-width:2px,color:#ffffff
style agent_box fill:#064e3b,stroke:#34d399,stroke-width:2px,color:#ffffff
style core_box fill:#1e3a5f,stroke:#38bdf8,stroke-width:1px,color:#ffffff
```
## 三、项目文件结构
```
nova-agent/
├── pc-client/ # PC 客户端(Electron + Vue3 + TS)
│ ├── agent-engine/ # Python Agent 引擎(本地子进程)
│ │ ├── api/ # FastAPI 对外服务层(server.py / SSE 流式)
│ │ └── core/ # Agent 核心
│ │ ├── agent/ # Agent 类(base / react / toolcall / identity)
│ │ ├── config/ # config.yml / identities.yml / mcp.json
│ │ ├── flow/ # 编排执行(DagFlow / groupchat / orchestration)
│ │ ├── memory/ # 四层记忆 + RAG 向量(embedder / vector_store / manager)
│ │ ├── prompt/ # Prompt 模板(toolcall / planning / browser)
│ │ ├── sandbox/ # 沙箱执行环境
│ │ ├── skill/ # 技能系统(loader / skill 动态加载)
│ │ ├── tool/ # 工具集(browser_use / windows_use / wechat_use / web_search / mcp / python_execute 等)
│ │ ├── utils/ # 工具类(logger / outbox / sync_service / llm_call_tracker)
│ │ └── 根文件 # llm.py / intent.py / cost.py / session_memory.py / global_memory.py / schema.py 等
│ ├── scripts/ # run.ps1 / typecheck.ps1
│ ├── src/ # Electron 前端
│ │ ├── main/ # 主进程(python-process / cloud-relay / window 等)
│ │ ├── preload/ # 预加载脚本
│ │ └── renderer/ # 渲染进程 Vue3(views / components / store / composables / api)
│ ├── electron.vite.config.ts
│ ├── package.json
│ ├── tsconfig.json
│ └── .env.example
│
├── mobile/ # 移动端(原生 Android,Kotlin + Jetpack Compose)
│ ├── app/src/main/java/com/example/mobile/
│ │ ├── data/ApiClient.kt
│ │ └── MainActivity.kt
│ ├── gradle/ # gradle wrapper + libs.versions.toml
│ ├── build.gradle.kts
│ ├── settings.gradle.kts
│ └── README.md
│
├── backend/ # 后端服务(Python FastAPI + Docker,Controller/Service/DAO 三层)
│ ├── config/ # 基础设施:settings(settings.py) / database / security / event_manager / relay_manager + agent.yml
│ │ └── config.example.yml # 配置模板(含密钥占位,启动时复制为 config/config.yml)
│ ├── entity/ # SQLAlchemy 实体(user / session / message / task / feedback 等 12 个)
│ ├── dao/ # 数据访问层(session / task / user / feedback / vector_memory 等 9 个 DAO)
│ ├── services/ # 业务层(session / auth / stats / feedback / customer_knowledge 等 11 个 Service)
│ ├── routers/ # API 路由层 Controller,共 13 个(一文件一原子单元)
│ │ ├── auth.py # 认证:验证码发送/邮箱登录/管理员登录/当前用户(/api/auth)
│ │ ├── stats.py # 统计:登录/模型/费用统计 + LLM/Embedding 上报(/api/stats)
│ │ ├── session.py # 会话 CRUD(/api/sessions)
│ │ ├── task.py # 任务中继 + SSE 事件流(/api/tasks)
│ │ │ # 引擎推送事件 type(→running):task_created / mode_detected / think / act / plan / step_result / related_content / status
│ │ │ # 引擎推送事件 type(→idle):constant—human_input_required / waiting
│ │ │ # 引擎推送事件 type(→idle/failed):complete(→idle)、error(→failed);后端另推 session_status_changed
│ │ ├── task_sync.py # PC 任务数据同步 upsert(/api/tasks-sync)
│ │ ├── greeting.py # 打招呼语 SSE + 预制提问(/api/greeting)
│ │ ├── debug.py # 调试信息上报落盘(/api/debug)
│ │ ├── rag.py # 向量记忆增删查(/api/rag)
│ │ ├── global_memory.py # 全局记忆 CRUD(/api/global-memory)
│ │ ├── eval.py # 评估会话/模型调用/汇总(/api/eval)
│ │ ├── feedback.py # 反馈提交/列表/状态(/api/feedback)
│ │ ├── agent_config.py # Agent 配置读写(/api/config)
│ │ └── customer_knowledge.py # 客服知识库文档 CRUD + 检索(/api/customer-knowledge)
│ ├── filters/ # 过滤器层(auth_filter:请求进入 Controller 前解析 userid)
│ ├── exceptions/ # 异常处理器(errors:业务异常类;handlers:全局异常处理器)
│ ├── utils/ # 工具(email / verification_code / debug_dump)
│ ├── main.py # 应用入口(注册路由 / 过滤器 / 异常处理器)
│ ├── nginx/nginx.conf
│ ├── scripts/ # create_admin.py / migrate_tasks.py
│ ├── docker-compose.yml # 三容器编排(nginx / backend / mysql)
│ ├── Dockerfile
│ ├── pyproject.toml # uv lockfile(uv.lock)
│ ├── run.ps1
│ └── README.md
│
├── admin/ # 后台管理页(Vue3 + TS + SCSS,Vite 构建)
│ ├── src/views/ # Dashboard / Users / CustomerService / ModelUsage / Feedback / Settings / Login
│ ├── src/components/ # StatCard / LoginChart / RecentLoginsTable
│ ├── src/api/ # client / stats / customer_knowledge / feedback / config
│ ├── vite.config.ts
│ ├── tsconfig.json
│ └── package.json
│
├── official-website/ # 产品官网(Vue3 + TS + SCSS,Vite 构建)
│ ├── src/App.vue / main.ts / style.scss
│ ├── vite.config.ts
│ ├── tsconfig.json
│ └── package.json
│
├── cicd/ # CI/CD(Jenkinsfile + Dockerfile.pyright + send-mail.py)
├── eval/ # 量化评测(独立 uv 项目,依赖 httpx + tiktoken)
│ ├── eval_report.py # 评估报告生成器(调用云端 /api/eval/* API,输出自包含 HTML 报告 + 内联 SVG 图表)
│ ├── run_e2e_tests.py # 端到端测试运行器(登录→创建会话→模拟 ReAct→可选自动生成报告)
│ ├── test_cases.json # 测试用例集(case-001~005:简单问答/网页搜索/文件操作/多步任务/代码生成)
│ ├── pyproject.toml # nova-agent-eval 项目配置(Python ≥3.11,uv package=false)
│ ├── uv.lock
│ ├── README.md # 使用说明(命令参数/核心指标/数据来源)
│ └── .gitignore
├── .githooks/ # pre-commit 类型检查
├── .vscode/ # VSCode 配置(launch / settings / tasks)
├── assistant-message-contract.jsonc
├── logo.png # 全项目统一 logo(512x512,内容撑满无透明边距)
├── 项目 ER 图.md
└── README.md
```
## 四、数据库 ER 图
```mermaid
graph LR
U["
| users 用户表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | BIGINT | 用户ID | 主键 自增 |
| email | VARCHAR(255) | 邮箱 | 唯一 |
| username | VARCHAR(64) | 用户名 | 唯一 |
| password_hash | VARCHAR(255) | 密码哈希 | 非空 |
| is_admin | TINYINT(1) | 是否管理员 | 默认0 |
| avatar | VARCHAR(512) | 头像URL | 可空 |
| created_at | DATETIME | 创建时间 | 默认当前 |
| last_login_at | DATETIME | 最近登录 | 可空 |
"]
S["| sessions 会话表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | VARCHAR(64) | 会话ID | 主键 |
| owner | BIGINT | 归属用户 | 外键→users.id |
| title | VARCHAR(255) | 标题 | 默认 新对话 |
| mode | VARCHAR(32) | 模式 | 默认 auto |
| chat_mode | VARCHAR(16) | 聊天模式 | 可空 chat/code |
| work_dir | VARCHAR(255) | 工作目录 | 可空 |
| source | VARCHAR(32) | 调用来源 | 默认 local |
| pinned | TINYINT(1) | 置顶 | 默认0 |
| status | VARCHAR(16) | 状态 | 默认 idle |
| created_at | DATETIME | 创建时间 | |
| updated_at | DATETIME | 更新时间 | 自动更新 |
"]
M["| messages 消息表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | INT | 消息ID | 主键 自增 |
| session_id | VARCHAR(64) | 所属会话 | 外键→sessions.id |
| role | VARCHAR(16) | 消息角色 | 默认 user |
| content | TEXT | 消息内容 | |
| thinking | TEXT | 思考过程 | 可空 |
| task_id | VARCHAR(64) | 关联任务 | 经 task_id 关联 tasks |
| created_at | DATETIME | 创建时间 | |
"]
T["| tasks 任务表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | VARCHAR(64) | 任务ID | 主键 |
| session_id | VARCHAR(64) | 所属会话 | 外键→sessions.id |
| prompt | TEXT | 任务提示词 | 可空 |
| status | VARCHAR(32) | 状态 | 默认 pending |
| model | VARCHAR(64) | 模型 | 可空 |
| steps | JSON | 步骤 | 可空 |
| final_answer | TEXT | 最终答案 | 可空 |
| error | TEXT | 错误信息 | 可空 |
| prompt_tokens | INT | 输入token | 默认0 |
| completion_tokens | INT | 输出token | 默认0 |
| board_id | BIGINT | 关联任务板 | 关联 task_boards.id |
| has_agent_loops | TINYINT(1) | 是否有 Agent 过程 | 默认0 |
| created_at | DATETIME | 创建时间 | |
| updated_at | DATETIME | 更新时间 | 自动更新 |
"]
TB["| task_boards 任务板表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | BIGINT | 记录ID | 主键 自增 |
| task_id | VARCHAR(64) | 关联任务 | 唯一 外键→tasks.id |
| title | VARCHAR(512) | 标题 | 默认空 |
| mode | VARCHAR(32) | 模式 | 默认 multi |
| steps_json | JSON | 步骤快照 | 可空 |
| created_at | DATETIME | 创建时间 | |
"]
AG["| agent_loops Agent 过程表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | BIGINT | 记录ID | 主键 自增 |
| task_id | VARCHAR(64) | 关联任务 | 外键→tasks.id |
| agent_name | VARCHAR(128) | Agent 标识 | 默认空 |
| display_name | VARCHAR(256) | 显示名 | 默认空 |
| step_id | INT | 节点序号 | 可空 |
| loops_json | JSON | ReAct Loop 列表 | 可空 |
| created_at | DATETIME | 创建时间 | |
"]
MU["| model_usage_logs 模型调用日志表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | INT | 日志ID | 主键 自增 |
| call_id | VARCHAR(64) | 上报ID | 唯一 |
| user_id | BIGINT | 调用用户 | 外键→users.id |
| feature | VARCHAR(64) | 功能 | 默认 unknown |
| model | VARCHAR(128) | 模型 | 默认空 |
| model_id | VARCHAR(128) | 模型ID | 默认空 |
| prompt_tokens | INT | 输入token | 默认0 |
| completion_tokens | INT | 输出token | 默认0 |
| total_tokens | INT | 总token | 默认0 |
| cost | FLOAT | 费用 | 默认0 |
| currency | VARCHAR(16) | 币种 | 默认 CNY |
| duration_sec | FLOAT | 耗时 | 默认0 |
| success | TINYINT(1) | 是否成功 | 默认1 |
| status | VARCHAR(16) | 状态 | 默认 completed |
| session_id | VARCHAR(128) | 会话上下文 | 可空 |
| task_id | VARCHAR(128) | 任务上下文 | 可空 |
| agent_name | VARCHAR(64) | Agent 上下文 | 默认空 |
| cycle_step | INT | ReAct 轮次 | 默认0 |
| created_at | DATETIME | 创建时间 | |
| updated_at | DATETIME | 更新时间 | 自动更新 |
"]
LL["| login_logs 登录日志表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | INT | 日志ID | 主键 自增 |
| user_id | BIGINT | 登录用户 | 外键→users.id |
| username | VARCHAR(64) | 用户名 | 非空 |
| ip_address | VARCHAR(45) | 登录IP | 可空 |
| user_agent | VARCHAR(512) | 客户端UA | 可空 |
| success | TINYINT(1) | 是否成功 | 默认1 |
| created_at | DATETIME | 登录时间 | |
"]
F["| feedbacks 用户反馈表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | INT | 反馈ID | 主键 自增 |
| user_id | INT | 反馈用户 | 关联 users.id |
| username | VARCHAR(64) | 用户名 | 默认 anonymous |
| content | TEXT | 反馈内容 | 非空 |
| images | TEXT | 配图URL | 非空 |
| status | VARCHAR(20) | 处理状态 | 默认 pending |
| created_at | DATETIME | 创建时间 | |
"]
GM["| global_memories 全局记忆表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | INT | 记忆ID | 主键 自增 |
| user_id | INT | 记忆用户 | 关联 users.id |
| category | VARCHAR(64) | 分类 | 默认 general |
| content | TEXT | 记忆内容 | 非空 |
| created_at | DATETIME | 创建时间 | |
| updated_at | DATETIME | 更新时间 | 自动更新 |
"]
VM["| vector_memories 向量记忆表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | INT | 记忆ID | 主键 自增 |
| user_id | INT | 记忆用户 | 关联 users.id |
| content | TEXT | 记忆内容 | 非空 |
| embedding | JSON | 向量 | 可空 |
| meta | JSON | 元数据 | 可空 |
| created_at | DATETIME | 创建时间 | |
"]
KD["| customer_knowledge_docs 客服知识文档表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | INT | 文档ID | 主键 自增 |
| title | VARCHAR(255) | 文档标题 | 默认空 |
| category | VARCHAR(64) | 分类 | 默认 general |
| content | TEXT | 文档内容 | 非空 |
| status | VARCHAR(16) | 状态 | 默认 pending |
| chunk_count | INT | 切片数 | 默认0 |
| error | TEXT | 切分错误 | 非空 |
| created_at | DATETIME | 创建时间 | |
| updated_at | DATETIME | 更新时间 | 自动更新 |
"]
KC["| customer_knowledge_chunks 客服知识切片表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | INT | 切片ID | 主键 自增 |
| doc_id | INT | 所属文档 | 外键→customer_knowledge_docs.id |
| chunk_index | INT | 切片序号 | 默认0 |
| content | TEXT | 切片内容 | 非空 |
| embedding | JSON | 向量 | 可空 |
| created_at | DATETIME | 创建时间 | |
"]
SMC["| session_memory_checkpoints 续聊记忆检查点表 |
| 字段名 | 类型 | 描述 | 约束 |
| id | BIGINT | 记录ID | 主键 自增 |
| session_id | VARCHAR(64) | 关联会话 | 唯一 外键→sessions.id |
| compressed_records | JSON | 压缩后的检查点前会话记录 | 默认[] |
| checkpoint_index | INT | 检查点索引(原始消息列表) | 默认0 |
| created_at | DATETIME | 创建时间 | |
| updated_at | DATETIME | 更新时间 | 自动更新 |
"]
U --- u1(("1")) --- u2(("n")) --- S
U --- u3(("1")) --- u4(("n")) --- LL
U --- u5(("1")) --- u6(("n")) --- MU
U --- u7(("1")) --- u8(("n")) --- F
U --- u9(("1")) --- u10(("n")) --- GM
U --- u11(("1")) --- u12(("n")) --- VM
S --- s1(("1")) --- s2(("n")) --- M
S --- s3(("1")) --- s4(("n")) --- T
S --- s5(("1")) --- s6(("1")) --- SMC
T --- t1(("1")) --- t2(("1")) --- TB
T --- t3(("1")) --- t4(("n")) --- AG
KD --- k1(("1")) --- k2(("n")) --- KC
style U fill:none,stroke:none
style S fill:none,stroke:none
style M fill:none,stroke:none
style T fill:none,stroke:none
style TB fill:none,stroke:none
style AG fill:none,stroke:none
style MU fill:none,stroke:none
style LL fill:none,stroke:none
style F fill:none,stroke:none
style GM fill:none,stroke:none
style VM fill:none,stroke:none
style KD fill:none,stroke:none
style KC fill:none,stroke:none
style SMC fill:none,stroke:none
```