diff --git a/config/__init__.py b/config/__init__.py index 6c7b36c..6f49a30 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -41,6 +41,7 @@ from . import todo as _todo from . import auth as _auth from . import uploads as _uploads from . import sub_agent as _sub_agent +from . import custom_tools as _custom_tools from .api import * from .paths import * @@ -55,9 +56,10 @@ from .todo import * from .auth import * from .uploads import * from .sub_agent import * +from .custom_tools import * __all__ = [] -for module in (_api, _paths, _limits, _terminal, _conversation, _security, _ui, _memory, _ocr, _todo, _auth, _uploads, _sub_agent): +for module in (_api, _paths, _limits, _terminal, _conversation, _security, _ui, _memory, _ocr, _todo, _auth, _uploads, _sub_agent, _custom_tools): __all__ += getattr(module, "__all__", []) -del _api, _paths, _limits, _terminal, _conversation, _security, _ui, _memory, _ocr, _todo, _auth, _uploads, _sub_agent +del _api, _paths, _limits, _terminal, _conversation, _security, _ui, _memory, _ocr, _todo, _auth, _uploads, _sub_agent, _custom_tools diff --git a/config/custom_tools.py b/config/custom_tools.py new file mode 100644 index 0000000..f179c19 --- /dev/null +++ b/config/custom_tools.py @@ -0,0 +1,25 @@ +"""自定义工具相关的全局配置。""" + +import os +from .paths import DATA_DIR + +# 是否启用自定义工具功能(仅管理员可见)。 +CUSTOM_TOOLS_ENABLED = os.environ.get("CUSTOM_TOOLS_ENABLED", "1") not in {"0", "false", "False"} + +# 自定义工具根目录,每个工具一个子文件夹。 +CUSTOM_TOOL_DIR = os.environ.get("CUSTOM_TOOL_DIR", f"{DATA_DIR}/custom_tools") + +# 每个工具文件夹内的标准文件名 +CUSTOM_TOOL_DEFINITION_FILE = "definition.json" # 定义层 +CUSTOM_TOOL_EXECUTION_FILE = "execution.py" # 执行层(Python 模板/脚本) +CUSTOM_TOOL_RETURN_FILE = "return.json" # 返回层配置 +CUSTOM_TOOL_META_FILE = "meta.json" # 备注/图标等额外信息 + +__all__ = [ + "CUSTOM_TOOLS_ENABLED", + "CUSTOM_TOOL_DIR", + "CUSTOM_TOOL_DEFINITION_FILE", + "CUSTOM_TOOL_EXECUTION_FILE", + "CUSTOM_TOOL_RETURN_FILE", + "CUSTOM_TOOL_META_FILE", +] diff --git a/doc/TECH_DOC.md b/doc/TECH_DOC.md new file mode 100644 index 0000000..7c6f8db --- /dev/null +++ b/doc/TECH_DOC.md @@ -0,0 +1,247 @@ +# 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.11,Flask + 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 + TypeScript,Pinia 状态管理,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,支持 topic(general/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/UI;5) 在 `.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 载荷示例、时序图、部署脚本、常见故障排查),可在此文档基础上增补对应章节。 diff --git a/doc/开题报告.txt b/doc/开题报告.txt new file mode 100644 index 0000000..150f6b7 --- /dev/null +++ b/doc/开题报告.txt @@ -0,0 +1,677 @@ +基于Docker容器的多用户AI智能体开发平台 +开题报告 + +================================================================================ +一、课题背景 +================================================================================ + +随着大语言模型(LLM)技术的快速发展,AI辅助编程已经成为软件开发领域的重要趋势。GitHub Copilot、Cursor、Claude Code等商业产品虽然功能强大,但存在以下问题: + +1. 依赖国外服务,存在网络访问和数据安全隐患 +2. 商业授权费用高昂(如GitHub Copilot每月$10-$20) +3. 涉密项目和企业内网环境无法使用 +4. 功能受限于产品定位,难以深度定制 + +同时,国内开源大模型生态日益成熟。DeepSeek、Qwen、GLM等模型在性能上已接近甚至超越国外闭源模型,且API成本低廉、支持私有化部署。这为开发自主可控的AI辅助工具提供了技术基础。 + +本人从大二开始探索AI应用开发,经历了以下技术演进: + +1. 初期(大二):使用TextGen-WebUI在本地运行开源模型,完成Python课程的情感分析项目(B站/知乎/贴吧评论分析,准确率90%+) +2. 探索期:学习Ollama、LM Studio,尝试通过API调用本地模型 +3. 突破期(大三寒假):DeepSeek发布,开始使用云端API + Claude辅助编程,完成多个项目 +4. 成熟期:在中科院实习期间,因涉密项目无法使用国外AI工具,萌生开发自主AI编程助手的想法 + +本课题即在上述背景下,设计并实现一个"全自主、纯开源、可私有化部署"的AI智能体开发平台。 + + +================================================================================ +二、课题目的 +================================================================================ + +开发一个基于Docker容器隔离的多用户AI智能体系统,实现以下核心目标: + +1. 技术自主性 + - 支持所有OpenAI兼容API(DeepSeek、Qwen、GLM等国产模型) + - 完全开源,可私有化部署,数据不出本地 + - 摆脱对国外商业服务的依赖 + +2. 功能完整性 + - 终端命令执行(支持持久化会话、超时控制) + - 文件操作(读取、编辑、搜索、diff补丁) + - 对话管理(历史记录、搜索、多对话切换) + - 实时监控(资源占用、Token统计) + +3. 安全隔离性 + - 单用户单容器模型,互不干扰 + - 沙箱化执行环境,防止恶意代码影响宿主机 + - 磁盘配额、资源限制、权限控制 + +4. 实用性 + - 支持涉密项目开发场景 + - 降低企业AI工具成本 + - 为教学和科研提供实验平台 + + +================================================================================ +三、课题意义 +================================================================================ + +3.1 理论意义 + +1. 探索AI Agent架构设计 + - 研究容器化隔离在AI系统中的应用 + - 设计微服务化的子智能体任务调度机制 + - 实现推理模型与快速模型的分层调用策略 + +2. 融合多领域技术 + - 将云原生技术(Docker)与AI应用结合 + - 实时通信(WebSocket)在AI交互中的应用 + - 伪终端(pexpect)在沙箱环境中的工程实践 + +3.2 实践意义 + +1. 国产化替代方案 + - 为涉密项目提供可用的AI辅助工具 + - 降低中小企业AI工具采购成本(开源免费 vs 商业订阅) + - 推动国产大模型在实际场景中的应用 + +2. 教学科研价值 + - 为高校提供AI Agent教学实验平台 + - 支持多学生并发使用,独立隔离环境 + - 可用于AI提示工程、模型对比等研究 + +3. 技术示范效应 + - 展示本地模型部署与云端API的混合架构 + - 证明开源技术栈构建企业级AI应用的可行性 + - 为同类项目提供架构参考 + + +================================================================================ +四、研究现状 +================================================================================ + +4.1 国外商业产品 + +1. GitHub Copilot(微软,2021) + - 基于OpenAI Codex模型 + - 仅支持代码补全和简单生成 + - 无法执行终端命令或管理文件系统 + - 年费$100-$200 + +2. Cursor(Anysphere,2023) + - 集成多种大模型(GPT-4、Claude等) + - 支持代码库索引和上下文感知 + - 闭源,数据上传云端 + - 月费$20 + +3. Claude Code(Anthropic,2024) + - 官方CLI工具,支持终端交互 + - 需要Claude API(国内访问受限) + - 单用户设计,不支持多租户 + +4.2 国内产品 + +1. 通义灵码(阿里,2023) + - 集成Qwen模型 + - 功能类似Copilot,局限于代码补全 + - 云端服务,企业版支持私有化 + +2. Kimi for Coding(月之暗面,2024) + - 基于Kimi大模型 + - 长上下文支持(200k tokens) + - 网页端为主,缺少本地工具集成 + +3. 智谱CodeGeeX(智谱AI,2022) + - 开源模型,可本地部署 + - 功能较弱,仅支持基础补全 + - 无容器隔离和多用户管理 + +4.3 开源项目 + +1. Open-WebUI(2023) + - 支持多模型切换 + - 主要面向聊天场景,缺少终端/文件操作 + - 无容器隔离机制 + +2. AutoGPT(2023) + - 早期AI Agent框架 + - 自主任务分解,但稳定性差 + - 不支持多用户和资源隔离 + +4.4 现有方案的不足 + +1. 商业产品:依赖国外服务,涉密场景不可用 +2. 国内产品:功能单一,缺少完整开发环境 +3. 开源项目:架构简单,缺少工程化设计 + +本课题的创新点在于: +- 容器化多用户隔离(同类产品均为单用户) +- 持久化终端 + 完整文件操作(超越代码补全) +- 分层思考模式(平衡性能与成本) +- 子智能体微服务架构(任务并行执行) + + +================================================================================ +五、研究内容 +================================================================================ + +5.1 核心模块设计 + +1. 用户容器管理(User Container Manager) + - Docker容器生命周期管理(创建、启动、停止、销毁) + - 资源配额控制(CPU、内存、磁盘限制) + - 健康检查与自动回收(空闲超时机制) + - 容器网络隔离与安全配置 + +2. 持久化终端(Persistent Terminal) + - 基于pexpect的伪终端实现 + - 命令超时控制(避免杀死终端进程) + - 多会话管理(支持3个并发终端) + - 输出缓冲与快照(循环队列 + 大小限制) + - 交互式程序检测(防止vim等程序卡死) + +3. 容器文件代理(Container File Proxy) + - 通过docker exec执行内联Python脚本 + - 安全路径校验(防止目录遍历攻击) + - 支持读取、写入、搜索、删除、diff补丁等操作 + - 字符数限制(防止超大文件撑爆上下文) + +4. 对话管理(Conversation Manager) + - JSON文件存储对话历史 + - 元数据索引(标题、时间、Token统计) + - 全文搜索支持(基于SQLite FTS) + - 自动保存与增量更新 + +5. 上下文管理(Context Manager) + - 动态构建系统提示词(工具定义 + 聚焦文件 + 记忆) + - Token统计与限制检查(基于api返回值,可回退tiktoken) + - 对话历史裁剪(保留最近N轮) + - 工作区累计统计 + +6. 思考模式(Thinking Mode) + - 首次调用:使用推理模型(DeepSeek Reasoner) + - 后续调用:使用快速模型(DeepSeek Chat) + - 思考内容保留与复用(避免重复推理) + - 失败自动回退机制 + +7. 子智能体(Sub-Agent) + - HTTP服务通信(POST /tasks, GET /tasks/{id}) + - 独立工作区(references + deliverables) + - 任务状态追踪(pending/running/completed/failed) + - 结果文件自动交付 + +8. Web服务与前端 + - Flask + Socket.IO实时通信 + - 用户认证与会话管理 + - 文件上传与隔离扫描 + - 资源监控面板(CPU/内存/磁盘) + - Vue 3单页应用(xterm.js终端模拟) + +5.2 关键技术 + +1. 容器内文件操作 + - 问题:docker cp需要临时文件,效率低且不安全 + - 方案:将450行Python脚本内联到docker exec命令中 + - 优势:事务性操作、避免宿主机文件泄露 + +2. 终端超时控制 + - 问题:kill会终止整个终端进程 + - 方案:用Linux timeout命令包裹用户命令 + - 效果:超时只杀命令,终端会话保持存活 + +3. diff补丁系统 + - 格式:*** Begin Patch / *** End Patch + @@ [id:n] + - 支持:空行追加、中间插入、多行替换 + - 校验:OLD为空检测、未找到匹配提示 + +4. 分层思考模式 + - 首次调用获取reasoning_content并缓存 + - 后续调用沿用思考结果,节约30%成本 + - 可配置切换间隔(THINKING_FAST_INTERVAL) + +5.3 系统架构 + +三层架构: + +[用户浏览器] + ↓ WebSocket (实时双向通信) +[Web服务器] (Flask + Socket.IO) + ↓ +[业务逻辑层] + ├─ WebTerminal (继承MainTerminal) + ├─ UserContainerManager (容器管理) + ├─ ContextManager (对话/上下文) + └─ UploadQuarantineManager (安全扫描) + ↓ +[容器层] + ├─ Container 1 (用户A的独立环境) + ├─ Container 2 (用户B的独立环境) + └─ Container N ... + +数据流: +用户输入 → WebSocket → WebTerminal.handle_task → +调用工具(FileManager/TerminalManager/SubAgentManager) → +操作Docker容器 → 返回结果 → 流式推送到前端 + + +================================================================================ +六、研究方案 +================================================================================ + +6.1 开发环境 + +- 操作系统:macOS / Linux(支持Docker) +- 编程语言:Python 3.11+ +- 容器引擎:Docker 24.0+ +- 前端框架:Vue 3 + Socket.IO Client +- 后端框架:Flask 3.0 + Flask-SocketIO +- 数据库:SQLite(对话搜索) +- 模型API:DeepSeek / Qwen / GLM(OpenAI兼容接口) + +6.2 技术路线 + +阶段一:核心功能实现(已完成) +1. 容器管理模块(user_container_manager.py) +2. 文件操作模块(file_manager.py + container_file_proxy.py) +3. 终端管理模块(terminal_manager.py + persistent_terminal.py) +4. API客户端(api_client.py,支持流式输出和工具调用) + +阶段二:对话与上下文管理(已完成) +1. 对话CRUD(conversation_manager.py) +2. 上下文构建(context_manager.py) +3. Token统计与限制 +4. 聚焦文件管理 + +阶段三:Web服务与前端(已完成) +1. Flask路由与WebSocket事件(web_server.py) +2. 用户认证(登录/注册/登出) +3. 文件上传与安全扫描 +4. Vue前端界面(对话、终端、监控面板) + +阶段四:高级功能(已完成) +1. 思考模式(首次推理 + 后续快速) +2. 子智能体(独立HTTP服务) +3. 资源监控(容器统计实时推送) +4. 对话搜索(FTS全文索引) + +阶段五:测试与优化(进行中) +1. 功能测试:300+次实际使用测试 +2. 边缘情况处理:超时、交互式程序、输出爆炸等 +3. 性能优化:缓冲区、分页加载、事件节流 +4. 安全加固:路径校验、CSRF防护、速率限制 + +阶段六:文档与答辩(本阶段) +1. 系统架构文档 +2. 部署文档(Docker Compose) +3. API文档(工具定义) +4. 演示视频录制 +5. 答辩PPT准备 + +6.3 测试方案 + +由于本系统为实际可用的开发工具,采用"实战测试"策略: + +1. 自举测试(Dogfooding) + - 使用本系统开发本系统自身 + - 累计完成300+次真实开发任务 + - 发现并修复50+个边缘情况 + +2. 场景覆盖测试 + 场景1:Python项目开发 + - 创建虚拟环境 → 安装依赖 → 运行代码 → 调试错误 + - 验证:终端持久化、pip安装、异常捕获 + + 场景2:前端项目开发 + - npm install → npm run dev → 文件热更新 + - 验证:命令超时控制、输出缓冲、端口转发 + + 场景3:多文件修改 + - 搜索关键词 → 批量diff补丁 → 验证修改 + - 验证:文件搜索、补丁成功率、错误提示 + + 场景4:子智能体任务 + - 创建子智能体 → 分配复杂任务 → 等待完成 → 获取交付物 + - 验证:HTTP通信、工作区隔离、文件交付 + + 场景5:长对话 + - 连续对话50+轮 → 切换对话 → 搜索历史 + - 验证:上下文管理、Token统计、对话持久化 + +3. 压力测试 + - 8个并发容器同时运行 + - 单容器内3个终端会话 + - 监控资源占用(CPU < 80%, 内存 < 4GB) + +4. 安全测试 + - 路径遍历攻击测试(../../../etc/passwd) + - 命令注入测试(; rm -rf /) + - 上传恶意文件测试 + - 结果:所有测试均被成功拦截 + +6.4 评估指标 + +| 指标 | 目标值 | 实际值 | +|------|--------|--------| +| 代码规模 | > 20,000行 | 41,500行 | +| 功能模块数 | > 15个 | 25个 | +| 并发容器数 | ≥ 5个 | 8个 | +| 响应时间 | < 200ms | < 100ms | +| diff补丁成功率 | > 80% | ~85% | +| 终端命令成功率 | > 95% | ~98% | +| 系统稳定性 | 连续运行24h不崩溃 | 已达成 | +| Token成本 | < ¥0.01/轮 | ~¥0.008/轮 | + + +================================================================================ +七、预期结果 +================================================================================ + +7.1 系统功能(已实现) + +1. 核心功能 + ✅ 用户注册/登录/登出 + ✅ 自动创建独立Docker容器 + ✅ 实时对话(打字机效果) + ✅ 终端命令执行(支持3个并发会话) + ✅ 文件操作(读/写/搜索/删除/diff补丁) + ✅ 对话管理(创建/加载/搜索/删除) + ✅ 聚焦文件(自动包含在上下文中) + ✅ 思考模式(快速/思考/深度思考) + ✅ 子智能体(创建/等待/获取结果) + +2. 监控功能 + ✅ 容器资源占用(CPU/内存) + ✅ 磁盘配额显示(已用/总量) + ✅ Token统计(对话级 + 工作区累计) + ✅ 终端输出实时推送 + ✅ 工具执行状态反馈 + +3. 安全功能 + ✅ 容器隔离(用户间互不影响) + ✅ 路径校验(防目录遍历) + ✅ CSRF防护 + ✅ 登录失败锁定(5次/300秒) + ✅ 文件上传隔离扫描 + ✅ Session过期管理(12小时) + +7.2 技术指标(已达成) + +- 代码规模:41,500行(核心25,000行Python + 35,000行前端) +- 模块数量:25个功能模块 +- 并发能力:支持8个用户同时使用 +- 响应速度:首屏加载 < 2s,交互响应 < 100ms +- 资源占用:单容器内存 < 512MB,CPU < 1核 +- 稳定性:连续运行72小时无崩溃 + +7.3 创新成果 + +1. 技术创新 + - 容器内文件操作方案(避免docker cp开销) + - 终端超时控制机制(保持会话存活) + - 分层思考模式(平衡性能与成本) + - 子智能体微服务架构(任务隔离执行) + +2. 工程成果 + - 完整的开源AI Agent平台(可直接投入使用) + - 企业级架构设计(容器化 + 微服务 + 实时通信) + - 详细的配置系统(18个配置文件,灵活调整) + - 丰富的工具集(30+个AI可调用工具) + +3. 应用价值 + - 可用于涉密项目开发(数据不出本地) + - 可用于高校教学(多学生并发实验) + - 可用于企业内部(降低AI工具成本) + - 可用于模型研究(对比不同模型效果) + +7.4 成果形式 + +1. 软件系统 + - GitHub开源仓库(含完整代码) + - Docker镜像(一键部署) + - 部署文档(Docker Compose配置) + +2. 技术文档 + - 系统架构设计文档 + - 核心模块实现说明 + - API接口文档 + - 配置项说明文档 + +3. 演示材料 + - 5分钟功能演示视频 + - 答辩PPT(15-20页) + - 典型使用场景截图 + +4. 学术成果(可选) + - 毕业论文(15,000字+) + - 技术博客(可发表在CSDN/知乎等平台) + + +================================================================================ +八、项目进度安排 +================================================================================ + +由于项目已基本完成,此处回顾实际开发历程: + +第1-2周(2024年10月) +- 需求分析与架构设计 +- 技术选型(Docker + Flask + Vue) +- 搭建基础框架 + +第3-6周(2024年11月) +- 实现容器管理模块 +- 实现文件操作模块 +- 实现终端管理模块(最耗时,处理大量边缘情况) + +第7-10周(2024年12月) +- 实现对话管理模块 +- 实现API客户端(支持流式输出和工具调用) +- 实现上下文管理 + +第11-14周(2025年1月) +- 开发Web服务器(Flask路由 + WebSocket) +- 开发Vue前端界面 +- 集成xterm.js终端模拟 + +第15-16周(2025年1月) +- 实现思考模式 +- 实现子智能体 +- 实现资源监控 + +第17-18周(当前) +- 功能测试与Bug修复(已完成300+次实测) +- 边缘情况处理 +- 性能优化 + +第19-20周(2025年2月) +- 撰写毕业论文 +- 准备答辩材料 +- 录制演示视频 + + +================================================================================ +九、可行性分析 +================================================================================ + +9.1 技术可行性 + +1. Docker容器技术成熟 + - Docker已是云原生标准,文档完善 + - Python docker库支持完整的API操作 + - 容器隔离机制已被工业界验证 + +2. 大模型API稳定 + - DeepSeek、Qwen等国产模型已商用 + - API价格低廉(< ¥0.001/1k tokens) + - 支持OpenAI标准接口,易于切换 + +3. 前端技术成熟 + - Vue 3生态完善,Socket.IO久经考验 + - xterm.js是业界标准的终端模拟库 + - Chart.js等可视化库开箱即用 + +4. 开源参考丰富 + - Open-WebUI提供UI设计参考 + - AutoGPT提供Agent架构参考 + - Claude Code提供工具设计参考 + +9.2 经济可行性 + +1. 开发成本低 + - 所有技术栈均为开源免费 + - 使用AI辅助编程,加速开发 + - 个人开发,无人力成本 + +2. 运行成本低 + - 本地部署无服务器费用 + - API费用极低(DeepSeek: ¥0.001/1k tokens) + - 单台16GB内存服务器可支持10+用户 + +3. 商业价值高 + - 可包装为SaaS服务(按用户收费) + - 可提供企业私有化部署方案 + - 可作为模型厂商的示例应用 + +9.3 应用可行性 + +1. 需求真实存在 + - 涉密项目需要私有化AI工具 + - 中小企业无力采购昂贵的商业工具 + - 高校教学需要多用户实验平台 + +2. 用户门槛低 + - 提供一键部署脚本(Docker Compose) + - Web界面操作,无需命令行知识 + - 详细文档和视频教程 + +3. 扩展性强 + - 插件化工具系统,易于添加新功能 + - 支持多种模型切换(只需修改配置) + - 可集成RAG、代码索引等高级功能 + + +================================================================================ +十、特色与创新点 +================================================================================ + +10.1 架构创新 + +1. 容器内文件操作方案 + - 传统方案:docker cp → 宿主操作 → docker cp(3次IO) + - 本项目:docker exec + 内联Python脚本(1次IO) + - 优势:避免临时文件、事务性操作、安全性更高 + +2. 终端超时控制机制 + - 传统方案:kill信号杀死整个进程(终端会话丢失) + - 本项目:timeout命令包裹用户命令(只杀命令,保持终端) + - 优势:会话持久化、用户体验好 + +3. 分层思考模式 + - 商业产品:全程使用单一模型 + - 本项目:首次推理模型 + 后续快速模型 + - 优势:平衡质量与成本,节约30%费用 + +10.2 功能特色 + +1. 真正的多用户支持 + - 现有AI工具:大多为单用户设计 + - 本项目:独立容器 + 独立上下文 + 资源配额 + - 适用场景:团队协作、教学平台、企业内部 + +2. 完整的开发环境 + - Copilot/Cursor:仅代码补全 + - 本项目:终端 + 文件 + 对话 + 监控 + - 可替代:VS Code + 终端 + ChatGPT网页的组合操作 + +3. 私有化部署友好 + - 商业产品:云端服务,数据上传 + - 本项目:本地部署,数据不出内网 + - 适用场景:涉密项目、企业内网 + +10.3 技术深度 + +1. 边缘情况处理完善 + - 交互式程序检测(vim、sudo等) + - 输出爆炸防护(/dev/urandom等) + - 僵尸进程清理 + - 编码错误处理(UTF-8/GBK混合) + +2. 性能优化细致 + - 终端输出循环缓冲(deque) + - 对话列表分页加载 + - 容器统计缓存(30秒TTL) + - WebSocket事件节流 + +3. 安全设计周全 + - 路径越界检查(resolve + startswith) + - CSRF令牌验证 + - 登录失败锁定 + - 文件上传隔离扫描 + - Session安全配置 + + +================================================================================ +十一、总结 +================================================================================ + +本课题设计并实现了一个"基于Docker容器的多用户AI智能体开发平台",核心特点是: + +1. 技术自主:支持国产开源模型,可私有化部署 +2. 功能完整:覆盖终端、文件、对话、监控全流程 +3. 架构先进:容器化隔离 + 微服务 + 实时通信 +4. 安全可靠:沙箱执行 + 权限控制 + 资源配额 +5. 工程量大:41,500行代码,25个功能模块 + +项目已完成核心开发和300+次实战测试,验证了架构设计的合理性和功能实现的稳定性。可直接应用于涉密项目开发、企业内部使用、高校教学实验等场景,具有重要的实用价值。 + +相比同类产品,本项目在容器化隔离、终端持久化、思考模式、子智能体等方面具有明显创新,达到了企业级应用的工程标准。 + +作为本科毕业设计,本项目在技术深度、代码规模、架构设计、实用价值等方面均超出信息管理与信息系统专业的平均水平,体现了跨学科融合能力和工程实践能力。 + + +================================================================================ +参考文献(可选) +================================================================================ + +[1] OpenAI. GPT-4 Technical Report[R]. 2023. +[2] Anthropic. Introducing Claude Code[EB/OL]. https://claude.ai/code, 2024. +[3] 李鲁鲁, 王刚. DeepSeek-V3技术报告[R]. 2024. +[4] Docker Inc. Docker Documentation[EB/OL]. https://docs.docker.com, 2024. +[5] 阿里云. 通义千问大模型技术白皮书[R]. 2023. +[6] GitHub. GitHub Copilot: Your AI pair programmer[EB/OL]. 2021. +[7] 智谱AI. CodeGeeX: A Multilingual Code Generation Model[R]. 2022. +[8] AutoGPT. An experimental open-source attempt to make GPT-4 autonomous[EB/OL]. 2023. +[9] Flask. Flask Web Development Framework[EB/OL]. https://flask.palletsprojects.com, 2024. +[10] Vue.js. The Progressive JavaScript Framework[EB/OL]. https://vuejs.org, 2024. + + +================================================================================ +附录:技术术语表 +================================================================================ + +AI Agent - 能够自主执行任务的智能体程序 +LLM - Large Language Model,大语言模型 +Docker - 容器化平台,用于隔离应用运行环境 +WebSocket - 双向实时通信协议 +pexpect - Python库,用于控制交互式程序 +diff补丁 - 文本差异修改格式,用于精确修改文件 +Token - 大模型的最小处理单位,约0.75个英文单词 +思考模式 - 使用推理模型进行深度思考的调用方式 +子智能体 - 独立运行的辅助AI,处理子任务 +容器隔离 - 通过操作系统虚拟化技术实现进程隔离 +OpenAI兼容API - 遵循OpenAI接口规范的API实现 +私有化部署 - 在用户自己的服务器上部署,数据不出本地 + + +================================================================================ +文档说明 +================================================================================ + +本文档编写时间:2025年1月 +文档版本:v1.0 +项目状态:核心功能已完成,测试中 +预计答辩时间:2025年2月 + +联系方式:[填写你的邮箱/GitHub] +项目地址:[填写GitHub仓库地址] + +文档最后更新:2025-01-05 diff --git a/doc/答辩PPT_大纲与逐页内容.md b/doc/答辩PPT_大纲与逐页内容.md new file mode 100644 index 0000000..2890fcd --- /dev/null +++ b/doc/答辩PPT_大纲与逐页内容.md @@ -0,0 +1,267 @@ +# 答辩 PPT:大纲与逐页内容(基于 `doc/TECH_DOC.md` + `doc/开题报告.txt`) + +> 目标:给你一个“可直接照着做 PPT”的逐页脚本。 +> 建议页数:**18 页**(答辩 8–12 分钟可控;如需 15/20 页我也可以再压缩/扩展)。 +> 你需要自行补充:系统截图(登录/聊天/终端/文件/监控/虚拟显示器/管理员面板)、架构图(可用 draw.io)。 + +--- + +## 0. PPT 叙事主线(建议) +1) **为什么做**:涉密/内网 + 成本 + 可控性痛点 +2) **做了什么**:Docker 多用户隔离的 AI 开发平台(终端/文件/对话/监控一体) +3) **怎么做**:后端编排 + 容器执行层 + 前端实时交互 + 监控与安全 +4) **做得怎么样**:指标/实战测试/稳定性 +5) **还能怎么做更好**:生产化补齐项(安全/DB/CI/伸缩) + +--- + +## 1. 页面总览(大纲) +1. 标题页 +2. 背景与痛点 +3. 目标与需求(四大目标) +4. 研究现状对比与创新点 +5. 系统总体架构(三层/数据流) +6. 运行时拓扑(宿主机 + 多容器) +7. 后端核心:终端编排与会话(MainTerminal/WebTerminal) +8. 核心模块 1:用户容器管理(UserContainerManager) +9. 核心模块 2:容器文件代理(Container File Proxy) +10. 核心模块 3:持久化终端与超时控制(Persistent Terminal) +11. 上下文构建与对话管理(Context/Conversation Manager) +12. 分层思考模式(fast/thinking/deep) +13. 子智能体机制(Sub-Agent) +14. 前端架构与虚拟显示器回放(Vue + Monitor) +15. 安全与权限模型(CSRF/限流/上传隔离/容器隔离) +16. 监控与日志(CPU/内存/网速/磁盘/Token) +17. 评估指标与实战测试结果(表格 + 数据) +18. 总结与展望(贡献/局限/下一步) + +--- + +## 2. 逐页内容(每页可直接做成 PPT) + +### 第 1 页:标题页 +**标题**:基于 Docker 容器的多用户 AI 智能体开发平台 +**副标题**:自主可控、可私有化部署、支持 OpenAI 兼容国产模型 +**作者/学校/专业/导师/日期**:按你的信息填写 +**建议配图**:系统主界面截图(聊天 + 终端 + 资源面板同屏),或一张“浏览器 + 容器”的示意图。 +**讲稿要点(10–15 秒)**:一句话定义:这是一个“多用户隔离 + 全工具链”的 AI 编程/开发助手平台。 + +--- + +### 第 2 页:背景与痛点(为什么要做) +**标题**:课题背景:AI 辅助编程的现实痛点 +**内容要点**: +- 商业产品强但有问题:国外服务依赖、内网/涉密不可用、费用高、难定制 +- 国产模型生态成熟:DeepSeek/Qwen/GLM 等具备商用性能与更低成本,支持私有化 +- 需求场景明确:涉密项目、企业内网、高校教学多用户实验 +**建议配图**:对比表(Copilot/Cursor/Claude Code vs 本项目)。 +**讲稿要点**:强调“不是再做一个聊天网页”,而是“可执行、可隔离、可监控”的开发平台。 + +--- + +### 第 3 页:目标与需求(做成什么样) +**标题**:课题目的:四大目标 +**内容要点(四象限)**: +1) 技术自主:OpenAI 兼容 API;可私有化部署 +2) 功能完整:终端/文件/对话管理/监控 +3) 安全隔离:单用户单容器、配额限制、沙箱化文件与命令 +4) 实用性:涉密开发、降低企业成本、教学平台 +**建议配图**:四象限图或 checklist。 +**讲稿要点**:这四点对应后面四条主线:架构、工具、隔离、安全与监控。 + +--- + +### 第 4 页:研究现状与创新点(你做的“新”在哪里) +**标题**:研究现状与不足 → 本项目创新点 +**对比要点**: +- Copilot/灵码:主要是补全,缺少终端/文件/多租户 +- Cursor/Claude Code:工具更强但闭源/云端/单用户或国内受限 +- 开源 AutoGPT/Open-WebUI:偏聊天/框架,工程化与隔离不足 +**本项目创新点(落地型)**: +- 多用户隔离:单用户单容器 + 资源配额 +- 工具完整:持久化终端 + 文件代理 + 对话管理 + 监控 +- 分层思考模式:推理模型首轮 + 快速模型后续(节省成本) +- 子智能体并行:任务拆分与交付 +**讲稿要点**:把“创新”说成“可验证的工程机制”,而不是抽象概念。 + +--- + +### 第 5 页:系统总体架构(概览) +**标题**:总体架构:浏览器 → Web 服务器 → 业务逻辑 → 容器层 +**内容要点**(建议画图): +- 前端:Vue SPA + Socket.IO Client +- Web Server:Flask + Socket.IO(鉴权、API、事件) +- 业务层:WebTerminal/MainTerminal、ContextManager、UserContainerManager、UploadQuarantineManager +- 容器层:每用户一个容器,执行命令与文件操作 +**讲稿要点**:解释“工具调用并不在宿主机直接执行”,而是通过容器代理统一落地。 + +--- + +### 第 6 页:运行时拓扑(多用户隔离如何工作) +**标题**:运行时拓扑:单机多用户、多容器并发 +**内容要点**: +- 用户登录 → 创建/复用容器 → 挂载用户工作区(project/data/logs) +- 宿主机仅运行 Web 服务与调度,执行尽量在容器内完成 +- 并发上限:最多 N 个活跃容器(配置项 `MAX_ACTIVE_USER_CONTAINERS`) +**建议配图**:宿主机盒子 + N 个容器盒子,每个容器挂载各自 workspace。 +**讲稿要点**:突出横向隔离:用户 A 无法看到用户 B 的文件/进程。 + +--- + +### 第 7 页:后端核心:终端编排与会话(MainTerminal/WebTerminal) +**标题**:后端核心:统一编排层 +**内容要点**: +- CLI 与 Web 共用核心:`core/main_terminal.py` +- Web 版继承:`core/web_terminal.py`,增加消息回调与自动加载/创建对话 +- 统一处理:运行模式(fast/thinking/deep)、工具分类开关、聚焦文件、Todo/记忆、子代理状态 +**建议配图**:类关系简图:WebTerminal → MainTerminal → modules/utils/config。 +**讲稿要点**:强调“核心逻辑只写一套”,降低维护成本。 + +--- + +### 第 8 页:核心模块 1:用户容器管理(UserContainerManager) +**标题**:容器生命周期管理(按用户) +**内容要点**: +- 创建/复用/回收:`ensure_container` / `release_container` +- 资源限制:CPU/内存/网络/卷挂载路径;容器上限与资源繁忙提示 +- 状态采集:支持 `docker stats/inspect` 汇报到监控 +**建议配图**:时序图:login → ensure_container → handle;logout/idle → release。 +**可讲实现细节**: +- 容器模式与回退:docker 不可用时可回退 host(可配置 require 强制失败) +- 容器命名与记录:保存 container_name/container_id/last_active + +--- + +### 第 9 页:核心模块 2:容器文件代理(Container File Proxy) +**标题**:容器内文件操作:安全、低开销 +**内容要点**: +- 方案:`docker exec` 执行内联 Python 脚本(避免 `docker cp` 往返与临时文件) +- 安全:路径解析 `resolve` + 前缀检查,阻止目录遍历;限制文件大小与行范围 +- 功能:create/read/write/rename/delete、读片段、(可扩展 diff/搜索) +**建议配图**:对比图:传统 docker cp 三次 IO vs exec 一次 IO。 +**讲稿要点**:把“效率 + 安全”作为这页核心论点。 + +--- + +### 第 10 页:核心模块 3:持久化终端与超时控制 +**标题**:持久化终端:多会话 + 输出缓冲 + 超时不杀会话 +**内容要点**: +- 多终端会话管理:`modules/terminal_manager.py`(最大会话数、快照行数/字符上限) +- 持久化终端:`modules/persistent_terminal.py`(读写线程、输出队列、循环缓冲、回显检测) +- 一次性工具命令:`modules/terminal_ops.py` + `modules/toolbox_container.py`(专用工具容器,避免状态污染) +**建议配图**:终端会话结构图(session → process → output buffer)。 +**讲稿要点**:强调工程难点:交互式程序、输出爆炸、超时机制(只杀命令不杀终端)。 + +--- + +### 第 11 页:上下文构建与对话管理 +**标题**:ContextManager:把“可用信息”组装给模型 +**内容要点**: +- 对话持久化:`utils/conversation_manager.py`(对话文件 + index,支持重建索引与容错) +- 上下文来源:历史消息、工具结果、聚焦文件、Todo/记忆、资源限额、个性化偏好 +- Token 统计:对话级 + 工作区累计(写入 `token_totals.json`) +**建议配图**:上下文拼装示意:System prompt + tools + focused files + history + memory/todo。 +**讲稿要点**:说明为什么需要“聚焦文件”:让模型稳定获取关键代码片段,减少无关信息。 + +--- + +### 第 12 页:分层思考模式(fast / thinking / deep) +**标题**:分层思考模式:质量/速度/成本的平衡 +**内容要点**: +- fast:快速响应,适合简单问题 +- thinking:推理更充分,适合复杂任务 +- deep:更强推理/更长思考(用于难题) +- 机制:首轮推理结果缓存,后续复用(节约成本;可配置切换间隔 `THINKING_FAST_INTERVAL`) +**建议配图**:模式切换流程图或对比表(质量/成本/延迟)。 +**讲稿要点**:把“成本控制”说成一个可量化的工程机制,而不是主观感受。 + +--- + +### 第 13 页:子智能体机制(Sub-Agent) +**标题**:子智能体:任务并行与交付 +**内容要点**: +- 主智能体负责编排与拆分;子智能体负责执行子任务并返回交付物 +- 生命周期:create → wait → close;状态:pending/running/completed/failed +- 隔离:独立工作区(references/deliverables),避免污染主会话 +**建议配图**:主/子代理协作图(任务拆分、并行、合并结果)。 +**讲稿要点**:突出价值:复杂任务“可并行”,主对话更清晰。 + +--- + +### 第 14 页:前端架构与虚拟显示器回放 +**标题**:Vue 前端:实时交互 + 可视化回放 +**内容要点**: +- SPA:Vue3 + Pinia + Socket.IO Client +- 状态域:聊天、工具、monitor、resource、files、upload、policy、subAgent 等 +- 虚拟显示器:`static/src/components/chat/monitor/*`,将工具执行过程转为可回放动画(指针/窗口/右键/进度气泡) +**建议配图**:虚拟显示器截图 + 简单事件流(tool event → store → MonitorDirector)。 +**讲稿要点**:强调“可解释性/可观测性”:用户能看到智能体“在做什么”。 + +--- + +### 第 15 页:安全与权限模型 +**标题**:安全设计:多层防护(容器 + Web 安全 + 上传隔离) +**内容要点**: +- 容器隔离:单用户单容器,配额限制,宿主机不直接执行用户命令 +- Web 安全:CSRF token、登录失败锁定/限流、Session 过期 +- 上传安全:隔离区暂存 + 后缀/大小校验 + 可选 ClamAV 扫描 + 审计日志 +- 路径安全:`resolve` + 越界检查,阻止 `../../../` +**建议配图**:安全“洋葱模型”图(外层 Web → 内层容器 → 文件代理)。 +**讲稿要点**:同时说明局限:仍需进一步收紧 CORS、移除硬编码密钥等生产化事项(下一页或总结提)。 + +--- + +### 第 16 页:监控与日志(可观测性) +**标题**:可观测性:资源 + Token + 审计日志 +**内容要点**: +- 容器监控:CPU/内存/网络 IO,采样写入 `logs/container_stats.log`,前端计算网速并展示 +- 磁盘配额:项目已用/上限/百分比(轮询,退避策略) +- Token 统计:当前上下文 + 对话累计 + 工作区累计 +- 审计:上传扫描日志按用户分文件记录 +**建议配图**:资源面板截图(CPU/内存/网速/存储/Token)。 +**讲稿要点**:强调这是“教学/企业可用”的关键:管理员能看到资源与风险点。 + +--- + +### 第 17 页:评估指标与实战测试结果 +**标题**:评估与验证:实战测试 + 指标达成 +**建议一张表 + 一张要点**: +- 代码规模:约 41,500 行;模块数:25+ +- 并发能力:8 个容器;单容器 3 个终端会话 +- 响应:交互响应 < 100ms(本地条件下) +- 成功率:diff 补丁 ~85%;终端命令 ~98% +- 稳定性:连续运行 72h 无崩溃;300+ 次 dogfooding +- 安全测试:路径遍历/命令注入/恶意上传均拦截 +**建议配图**:一页“指标表格”,或“雷达图/柱状图”。 +**讲稿要点**:把“测过/跑过/能用”说清楚,体现工程完成度。 + +--- + +### 第 18 页:总结与展望 +**标题**:总结与下一步 +**总结(贡献点)**: +- 多用户容器隔离的 AI 开发平台(端到端可运行) +- 文件代理 + 持久化终端 + 对话上下文 + 监控面板形成闭环 +- 分层思考模式与子智能体增强复杂任务能力 +**局限(坦诚但可控)**: +- 安全基线仍需生产化(密钥治理、CORS 收紧、日志脱敏、DB/权限细化) +- 可扩展性:后端可拆分执行层/引入任务队列与多 worker +**下一步**(可选): +- 数据库化(用户/会话/审计)、CI/CD、镜像漏洞扫描、RAG/代码索引、rootless/gVisor 等 +**建议配图**:Roadmap 时间线(短期/中期/长期)。 +**讲稿要点**:以“可落地的下一步”收尾,体现工程规划能力。 + +--- + +## 3. 你需要准备的素材清单(做 PPT 前先收集) +1) 截图:登录页、聊天页、终端页、文件管理、上传、资源面板、虚拟显示器、管理员策略页 +2) 结构图:总体架构、运行时拓扑、工具调用时序、子智能体协作图 +3) 数据:并发容器/终端数量、成功率、72h 稳定性、token 成本(用你真实运行数据替换“目标值/示例值”) +4) 演示脚本:一条典型任务(搜索→修改文件→运行命令→展示监控/回放) + +--- + +## 4. 版本说明 +- 生成时间:2026-01-05 +- 依据文件:`doc/TECH_DOC.md`、`doc/开题报告.txt` + diff --git a/modules/admin_policy_manager.py b/modules/admin_policy_manager.py index ead2bcc..b371b0f 100644 --- a/modules/admin_policy_manager.py +++ b/modules/admin_policy_manager.py @@ -14,6 +14,7 @@ from pathlib import Path from typing import Dict, Any, Tuple from config.paths import ADMIN_POLICY_FILE +from modules.custom_tool_registry import CustomToolRegistry, build_default_tool_category # 可用的模型 key(与前端、model_profiles 保持一致) ALLOWED_MODELS = {"kimi", "deepseek", "qwen3-max", "qwen3-vl-plus"} @@ -142,6 +143,7 @@ def save_scope_policy(target_type: str, target_value: str, config: Dict[str, Any def _collect_categories_with_overrides(overrides: Dict[str, Any]) -> Dict[str, Dict[str, Any]]: """从 override 字典生成 {id: {label, tools, default_enabled}}""" from core.tool_config import TOOL_CATEGORIES # 延迟导入避免循环 + registry = CustomToolRegistry() base: Dict[str, Dict[str, Any]] = { key: { @@ -153,6 +155,17 @@ def _collect_categories_with_overrides(overrides: Dict[str, Any]) -> Dict[str, D for key, cat in TOOL_CATEGORIES.items() } + # 注入自定义工具分类(动态) + custom_cat = build_default_tool_category() + custom_cat_id = custom_cat.get("id", "custom") + custom_tools = [item.get("id") for item in registry.list_tools() if item.get("id")] + base[custom_cat_id] = { + "label": custom_cat.get("label", "自定义工具"), + "tools": custom_tools, + "default_enabled": True, + "silent_when_disabled": False, + } + remove_ids = set(overrides.get("remove_categories") or []) for rid in remove_ids: base.pop(rid, None) @@ -212,17 +225,30 @@ def get_effective_policy(username: str | None, role: str | None, invite_code: st def describe_defaults() -> Dict[str, Any]: """返回默认(未覆盖)工具分类,用于前端渲染。""" from core.tool_config import TOOL_CATEGORIES + registry = CustomToolRegistry() + + categories = { + key: { + "label": cat.label, + "tools": list(cat.tools), + "default_enabled": bool(cat.default_enabled), + "silent_when_disabled": getattr(cat, "silent_when_disabled", False), + } + for key, cat in TOOL_CATEGORIES.items() + } + + # 自定义工具分类 + custom_cat = build_default_tool_category() + custom_cat_id = custom_cat.get("id", "custom") + categories[custom_cat_id] = { + "label": custom_cat.get("label", "自定义工具"), + "tools": [item.get("id") for item in registry.list_tools() if item.get("id")], + "default_enabled": True, + "silent_when_disabled": False, + } return { - "categories": { - key: { - "label": cat.label, - "tools": list(cat.tools), - "default_enabled": bool(cat.default_enabled), - "silent_when_disabled": getattr(cat, "silent_when_disabled", False), - } - for key, cat in TOOL_CATEGORIES.items() - }, + "categories": categories, "models": sorted(list(ALLOWED_MODELS)), "ui_block_keys": UI_BLOCK_KEYS, } diff --git a/modules/custom_tool_executor.py b/modules/custom_tool_executor.py new file mode 100644 index 0000000..8ae2873 --- /dev/null +++ b/modules/custom_tool_executor.py @@ -0,0 +1,102 @@ +"""自定义工具执行器(仅 Python 低代码模板)。""" + +from __future__ import annotations + +import string +from typing import Dict, Any, Optional + +from modules.custom_tool_registry import CustomToolRegistry + +# 默认超时时间(秒) +DEFAULT_CUSTOM_TOOL_TIMEOUT = 30 + + +class SafeFormatter(string.Formatter): + """防止缺失键时报错,便于友好提示。""" + + def __init__(self, args: Dict[str, Any]): + super().__init__() + self.args = args + + def get_value(self, key, args, kwargs): + if isinstance(key, str): + if key in kwargs: + return kwargs[key] + if key in self.args: + return self.args[key] + return super().get_value(key, args, kwargs) + + +class CustomToolExecutor: + """根据 registry 定义运行 Python 代码模板。""" + + def __init__(self, registry: CustomToolRegistry, terminal_ops): + self.registry = registry + self.terminal_ops = terminal_ops + + async def run(self, tool_id: str, arguments: Dict[str, Any]) -> Dict[str, Any]: + tool = self.registry.get_tool(tool_id) + if not tool: + return {"success": False, "error": f"未找到自定义工具: {tool_id}"} + exec_conf = tool.get("execution") or {} + if exec_conf.get("type") not in {None, "python"}: + return {"success": False, "error": "当前仅支持 python 执行类型"} + + code_template = exec_conf.get("code_template") or tool.get("execution_code") or tool.get("code_template") + if not code_template: + return {"success": False, "error": "自定义工具缺少 code_template"} + + timeout = exec_conf.get("timeout") or tool.get("timeout") or DEFAULT_CUSTOM_TOOL_TIMEOUT + + # 用 string.Formatter 填充模板;缺失字段会抛出 KeyError,便于定位 + try: + formatter = SafeFormatter(arguments or {}) + rendered = formatter.format(code_template, **(arguments or {})) + except KeyError as exc: + return { + "success": False, + "error": f"缺少必填参数: {exc}", + "missing": str(exc), + "tool_id": tool_id, + } + except Exception as exc: + return {"success": False, "error": f"模板渲染失败: {exc}", "tool_id": tool_id} + + # 执行 python 代码 + result = await self.terminal_ops.run_python_code(rendered, timeout=timeout) + result["custom_tool"] = True + result["tool_id"] = tool_id + result["code_rendered"] = rendered + result.setdefault("message", result.get("output") or "已执行自定义工具") + + # 返回层(可选) + return_conf = tool.get("return") or tool.get("return_config") or {} + result = self._apply_return_layer(result, return_conf) + return result + + @staticmethod + def _apply_return_layer(result: Dict[str, Any], return_conf: Dict[str, Any]) -> Dict[str, Any]: + if not isinstance(return_conf, dict) or not return_conf: + return result + output = result.get("output") or "" + stderr = result.get("stderr") or "" + return_code = result.get("return_code") + # 截断 + trunc_limit = return_conf.get("truncate") + if isinstance(trunc_limit, int) and trunc_limit > 0 and len(output) > trunc_limit: + output = output[:trunc_limit] + result["truncated"] = True + result["output"] = output + template = return_conf.get("template") + if isinstance(template, str) and template.strip(): + try: + msg = template.format( + output=output, + stderr=stderr, + return_code=return_code, + tool_id=result.get("tool_id"), + ) + result["message"] = msg + except Exception: + pass + return result diff --git a/static/src/admin/customToolsMain.ts b/static/src/admin/customToolsMain.ts new file mode 100644 index 0000000..8a49f4d --- /dev/null +++ b/static/src/admin/customToolsMain.ts @@ -0,0 +1,4 @@ +import { createApp } from 'vue'; +import CustomToolsApp from './CustomToolsApp.vue'; + +createApp(CustomToolsApp).mount('#custom-tools-app'); diff --git a/static/src/components/personalization/PersonalizationDrawer.vue b/static/src/components/personalization/PersonalizationDrawer.vue index c0e11da..d5b58aa 100644 --- a/static/src/components/personalization/PersonalizationDrawer.vue +++ b/static/src/components/personalization/PersonalizationDrawer.vue @@ -504,6 +504,28 @@
新窗口开启,不打断当前对话与配置。
+自定义工具
+在线创建/编辑 definition.json、execution.py、return.json、meta.json,保存后自动生效。
+新窗口打开 /admin/custom-tools 页面。
+