This commit is contained in:
minorQAQ committed 2026-06-17 12:58:18 +08:00
1 parent 5e5a4b7376
commit 1396d652f7
145 files changed
+9542 -1453

No files matched your search

+373
View File
@@ -0,0 +1,373 @@
# Minor Agent 系统架构、部署与开发指南(飞书版)
## 1. 文档目标
本文面向 Minor Agent 的研发、部署和维护人员,说明当前系统的整体架构、核心运行链路、Plan TodoList 机制、工具扩展方式、Web 前端交互、部署步骤与常见排障方法。
## 2. 系统概览
Minor Agent 是一个基于 LangGraph 的多模态本地 Agent 系统,提供 Web 对话界面,支持文本、图片、音频和文件输入,并通过 LangChain Tool 接入外部能力。
### 2.1 核心能力
- 多模态对话:文本、图片、音频、普通文件。
- Agent 模式:普通 agent、plan、team 预留。
- ReAct 工具调用:浏览器控制、屏幕截图、目录查看、人工交互、本机软件控制、Todo 状态更新等。
- 历史持久化:SQLite 保存对话历史与压缩元信息。
- 上下文压缩:按 token 阈值触发轻量/全量摘要。
- Plan TodoList:Plan 模式下生成 `.todo`,前端浮窗展示,执行过程中动态更新。
## 3. 目录结构
```text
Agent/
├─ requirements.txt
├─ pyproject.toml
├─ README.md
├─ docs/
│ └─ feishu_development_guide.md
└─ src/
├─ web/
│ ├─ server.py # FastAPI 后端 API 与静态资源服务
│ ├─ app.js # Web 前端主逻辑
│ ├─ app.css # Web 前端样式
│ └─ index.html # Web 页面入口
└─ agent/
├─ agents/
│ └─ main_agent.py # 主 Agent 装配入口
├─ core/
│ ├─ runtime.py # Agent 执行、Plan 确认、人工交互续跑
│ ├─ graph_builder.py # LangGraph ReAct 图构建
│ ├─ nodes.py # LLM 节点与工具产物处理
│ ├─ routing.py # 工具调用路由/审批识别
│ ├─ plan.py # Plan 模式路径选择 pending action
│ ├─ todo_manager.py # `.todo` 读写、解析、状态更新、上下文注入
│ └─ state.py # LangGraph 状态定义
├─ memory/
│ └─ system_prompt.py # 系统提示词、Plan 提示词
├─ tools/
│ ├─ tool.py # 通用工具集合
│ ├─ tool_software_control.py # Windows 本机软件控制工具
│ └─ __init__.py # 工具注册
├─ utils/
│ └─ agent_utils.py # 历史、压缩、多模态文件处理
├─ history/ # 聊天历史、会话附件、数据库
└─ workspace/
└─ .todo # Plan TodoList 文件
```
## 4. 后端架构
### 4.1 Web API 层
入口文件:`src/web/server.py`
主要职责:
- 提供静态页面:`/`、`/app.js`、`/app.css`、`/image/{asset}`。
- 会话管理:新建、切换、清空、删除。
- 多模态上传:将上传文件临时落盘,再同步到会话目录。
- Agent 执行:调用 `chatbot_agent` 间接进入 `AgentRuntime`。
- 人工交互回调:处理工具审批、Plan 路径确认等 pending action。
- Todo API:`GET /api/todo` 返回当前 `.todo` 内容和结构化任务列表。
### 4.2 Runtime 层
入口文件:`src/agent/core/runtime.py`
核心接口:
- `execute_agent(...)`:处理用户新消息,执行普通 agent / plan / team 流程。
- `continue_after_human_action(...)`:处理人工确认、Plan 路径选择、工具审批后的续跑。
运行流程:
1. Web UI 提交用户消息。
2. Runtime 调用 `summarizer(...)` 组装模型上下文。
3. 普通模式直接执行 LangGraph。
4. Plan 模式先进入研究阶段,只输出可选路径,不执行任务。
5. 用户确认路径后,Runtime 调用模型生成 TodoList,并覆盖写入 `agent/workspace/.todo`。
6. 后续 Plan 上下文会在系统提示词后注入 `.todo` 内容,确保压缩不影响 TodoList。
### 4.3 LangGraph 层
入口文件:`src/agent/core/graph_builder.py`
图结构:
```text
START -> agent -> (tools | END)
tools -> process_tool_artifact -> agent
```
说明:
- `agent` 节点调用已绑定工具的 LLM。
- `tools` 节点执行 LangChain Tool。
- `process_tool_artifact` 处理截图等 artifact,将图片转为模型可见的多模态消息。
## 5. Plan TodoList 机制
### 5.1 设计目标
Plan 模式应实现:
- 根据用户选择的路径生成动态 TodoList。
- TodoList 写入 `src/agent/workspace/.todo`。
- 每次 Plan 模式制定 TodoList 时覆盖旧 `.todo`。
- 前端以浮窗展示,可收起为悬浮球。
- Plan 模式上下文开头携带 `.todo`,紧跟系统提示词。
- 上下文压缩不应压缩或丢失 `.todo`。
- Agent 执行过程中可更新任务状态。
### 5.2 当前实现
核心文件:`src/agent/core/todo_manager.py`
能力:
- `read_todo_text()`:读取 `.todo`。
- `write_todo_text()`:覆盖写入 `.todo`。
- `overwrite_todo_from_plan()`:Plan 路径确认后覆盖旧 TodoList。
- `todo_context_block()`:生成上下文注入块。
- `system_prompt_with_todo()`:将 `.todo` 紧贴系统提示词之后注入。
- `parse_todo_items()`:解析 Markdown checkbox 和状态前缀。
- `update_todo_status()`:按任务描述更新状态,不匹配时追加新任务。
- `todo_payload()`:提供给前端的结构化数据。
### 5.3 前端展示
核心文件:`src/web/app.js`、`src/web/app.css`
- 前端启动时调用 `/api/todo`。
- 每 2.5 秒自动刷新一次。
- TodoList 显示为右侧浮窗。
- 点击收起后变成悬浮球。
- 展示任务状态、完成数量、任务文本。
### 5.4 Agent 更新 Todo 状态
工具:`todo_status_update`
注册位置:`src/agent/tools/__init__.py`
适用场景:
- 任务开始:更新为 `in_progress`。
- 任务完成:更新为 `completed`。
- 任务取消:更新为 `cancelled`。
- 计划变化:追加或修改任务状态。
## 6. 工具系统
### 6.1 工具注册
入口文件:`src/agent/tools/__init__.py`
当前主 Agent 工具包含:
- `web_search_class`:网络搜索。
- `date_query_class`:当前日期时间。
- `screen_capture`:屏幕截图。
- `browser_control`:浏览器打开/关闭/刷新。
- `human_interaction`:人工补充、选择、审批。
- `software_control`:Windows 本机软件打开/关闭/强制关闭。
- `todo_status_update`:更新 `.todo` 中任务状态。
- `directory_listing`:查看目录。
### 6.2 本机软件控制工具
文件:`src/agent/tools/tool_software_control.py`
能力:
- 扫描 Windows 开始菜单、桌面快捷方式和 App Paths。
- 建立软件索引:`src/agent/history/data_base/software_index.json`。
- 根据软件名做模糊匹配。
- 支持打开、正常关闭、强制关闭。
安全策略:
- 仅当用户明确要求操作本机软件时调用。
- `close` 只发送正常关闭请求。
- `force_close` 或 `force=True` 才允许强制结束进程。
- 非 Windows 平台返回明确不支持提示。
## 7. 历史与上下文压缩
核心文件:`src/agent/utils/agent_utils.py`
### 7.1 历史存储
- SQLite 数据库:`src/agent/history/data_base/chat_history.db`
- 表:
- `message_store`:聊天消息。
- `session_meta`:压缩游标、摘要、上次 token 用量。
### 7.2 压缩策略
- 当 token 超过轻量阈值,触发轻量压缩,保留最近若干轮对话。
- 当 token 超过硬阈值,触发全量压缩。
- `.todo` 不进入历史压缩摘要,而是每次 Plan 模式构造系统提示词时重新从文件读取并注入,因此不会被压缩丢失。
## 8. 前端架构
文件:`src/web/index.html`、`src/web/app.js`、`src/web/app.css`
主要模块:
- 会话侧栏:新建、切换、删除会话。
- 消息区:Markdown 渲染、代码块复制、图片/音频展示。
- 输入区:文本、文件、麦克风、自动语音输入。
- Pending Action 卡片:工具审批、人工交互、Plan 路径选择。
- Todo 浮窗:Plan TodoList 展示和自动刷新。
## 9. 部署指南
### 9.1 环境准备
推荐 Python 3.10+。
```bash
cd Agent
python -m venv myenv
```
Windows PowerShell:
```powershell
.\myenv\Scripts\Activate.ps1
```
macOS / Linux:
```bash
source myenv/bin/activate
```
安装依赖:
```bash
pip install --upgrade pip
pip install -r requirements.txt
pip install -e .
```
### 9.2 环境变量
在 `Agent/.env` 中配置:
```text
LLM_BASE_URL=...
LLM_API_KEY=...
LLM_MODEL=...
TTS_BASE_URL=...
ASR_BASE_URL=...
RAG_BASE_URL=...
```
其中 TTS、ASR、RAG 可按实际功能启用情况配置。
### 9.3 启动 Web 服务
Windows PowerShell:
```powershell
cd Agent
$env:PYTHONPATH="src;$env:PYTHONPATH"
uvicorn web.server:app --host 127.0.0.1 --port 8765
```
macOS / Linux:
```bash
cd Agent
export PYTHONPATH=src:$PYTHONPATH
uvicorn web.server:app --host 127.0.0.1 --port 8765
```
访问:
```text
http://127.0.0.1:8765
```
### 9.4 公网访问(可选)
```bash
cloudflared tunnel --url http://localhost:8765
```
## 10. 开发指南
### 10.1 新增工具
1. 在 `src/agent/tools/tool.py` 或独立工具文件中实现 `BaseTool`。
2. 定义 `args_schema`、`name`、`description`、`_run()`、可选 `_arun()`。
3. 在 `src/agent/tools/__init__.py` 的 `_all_tools` 中注册。
4. 重启服务,让 `llm.bind_tools(...)` 重新绑定工具。
### 10.2 修改 Plan 流程
相关文件:
- `src/agent/memory/system_prompt.py`
- `src/agent/core/plan.py`
- `src/agent/core/runtime.py`
- `src/agent/core/todo_manager.py`
注意事项:
- 研究阶段不能执行实际任务或调用工具。
- 用户确认路径后才能生成 TodoList。
- 生成 TodoList 后必须覆盖 `.todo`。
- 执行阶段应根据任务进度调用 `todo_status_update`。
### 10.3 修改前端 Todo 浮窗
相关文件:
- `src/web/app.js`:渲染、刷新、收起逻辑。
- `src/web/app.css`:浮窗视觉样式。
- `src/web/server.py`:`/api/todo` 数据接口。
## 11. 常见问题排查
### 11.1 前端看不到 Todo 浮窗
检查:
1. 后端 `/api/todo` 是否返回内容。
2. `src/agent/workspace/.todo` 是否存在且非空。
3. 浏览器控制台是否有 JS 错误。
4. 是否被收起为右侧悬浮球。
### 11.2 Plan 模式没有写入 `.todo`
检查:
1. 是否完成了路径选择确认。
2. `continue_after_human_action` 中 pending type 是否为 `plan_choice`。
3. 模型是否返回了 TodoList 文本。
4. 进程是否有写入 `src/agent/workspace/.todo` 的权限。
### 11.3 软件控制工具找不到软件
处理:
1. 使用更具体的软件名称。
2. 调用时设置 `rescan=True` 重建索引。
3. 确认软件有开始菜单或桌面快捷方式,或注册了 App Paths。
4. 检查索引文件:`src/agent/history/data_base/software_index.json`。
### 11.4 上下文过长
系统会基于 token 阈值自动压缩历史。如果超过硬限制,会提示新建会话。Plan TodoList 不依赖历史摘要保存,而是从 `.todo` 文件注入,因此不会因压缩丢失。
## 12. 维护建议
- `.todo` 属于运行态工作区文件,不建议作为长期知识库。
- 对高风险工具应保持人工审批或明确调用条件。
- 工具描述应写清楚“何时调用”和“何时严禁调用”,降低误调用概率。
- 修改工具注册后必须重启服务。
- 修改前端静态文件后刷新浏览器缓存。