--- title: astrbot-help emoji: 🤖 colorFrom: blue colorTo: purple sdk: docker app_file: app.py pinned: false --- # Read Agent - AI 代码读取与分析助手 ## 项目简介 Read Agent 是一个基于 AI 的技术支持助手,专门帮助开发人员读取、搜索和分析代码仓库。它使用 OpenAI 兼容的 API 和 ReAct(Reasoning + Acting)模式进行迭代代码探索,并通过内存管理控制多步骤分析过程中的令牌使用。 ## 核心功能 - **智能代码分析**:使用 LLM 分析代码结构和功能 - **代码搜索**:支持正则表达式搜索和文件内容读取 - **仓库管理**:自动同步和管理 GitHub 代码仓库 - **会话管理**:支持多用户并发会话,每个会话有独立的记忆 - **流式响应**:提供实时的思考过程和答案输出 - **内存优化**:使用 Memory 机制替代完整文件内容,防止上下文膨胀 - **多 API Key 随机选择**:支持配置多个 API Key,自动随机选择分发请求,提升并发能力和稳定性 ## 架构设计 ```mermaid graph TD A[CLI 入口
main.py] --> B[ReadAgent
src/agent.py] C[Web 入口
app.py] --> B B --> D[工具执行器
ToolExecutor] D --> E[搜索工具
src/searcher.py] D --> F[仓库管理器
src/repo_manager.py] B --> G[会话存储
app.py] B --> H[内存管理
Memory 类] B --> I[LLM API
OpenAI 兼容接口] ``` ## 核心组件 ### 1. ReadAgent (src/agent.py) - 实现 ReAct 模式的核心代理 - 管理思考过程、工具执行和结果观察 - 控制多步骤分析流程 - 处理内存管理和上下文压缩 ### 2. 工具执行器 (ToolExecutor) - 注册和管理可用工具 - 解析 LLM 响应中的动作指令 - 执行 read_file、search_code 等操作 - 提供统一的工具调用接口 ### 3. 搜索工具 (src/searcher.py) - read_file:读取文件内容 - search_code:正则表达式搜索 - find_files:查找文件 - find_by_ext:按扩展名搜索 - list_dir:列出目录内容 - get_file_info:获取文件信息 - get_directory_tree:获取目录树 ### 4. 仓库管理器 (src/repo_manager.py) - 从 GitHub 下载仓库(ZIP 格式) - 自动同步多个仓库 - 支持并行同步(线程) - 管理仓库存储和更新 ### 5. 会话管理 (app.py) - 管理多个并发会话 - 每个会话有独立的 Agent 实例 - 支持会话的创建、清除和查询 - 线程安全的会话存储 ## 运行方式 ### 1. 环境变量配置 复制 `.env.example` 为 `.env` 并配置: ```bash # API Key(支持单个或多个,多Key时会自动轮询) OPENAI_API_KEY=sk-xxx1,sk-xxx2,sk-xxx3 OPENAI_BASE_URL=https://api.openai.com/v1 OPENAI_MODEL=gpt-4 CODE_DIR=./repos MAX_STEPS=10 TREE_DEPTH=3 STREAM_OUTPUT=true WEB_PORT=7860 REPO_SYNC_ON_STARTUP=true # 仓库配置 REPO_1_URL=https://github.com/owner/repo1 REPO_1_NAME=repo1 REPO_1_BRANCH=main ``` ### 2. 安装依赖 ```bash pip install -r requirements.txt ``` ### 3. 启动方式 #### 命令行模式 ```bash # 交互式终端 python main.py # 指定代码目录 python main.py --code-dir /path/to/code ``` #### Web 服务模式 ```bash python app.py ``` #### Docker 容器化 ```bash # 使用 Docker Compose docker-compose up -d # 或单独构建镜像 docker build -t read-agent . docker run -p 7860:7860 read-agent ``` ## API 接口 ### 1. 问答接口 **POST /api/ask** ```json { "question": "代码的核心功能是什么?", "stream": true, "session_id": "optional_session_id" } ``` ### 2. 会话管理 - **POST /api/session/new**:创建新会话 - **POST /api/session/clear**:清除会话 - **GET /status**:获取服务状态 ### 3. 仓库管理 - **GET /api/repos**:获取仓库列表 - **POST /api/repos/sync**:同步仓库 - **GET /api/repos/config**:获取仓库配置 - **POST /api/repos/clear**:清空仓库 ### 4. API Key 管理 - **GET /api/api-keys/stats**:获取 API Key 统计信息 ```json { "total_keys": 3, "keys": [ { "key_hash": "a1b2c3d4", "total_requests": 10, "success_count": 9, "error_count": 1, "success_rate": "90.00%", "last_used": 1704067200.0, "last_error": "HTTP 429: Rate limit exceeded" } ] } ``` - **POST /api/api-keys/reset-stats**:重置 API Key 统计信息 ### 5. 健康检查 **GET /health** ```json { "status": "ok", "message": "Read Agent 服务运行中" } ``` ## 工作流程 ```mermaid graph LR A[用户提问] --> B[构建信息需求树] B --> C[按优先级搜索
文档→配置→代码] C --> D[执行工具操作
read_file/search_code] D --> E[分析结果
交叉验证] E --> F{是否有最终答案?} F -- 是 --> G[生成 Memory
优化上下文] F -- 否 --> C G --> H[输出答案] ``` ## 内存管理 Read Agent 使用 Memory 机制优化上下文: ```python @dataclass class Memory: file_path: str # 文件路径 overview: str # 一句话概述 key_definitions: List[str] # 关键函数/类名 core_logic: str # 核心逻辑 dependencies: List[str] # 依赖模块 needed_info: str # 待验证信息 ``` 每次读取文件后,会创建 Memory 对象替代完整内容,防止上下文膨胀。 ## 技术特点 - **无外部依赖**:仅使用 Python 标准库和少数轻量级库(Flask, python-dotenv) - **流式处理**:支持 token 级别的实时响应 - **正则搜索**:使用 re 模块实现强大的搜索功能 - **会话隔离**:每个用户会话完全独立 - **线程安全**:使用锁机制确保并发安全 - **自动同步**:启动时自动同步配置的仓库 ## 使用场景 - **代码理解**:快速了解陌生代码库的功能和架构 - **问题定位**:通过搜索和分析找到 bug 的根源 - **文档生成**:自动生成代码文档和架构说明 - **代码审查**:辅助进行代码质量评估和审查 - **学习工具**:帮助开发者学习新代码和技术 ## 配置说明 ### 环境变量 | 变量名 | 默认值 | 说明 | |--------|--------|------| | OPENAI_API_KEY | 必填 | LLM API 密钥(支持多个,逗号分隔) | | OPENAI_BASE_URL | https://api.openai.com/v1 | API 端点 | | OPENAI_MODEL | gpt-4 | 模型名称 | | CODE_DIR | ./repos | 仓库存储目录 | | MAX_STEPS | 10 | 最大推理步数 | | TREE_DEPTH | 3 | 目录树预加载深度 | | STREAM_OUTPUT | true | 启用流式输出 | | WEB_PORT | 7860 | Web 服务端口 | | REPO_SYNC_ON_STARTUP | true | 启动时自动同步仓库 | | MAX_RETRIES | 3 | API 调用最大重试次数 | | RETRY_DELAYS | 1,2,4 | 重试延迟策略(秒,逗号分隔) | ### 多 API Key 配置 支持配置多个 API Key 以实现请求轮询,提升并发能力和稳定性: ```bash # 单个 Key OPENAI_API_KEY=sk-xxx # 多个 Key(逗号分隔) OPENAI_API_KEY=sk-xxx1,sk-xxx2,sk-xxx3 # 通过命令行参数(CLI) python main.py --api-key "sk-xxx1,sk-xxx2,sk-xxx3" ``` 当配置多个 Key 时,系统会自动随机选择: - 每次请求时随机使用不同的 Key(分散负载) - 记录每个 Key 的使用统计(请求数、成功率等) - 可通过 `/api/api-keys/stats` API 查看统计信息 - 可通过 `/api/api-keys/reset-stats` API 重置统计 ### 重试配置 系统支持 API 调用失败时自动重试: ```bash # 最大重试次数(默认: 3) MAX_RETRIES=3 # 重试延迟策略,单位:秒(默认: 1,2,4) # 指数退避策略:第1次重试等1秒,第2次等2秒,第3次等4秒 RETRY_DELAYS=1,2,4 ``` **重试机制:** - 可重试的 HTTP 状态码:`429, 500, 502, 503, 504`(速率限制、服务器错误) - 可重试的网络错误:超时、连接错误 - 重试时仍然会随机使用不同的 API key - 可通过命令行参数配置:`--max-retries 5 --retry-delays 1,2,4,8,16` **示例配置:** ```bash # 激进重试(5次,更长的退避时间) MAX_RETRIES=5 RETRY_DELAYS=1,3,9,27,81 # 快速重试(2次,短延迟) MAX_RETRIES=2 RETRY_DELAYS=0.5,1 ``` ### 仓库配置 可以配置多个仓库: ```bash REPO_1_URL=https://github.com/owner/repo1 REPO_1_NAME=repo1 REPO_1_BRANCH=main REPO_2_URL=https://github.com/owner/repo2 REPO_2_NAME=repo2 REPO_2_BRANCH=dev ``` ## 开发 ### 项目结构 ``` ├── app.py # Flask Web 应用 ├── main.py # CLI 入口 ├── prompts.py # 提示词配置 ├── requirements.txt # 依赖文件 ├── Dockerfile # Docker 构建文件 ├── docker-compose.yml # Docker 组合配置 ├── src/ # 核心代码 │ ├── agent.py # ReadAgent 实现 │ ├── searcher.py # 搜索工具 │ ├── repo_manager.py # 仓库管理器 │ └── index.py # 工具索引 ├── static/ # 前端资源 │ └── index.html # 主页面 └── tests/ # 测试文件 ``` ### 提示词配置 提示词在 `prompts.py` 中定义,包含: - **ReAct 格式说明**:指导 LLM 输出格式 - **系统提示词**:包含角色、搜索策略、验证协议等 - **答案提示词**:用于生成最终答案 ### 调试 启用调试模式: ```bash DEBUG=true python app.py ``` ## 许可证 [MIT License](LICENSE) ## 贡献 欢迎提交 Issue 和 Pull Request! --- **Read Agent** - 让 AI 帮助你更好地理解代码!