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 帮助你更好地理解代码!