agent-Specialization/doc/TECH_DOC.md
2026-01-05 21:48:55 +08:00

248 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AI Agent 系统技术文档v5.x
> **定位**:多用户、多终端的智能开发助手,用于实验/学习真实开发工作流中的“智能体 + 工具链”。默认每个登录用户拥有独立 Docker 容器CLI 与 Web 共用同一后端核心与工具体系。
> **说明**:本文基于对仓库主要代码 (>80%) 的通读梳理,强调设计意图与实现路径,尽量少贴代码,多用描述/流程/表格呈现。路径均相对仓库根目录 `agents/`。
---
## 目录
1. 系统概览与设计目标
2. 后端架构
3. 前端架构
4. 板块分类(目录/角色)
5. 上下文构建
6. 工具实现
7. 安全与权限模型
8. 部署与运行时架构
9. API 与协议
10. 前端状态管理与路由
11. 工具/能力目录
12. 监控与日志
13. 性能与容量
---
## 1. 系统概览与设计目标
- **设计目标**:为多用户提供可隔离的智能开发环境,覆盖聊天、代码编辑、文件/终端操作、子代理并行、可观测性与上传安全探索不同运行模式fast/thinking/deep的智能体工作方式。
- **核心卖点**
- 单用户独立容器:隔离命令和文件操作。
- 工具链丰富终端、文件、搜索、OCR/VLM、Todo/记忆、子代理。
- 虚拟显示器:前端可回放指针/窗口/右键/进度动画。
- 资源用量面板:实时 CPU/内存/网速/磁盘配额与 token 统计。
- **非生产声明**安全基线密钥治理、CORS、日志脱敏、数据库权限等尚未完全落地仍属实验性。
---
## 2. 后端架构
### 2.1 技术栈与层次
- **语言/框架**Python 3.11Flask + Socket.IO局部使用 asyncio搜索等
- **入口**
- CLI`main.py` → `core/main_terminal.py`
- Web`web_server.py` → `core/web_terminal.py`
- **层次拆分**
1) **会话与工具编排**`core/main_terminal.py` 负责运行模式切换、工具分发、对话生命周期、聚焦文件管理。
2) **能力模块**`modules/` 提供容器、文件、终端、搜索、记忆、待办、子代理、上传安全、个性化、管理员策略、平衡查询等。
3) **通用工具**`utils/`(上下文/对话持久化、日志、工具结果格式化、终端工厂、API 客户端)。
4) **配置**`config/` 按域拆分terminal/model/security/uploads/limits/ui/...),环境变量优先于默认。
### 2.2 请求与执行链路
1. HTTP/Socket 请求由 `web_server.py` 路由完成鉴权、限流、CSRF、请求体校验。
2. 转交 `WebTerminal`(继承 `MainTerminal`)处理:统一的工具指令、对话上下文管理。
3. `MainTerminal` 根据工具名调用 `modules/*` 实际执行,绝大多数操作通过容器代理在用户专属容器内完成。
4. 结果写回上下文(`ContextManager`),经 Socket.IO 推送或 HTTP 响应返回前端。
### 2.3 容器隔离与生命周期
- **创建/复用**`modules/user_container_manager.py` 在用户登录时调用 `ensure_container`,基于 `.env`/`config/terminal.py` 的镜像、网络、CPU/内存配置启动容器;达到并发上限返回“资源繁忙”。
- **文件/命令入口**:所有文件操作走 `container_file_proxy.py`,命令执行走 `terminal_ops.py`/`toolbox_container.py`;宿主机只做卷挂载与日志。
- **回收**:退出或空闲时 `release_container` 杀掉容器;监控采样写入 `logs/container_stats.log`
- **配额**CPU/内存、磁盘(`PROJECT_MAX_STORAGE_MB`),并发容器数 `MAX_ACTIVE_USER_CONTAINERS`
### 2.4 数据与状态
- 用户与工作区:`modules/user_manager.py` 将账号、邀请码、工作区目录记录到 `data/users.json`、`data/invite_codes.json`。
- 对话持久化:`utils/conversation_manager.py` -> `data/conversations/*.json` + `index.json`
- 日志:`logs/`(运行、容器监控、上传扫描等)。
- 个性化/策略:`data/personalization.json`、`config/paths.py` 定位的策略文件等。
---
## 3. 前端架构
### 3.1 技术栈
- Vite + Vue 3 + TypeScriptPinia 状态管理SCSS 样式;无前端路由库,由后端多路径挂载同一 SPA。
### 3.2 入口与构建
- `static/src/main.ts` 创建应用与 Pinia`App.vue` 为根组件。
- 构建:`npm run build` → 产物 `static/dist`,由 Flask `/static/*` 提供;开发监听 `npm run dev`
### 3.3 关键组件/目录
- `components/chat/*`:聊天区、消息渲染、动作/工具反馈。
- `components/chat/monitor/*``MonitorDirector.ts` 驱动虚拟显示器,重放指针/窗口/右键/进度气泡。
- `components/files` / `panels` / `sidebar` / `input`:文件树、资源抽屉、侧栏、输入区。
- 样式/主题:`styles/` 与 `utils/theme.ts`
- 管理与实验:`components/admin`, `components/experiments`
### 3.4 前后端协同
- Socket.IO用于消息流、终端输出、工具进度、监控数据。
- HTTP用于文件列表/上传、对话 CRUD、状态/配额、策略、个性化等。
---
## 4. 板块分类(目录/角色)
- `core/`:终端编排、工具路由、模式控制(`main_terminal.py`, `web_terminal.py`, `tool_config.py`)。
- `modules/`容器、终端、文件、搜索、记忆、Todo、子代理、上传安全、OCR/VLM、管理员策略、平衡查询、个性化、用量统计。
- `utils/`:上下文与对话持久化、日志、工具结果格式化、终端工厂。
- `config/`领域配置terminal/model/security/uploads/limits/ui/...)。
- `static/`:前端源码与构建产物;`chat/monitor` 是虚拟显示器核心。
- `doc/`:安全评审、前端改造记录等。
- `docker/`:终端容器镜像 Dockerfile。
- `data/`、`users/`、`logs/`:运行时数据、用户工作区、日志与监控样本。
---
## 5. 上下文构建
- **核心组件**`utils/context_manager.py`
- 维护对话历史、聚焦文件缓存、Todo/记忆状态、图片存在标记、token 统计。
- 通过 `ConversationManager` 读写 `data/conversations/` 并维护 `index.json` 完整性。
- 支持文件备注与临时文件缓存;聚焦文件内容用于 prompt 聚合。
- 提供 token 累计写入 `data/token_totals.json`,并向前端资源面板提供统计。
- **模型 profile 替换**`config/model_profiles.py` 定义不同模型的系统提示、占位符替换;`MainTerminal` 在初始化时套用,并支持管理员禁用模型。
- **上下文限制**`config/limits.py` 设定最大上下文、文件读取大小、行前后文、匹配条数等,防止大文件压垮模型。
---
## 6. 工具实现
### 6.1 工具分类与开关
- 定义于 `core/tool_config.py`,九类:网络检索、文件编辑、阅读聚焦、实时终端、终端指令、记忆、待办、子智能体、彩蛋。
- 默认启用状态可被管理员策略 (`admin_policy_manager.py`) 或个性化配置覆盖;禁用时可选择静默或提示。
### 6.2 典型工具链路
- **终端类**(实时 / 一次性命令)
- 模块:`modules/terminal_ops.py`, `modules/terminal_manager.py`, `modules/persistent_terminal.py`, `modules/toolbox_container.py`
- 特性:危险命令检测、超时与输出裁剪 (`config/limits.py`)、动态选择 python 命令、容器/主机模式切换;交互式终端会话可订阅输出,快照支持行/字符上限。
- 工具容器:`toolbox_container` 为 `run_command/run_python` 维护独立容器,命令前自动 `cd` 到目标路径。
- **文件类**
- 模块:`modules/file_manager.py` 调用 `modules/container_file_proxy.py`,后者在容器内执行安全脚本,验证路径、限制大小、阻止根目录写入与路径越界。
- 支持创建/删除/重命名/移动/读文件片段/行编辑、计算项目体积(配额检查)。
- **搜索类**
- 模块:`modules/search_engine.py` 调 Tavily支持 topicgeneral/news/finance、时间范围、天数、国家过滤格式化结果并返回。
- **记忆/Todo**
- 模块:`modules/memory_manager.py`, `modules/todo_manager.py`JSON 持久化,生成指导文本注入上下文。
- **子智能体**
- 模块:`modules/sub_agent_manager.py`,可创建/等待/关闭子代理任务,前端并行查看。
- **OCR/VLM**
- 模块:`modules/ocr_client.py`,调用 OpenAI 兼容接口;大小上限 10MB自动推断 MIME支持 VLM 分析与 OCR。
- **上传安全**
- 模块:`modules/upload_security.py`,上传先落地隔离目录,校验大小/后缀,选配 ClamAV 扫描,审计日志按用户分文件记录。
- **管理员策略 / 模型余额**
- `modules/admin_policy_manager.py`:按 global/role/user/invite 合并策略控制工具类别、模型禁用、UI 开关;持久化到 `config.paths.ADMIN_POLICY_FILE`
- `modules/balance_client.py`:读取 `.env`/环境变量查询 Kimi/DeepSeek/Qwen 余额,用于管理面板。
### 6.3 扩展流程(新增工具)
1) 在 `modules/` 实现功能2) 在 `core/main_terminal.py` 注册调用3) 在 `core/tool_config.py` 分组4) 若需前端入口,扩展对应 store/UI5) 在 `.env.example` / `config/*` 补充配置。
---
## 7. 安全与权限模型
- **鉴权/账户**`modules/user_manager.py` 使用 JSON 存储用户与邀请码,密码 PBKDF2 哈希;角色字段支持 admin/user。
- **会话与 CSRF**Flask session`/api/csrf-token` 提供 token写操作校验 CSRF。
- **速率限制**`web_server.py` 对关键接口/登录失败计数做限制(依赖自定义计数器)。
- **上传隔离**`upload_security.py` 强制暂存+扫描+审计;可选启用 ClamAV。
- **容器隔离**:单用户单容器,命令/文件均在容器中执行镜像、网络、CPU、内存、卷绑定受配置限制。
- **管理员策略**可禁用工具类别、模型、UI 区块;前端根据策略隐藏/禁用。
- **已知风险(需生产前修复)**:硬编码密钥/SECRET_KEY、CORS 过宽、本地 JSON 无加密/并发保护、缺少数据库与权限细粒度、日志/上传脱敏不足。详见 `doc/security/security_review.md`
---
## 8. 部署与运行时架构
- **启动流程**
- CLI`python main.py`(交互式选择项目路径/模式)
- Web`python web_server.py`(默认 8091
- 前端静态Flask `/static/*` 直接服务 `static/dist`
- **容器拓扑**
- 宿主机运行 Flask + Socket.IO登录即创建用户容器挂载用户工作区命令/文件/工具均走容器;监控采样写日志并推前端。
- **关键配置**(均可由 `.env` 覆盖):
- 终端/容器:`TERMINAL_SANDBOX_IMAGE/NETWORK/CPUS/MEMORY/MOUNT_PATH/MAX_ACTIVE_USER_CONTAINERS/TERMINAL_SANDBOX_REQUIRE`
- 磁盘:`PROJECT_MAX_STORAGE_MB`(及字节版)
- 上传:`MAX_UPLOAD_SIZE`、`UPLOAD_ALLOWED_EXTENSIONS`、`UPLOAD_CLAMAV_*`
- 模型/API`config/api.py` 中的 AGENT_API_* / 各模型 key
- 安全:`config/security.py` 中的 CORS/安全头;`config/auth.py` 的管理员默认凭据
- **前端构建**`npm install && npm run build`,可 `npm run dev` 监听但不启 Web 服务器。
---
## 9. API 与协议
### 9.1 REST主要路由分组
- 鉴权:`/login` `/register` `/logout` `/api/csrf-token`
- 状态/资源:`/api/status` `/api/container-status` `/api/project-storage` `/api/usage` `/api/thinking-mode`
- 配置/策略/个性化:`/api/tool-settings` `/api/model` `/api/personalization` `/api/admin/policy` `/api/admin/balance` `/api/effective-policy`
- 文件与上传:`/api/files` `/api/gui/files/*`(列表/创建/删除/重命名/复制/移动/上传/下载/批量下载/文本读写)
- 对话:`/api/conversations` CRUD、搜索、压缩、统计、复制、review 导出、token 统计
- Todo/记忆/聚焦:`/api/todo-list` `/api/memory` `/api/focused`
- 监控:`/api/gui/monitor_snapshot`
- 静态/工作区:`/workspace/*` `/user_upload/*` `/static/*`
- 管理面板:`/admin/monitor` `/admin/assets/*`
### 9.2 Socket.IO 事件
- 连接/断开:`connect` / `disconnect`
- 消息与命令:`send_message`(聊天流)、`send_command`(终端输入)
- 终端订阅:`terminal_subscribe` / `terminal_unsubscribe` / `get_terminal_output`
- 任务控制:`stop_task`
- 客户端日志:`client_chunk_log` / `client_stream_debug_log`
### 9.3 返回格式与约定
- REST 多数返回 `{success, data|error}`,错误含 code/message。
- 终端输出/工具进度通过房间广播,通常按用户/会话分组。
- 对话导出使用 `build_review_lines` 生成简化文本(含 tool_call/结果)。
---
## 10. 前端状态管理与路由
- **Pinia stores按域**
- 消息/会话:`chat`, `conversation`, `chatActions`
- 工具/显示器:`tool`, `monitor`
- 资源:`resource`容器状态、token 统计、存储配额,带退避轮询)
- 连接:`connection`Socket 连接/重连)
- 文件/上传:`file`, `upload`
- 其他:`subAgent`, `personalization`, `policy`, `ui`, `input`, `focus`
- **视图切换**:无 vue-router由状态决定显示聊天/虚拟显示器/资源抽屉/文件面板等;后端不同 URL 挂载同一 SPA减少刷新与路由复杂度。
- **显示器动画**`MonitorDirector` 接收工具/终端事件流,驱动鼠标指针、窗口、右键菜单、进度气泡,配合 `progressMap` 映射不同工具的动效。
---
## 11. 工具/能力目录(快速清单)
- 网络检索:`web_search`, `extract_webpage`, `save_webpage`
- 文件编辑:`create_file`, `append_to_file`, `modify_file`, `delete_file`, `rename_file`, `create_folder`
- 阅读聚焦:`read_file`, `focus_file`, `unfocus_file`, `vlm_analyze`, `ocr_image`, `view_image`
- 实时终端:`terminal_session`, `terminal_input`, `terminal_snapshot`, `terminal_reset`, `sleep`
- 终端指令:`run_command`, `run_python`
- 记忆:`update_memory`
- 待办:`todo_create`, `todo_update_task`, `todo_finish`, `todo_finish_confirm`
- 子智能体:`create_sub_agent`, `wait_sub_agent`, `close_sub_agent`
- 彩蛋实验:`trigger_easter_egg`(默认禁用,可静默)
---
## 12. 监控与日志
- **容器监控**`modules/container_monitor.py` 采集 `docker stats/inspect`,写 `logs/container_stats.log`,经 `/api/container-status` 推送;前端计算网速/CPU/内存并呈现资源抽屉。
- **存储配额**`/api/project-storage` 返回已用/上限/百分比,前端定时退避轮询。
- **对话/工具日志**`data/conversations/` 持久化会话与工具调用;`logs/` 记录运行/调试;上传隔离审计按用户写独立日志。
- **虚拟显示器**:无需额外文件,基于实时事件重建动画。
- **平衡查询**`modules/balance_client.py` 提供模型账户余额,用于管理面板。
---
## 13. 性能与容量
- **默认配额**CPU 0.5 / 内存 1GB容器磁盘 `PROJECT_MAX_STORAGE_MB` 默认 2048MB并发容器 `MAX_ACTIVE_USER_CONTAINERS` 默认 8命令超时/输出大小在 `config/limits.py`
- **瓶颈与优化建议**
- Flask/Socket.IO 单进程在高并发下受限,可用多 worker 或拆分执行层FastAPI + 任务队列)。
- Tavily/模型为外部依赖,需缓存、降级与重试策略。
- 卷 IO 与容器冷启动在高频文件/命令场景会拉长延迟,可预热容器/镜像、缓存依赖。
- 监控轮询与虚拟显示器事件在弱网下需扩大间隔;前端已实现退避策略但可进一步按可见性暂停。
- 缺失 CI/CD 与自动化测试,建议补充 lint+pytest+Docker build pipeline 以防回归。
---
### 附:容器基础镜像
- 终端/工具容器镜像使用 `python:3.11-slim`Debian Bookworm 精简版)为基底,详见 `docker/terminal.Dockerfile:1`。系统包安装了 bash/git/build-essential/ssh/zip/unzip/locales/tzdata/iputils-ping 等,虚拟环境位于 `/opt/agent-venv` 并通过 `PATH` 暴露。该镜像可按需重建以适配额外工具。
---
### 结语
本文覆盖系统结构、运行机制、工具链路、前后端协同、安全与运维要点。若需进一步细化(如 API 载荷示例、时序图、部署脚本、常见故障排查),可在此文档基础上增补对应章节。