Spaces:
Sleeping
Sleeping
File size: 9,899 Bytes
d347708 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 | ---
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 入口<br/>main.py] --> B[ReadAgent<br/>src/agent.py]
C[Web 入口<br/>app.py] --> B
B --> D[工具执行器<br/>ToolExecutor]
D --> E[搜索工具<br/>src/searcher.py]
D --> F[仓库管理器<br/>src/repo_manager.py]
B --> G[会话存储<br/>app.py]
B --> H[内存管理<br/>Memory 类]
B --> I[LLM API<br/>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[按优先级搜索<br/>文档→配置→代码]
C --> D[执行工具操作<br/>read_file/search_code]
D --> E[分析结果<br/>交叉验证]
E --> F{是否有最终答案?}
F -- 是 --> G[生成 Memory<br/>优化上下文]
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 帮助你更好地理解代码! |