Files
auto_agent/docs/feishu_development_guide.md
T

374 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.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` 属于运行态工作区文件,不建议作为长期知识库。
- 对高风险工具应保持人工审批或明确调用条件。
- 工具描述应写清楚“何时调用”和“何时严禁调用”,降低误调用概率。
- 修改工具注册后必须重启服务。
- 修改前端静态文件后刷新浏览器缓存。