# agent项目
**Repository Path**: hadlooop/simon-agent
## Basic Information
- **Project Name**: agent项目
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-15
- **Last Updated**: 2026-09-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Multi-Agent
基于 FastAPI、LangChain、LangGraph 的多 Agent 服务。Supervisor 根据用户意图在
`research`、`coding`、`writing`、`wechat_writer`、`analyst` 五个专业 Agent 之间路由。
开发环境、代码边界、扩展流程和迁移规范见 [DEVELOPMENT.md](DEVELOPMENT.md)。
## 核心能力
- Supervisor 结构化路由,不依赖关键词硬编码
- Research Agent:Tavily Web 搜索、文件读取
- Coding Agent:代码生成、受限 Python 执行、文件读取、计算器
- Writing Agent:中文与英文写作、改写和润色
- WeChat Writer Agent:微信公众号选题、标题、长文写作和移动端排版
- Analyst Agent:计算器、只读 SQLite 查询
- 短期会话记忆、JSON 长期记忆和轻量向量检索
- OpenAI、Qwen、DeepSeek 兼容模型工厂
- 同步聊天接口、异步任务接口、Agent 路由与信息接口
- 可选 MySQL、Redis 和 Docker Compose 部署
## 软件架构
核心设计思路是:Supervisor 不直接处理具体业务,不调用业务工具,也不生成最终业务答案。
它只判断用户问题属于哪类任务,并分派给对应的专业 Agent;专业 Agent 再按自己的 Prompt 处理
任务,并按需调用统一工具层,最终由所选模型生成结果。
```mermaid
flowchart TB
User[用户] --> API[FastAPI]
API --> ChatService[ChatService]
ChatService --> Supervisor[Supervisor Agent
任务分析 / 路由]
Supervisor --> Research[Research Agent]
Supervisor --> Coding[Coding Agent]
Supervisor --> Writing[Writing Agent]
Supervisor --> WeChatWriter[WeChat Writer Agent]
Supervisor --> Analyst[Analyst Agent]
Research --> Tools[Tools]
Coding --> Tools
Writing --> Tools
WeChatWriter --> Tools
Analyst --> Tools
Tools --> ToolList[Web Search / Database / Calculator
File Reader / Code Executor]
ToolList --> LLM[LLM
DeepSeek / Qwen / OpenAI]
ChatService -.会话与长期记忆.-> Memory[Short / Long / Vector Memory]
Tools -.可选 MCP 适配.-> MCP[MCP Servers]
API -.异步任务.-> Queue[(Redis Queue)]
Queue --> Worker[Task Worker]
Worker --> ChatService
```
Supervisor 路由规则:
| 任务类型 | 路由目标 | 处理范围 |
| --- | --- | --- |
| `research` | `ResearchAgent` | 搜索、资料收集、事实核验和综合 |
| `coding` | `CodingAgent` | 软件开发、代码生成、调试和受限代码执行 |
| `writing` | `WritingAgent` | 写作、改写、编辑和语气调整 |
| `wechat_writer` | `WechatWriterAgent` | 微信公众号选题、标题、长文写作和移动端排版 |
| `analyst` | `AnalystAgent` | 计算、数据查询和定量分析 |
数据库表:
| 表名 | 说明 |
| --- | --- |
| `ai_users` | 用户账号 |
| `ai_tasks` | AI 任务主表 |
| `ai_task_executions` | 任务执行记录 |
| `ai_agents` | Agent 目录 |
| `ai_agent_executions` | Agent 执行记录 |
| `ai_node_executions` | 工作流节点执行记录 |
| `ai_llm_models` | LLM 模型目录 |
| `ai_llm_calls` | LLM 调用明细 |
| `ai_tools` | 工具目录 |
| `ai_tool_calls` | 工具调用明细 |
| `ai_messages` | 任务消息记录 |
字段含义和数据库注释统一维护在 `app/db/models/comments.py`。
MCP 通过 `app/mcp/` 接入外部工具、资源和业务系统。Agent 之间仍由 LangGraph 和 Supervisor
负责编排,MCP 不用于 Agent-to-Agent 路由。
MCP 配置示例:
```dotenv
MCP_ENABLED=true
MCP_SERVERS={"filesystem":{"transport":"stdio","command":"npx","args":["-y","@modelcontextprotocol/server-filesystem","/tmp"]}}
MCP_AGENT_SERVERS={"research":["filesystem"],"coding":["filesystem"],"writing":[],"wechat_writer":[],"analyst":[]}
```
也可以使用 `sse`、`http`、`streamable_http` 或 `websocket` transport。只有
`MCP_AGENT_SERVERS` 中明确授权的 Server 才会暴露给对应 Agent。
## 用户与历史
注册或登录后会签发 JWT,同时写入 `HttpOnly` Cookie。浏览器页面使用 Cookie 认证,
API 客户端仍可使用 `Authorization: Bearer `。登录状态下:
- `/api/v1/chat` 创建的调用会归属当前用户。
- `/agent` 和 `/` 页面只允许登录用户访问。
- `/agent` 页面会加载当前用户的历史任务。
- 点击历史任务可以查看结果,并继续向同一任务发送消息。
- `/api/v1/tasks`、任务详情和 trace 只允许访问当前用户自己的任务。
密码使用带随机盐的 `scrypt` 哈希保存,接口只返回用户公开信息。
请求链路:
1. API 层使用 Pydantic 校验请求,并调用对应 Service。
2. `ChatService` 读取短期历史、长期记忆和向量记忆,构造 LangChain 消息。
3. LangGraph 进入 Supervisor Agent,只返回结构化路由决策,不处理具体业务。
4. 被选中的专业 Agent 使用各自 Prompt 和 Tool 完成任务。
5. 工具结果返回 Agent,并通过统一 LLM 工厂生成最终回答。
6. `finalize` 节点统一输出,聊天历史写回短期和长期记忆。
7. API 返回回答、路由 Agent、路由原因、模型名和工具调用记录。
## 目录结构
```text
.
├── app/
│ ├── main.py # FastAPI 应用工厂、生命周期、路由注册和全局异常处理
│ │
│ ├── api/ # HTTP 接口层,只负责请求校验、调用 Service 和返回响应
│ │ ├── router.py # API 总路由,统一挂载 v1
│ │ └── v1/
│ │ ├── chat.py # 对话、清除会话接口
│ │ ├── agent.py # Agent 列表、Supervisor 路由测试接口
│ │ └── task.py # 异步任务创建和状态查询接口
│ │
│ ├── agents/ # Agent 领域层,定义 Agent 基类、注册中心和专业 Agent
│ │ ├── base.py # Agent 公共构建、执行和结果解析逻辑
│ │ ├── registry.py # Agent 注册、查找和元数据描述
│ │ ├── supervisor/ # Supervisor Agent:任务分析、专业 Agent 路由
│ │ ├── research/ # Research Agent:搜索、资料整理和事实综合
│ │ ├── coding/ # Coding Agent:代码生成、调试和受限代码执行
│ │ ├── writing/ # Writing Agent:写作、改写和语气调整
│ │ ├── wechat_writer/ # Wechat Writer Agent:微信公众号文章写作
│ │ └── analyst/ # Analyst Agent:计算、数据查询和定量分析
│ │
│ ├── workflows/ # LangGraph 多 Agent 工作流
│ │ ├── state.py # 图状态:消息、路由结果、最终答案和工具调用
│ │ ├── nodes.py # Supervisor、专业 Agent、finalize 节点
│ │ └── graph.py # 编译并连接完整 LangGraph 主流程
│ │
│ ├── mcp/ # MCP Server 注册、连接和工具适配
│ │ ├── registry.py # MCP Server 与 Agent 权限映射
│ │ └── client.py # MCP Client 生命周期和工具加载
│ │
│ ├── llm/ # 大模型工厂,统一模型参数和供应商切换
│ │ ├── factory.py # 根据 LLM_PROVIDER 选择具体模型
│ │ ├── openai.py # OpenAI 模型配置
│ │ ├── qwen.py # 通义千问兼容接口配置
│ │ └── deepseek.py # DeepSeek 模型配置
│ │
│ ├── tools/ # LangChain 工具层,供专业 Agent 按需调用
│ │ ├── web_search.py # Tavily Web 搜索
│ │ ├── calculator.py # 安全算术计算
│ │ ├── database.py # 只读 SQLite 查询
│ │ ├── code_executor.py # 默认关闭的受限 Python 执行
│ │ └── file_reader.py # 限制目录范围的文本文件读取
│ │
│ ├── memory/ # 记忆层
│ │ ├── short_term.py # 会话短期记忆,支持内存或 Redis
│ │ ├── long_term.py # JSON 长期记忆
│ │ └── vector.py # 轻量向量相似度检索
│ │
│ ├── models/ # 跨层数据模型
│ │ ├── request.py # Chat、Agent 路由和 Task 请求模型
│ │ ├── response.py # API 响应、任务状态和健康检查模型
│ │ └── message.py # 会话消息、角色和工具调用模型
│ │
│ ├── services/ # 业务编排层,连接 API、工作流、记忆和任务
│ │ ├── chat_service.py # 对话主流程和记忆读写
│ │ ├── agent_service.py # Agent 元数据与单次路由
│ │ ├── task_service.py # 任务持久化、调度和执行协调
│ │ ├── task_queue.py # Redis 可靠任务队列
│ │ ├── readiness.py # 服务和依赖就绪检查
│ │ └── observability/ # trace、回调、序列化和持久化实现
│ ├── repositories/ # 任务等持久化仓储
│ ├── worker.py # 独立 Redis 任务 Worker
│ │
│ ├── config/ # 环境变量和应用配置
│ │ └── settings.py # Pydantic Settings 配置中心
│ │
│ ├── db/ # 数据库基础设施
│ │ ├── mysql.py # SQLAlchemy 异步 MySQL 连接
│ │ ├── redis.py # Redis 异步客户端
│ │ └── models/ # 按表拆分的 SQLAlchemy 持久化模型
│ │
│ └── utils/ # 通用工具
│ ├── logger.py # 日志初始化
│ ├── json_utils.py # JSON 序列化辅助
│ └── token_utils.py # Token 估算
│
├── tests/ # 自动化测试,按主要业务层组织
│ ├── agents/ # Agent 注册中心测试
│ ├── workflows/ # Supervisor 和 Graph 节点测试
│ ├── api/ # FastAPI 接口测试
│ └── tools/ # 工具安全性和行为测试
│
├── prompts/ # 公共 Prompt 资源
│ ├── system/ # 多 Agent 全局系统约束
│ └── templates/ # Supervisor 和各专业 Agent 的提示词模板
│
├── scripts/ # 运维和调试脚本
│ ├── init_db.py # 初始化 MySQL 数据表
│ └── test_agent.py # 调用运行中 Agent 的命令行脚本
│
├── .env # 本地运行配置,不提交敏感内容
├── .env.example # 环境变量模板
├── requirements.txt # pip 运行依赖
├── pyproject.toml # 项目、uv、Pytest 和 Ruff 配置
├── Makefile # 常用开发命令
├── Dockerfile # 应用镜像构建配置
├── docker-compose.yml # FastAPI、MySQL、Redis 编排
├── LICENSE # MIT 开源协议
├── DEVELOPMENT.md # 开发环境、架构边界和扩展流程
└── README.md # 项目说明和接口示例
```
## 开源协议
本项目采用 [MIT License](LICENSE)。
## 快速开始
要求 Python 3.13.8 和 `uv`。项目通过 `.python-version` 固定 Python 版本。
```bash
cp .env.example .env
# 编辑 .env,配置所选模型供应商的 API Key
make install
make migrate
make run
```
默认地址:
- API 文档:http://127.0.0.1:8000/docs
- 任务监控页面:http://127.0.0.1:8000/
- Agent 调用页面:http://127.0.0.1:8000/agent
- 登录注册页面:http://127.0.0.1:8000/login
- 用户注册页面:http://127.0.0.1:8000/register
- 健康检查:http://127.0.0.1:8000/health
- 就绪检查:http://127.0.0.1:8000/ready
- Agent 列表:http://127.0.0.1:8000/api/v1/agents
服务默认监听 `8000` 端口。可通过 `.env` 中的 `APP_PORT` 修改,本地运行和
Docker Compose 会使用同一端口:
```dotenv
APP_PORT=9000
```
## API
同步对话:
```bash
curl -X POST http://127.0.0.1:8000/api/v1/chat \
-H "Content-Type: application/json" \
-d '{"session_id":"demo","message":"计算 (128 + 72) * 3"}'
```
仅测试 Supervisor 路由:
```bash
curl -X POST http://127.0.0.1:8000/api/v1/agents/route \
-H "Content-Type: application/json" \
-d '{"message":"帮我写一篇产品发布公告"}'
```
创建异步任务:
```bash
curl -X POST http://127.0.0.1:8000/api/v1/tasks \
-H "Content-Type: application/json" \
-d '{"message":"分析这份销售数据"}'
```
查询任务:
```bash
curl http://127.0.0.1:8000/api/v1/tasks/
```
清除会话:
```bash
curl -X DELETE http://127.0.0.1:8000/api/v1/chat/sessions/demo
```
## 模型配置
通过 `.env` 中的 `LLM_PROVIDER` 选择实际使用的模型,并填写对应供应商的 API Key。
OpenAI:
```dotenv
LLM_PROVIDER=openai
OPENAI_API_KEY=your-key
OPENAI_MODEL=gpt-4o-mini
```
Qwen:
```dotenv
LLM_PROVIDER=qwen
QWEN_API_KEY=your-key
QWEN_MODEL=qwen-plus
```
DeepSeek:
```dotenv
LLM_PROVIDER=deepseek
DEEPSEEK_API_KEY=your-key
DEEPSEEK_MODEL=deepseek-chat
```
## 安全边界
- Python 代码执行默认关闭,仅在 `ALLOW_CODE_EXECUTION=true` 时启用。
- 文件读取被限制在 `FILE_READER_ROOT_PATH` 下。
- SQLite 工具只允许只读 `SELECT` 或 `WITH` 查询。
- `.env`、长期记忆、向量数据和本地数据库目录已加入 `.gitignore`。
## Docker
```bash
make docker-up
```
Compose 会启动迁移任务、FastAPI、独立 Worker、MySQL 和 Redis。迁移服务会先执行 Alembic,
成功后再启动 API 和 Worker。
本地不使用 Docker 时,默认 `TASK_QUEUE_ENABLED=false`,任务在当前 API 进程内执行。需要
Redis 队列模式时设置 `TASK_QUEUE_ENABLED=true`,并额外运行 `make run-worker`。
生产部署前必须替换 Compose 中的默认数据库密码,并根据需要调整端口、认证、限流、日志和监控。
常用 Docker 命令:
```bash
make docker-build # 构建应用镜像
make docker-up-d # 后台启动 FastAPI、MySQL 和 Redis
make docker-logs # 跟踪容器日志
make docker-down # 停止并移除容器
```
## 开发命令
```bash
make test
make lint
make format
make check
make build
make migrate
make init-db
make run-worker
make docker-up
```