diff --git a/README.md b/README.md index d5e4b8f..c50e96e 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,28 @@ # 慧遇 Agent -慧遇智能体项目,基于 Google ADK (Agent Development Kit) 构建。 +基于 Google ADK (Agent Development Kit) 构建的智能体项目,支持多智能体协作、多用户会话管理和 REST API 集成。 ## 项目结构 ``` -workspace/ -├── agents/ # 所有 Agent 模块 +├── root_agent/ # 根智能体(小慧) │ ├── __init__.py -│ └── root_agent/ # Root Agent -│ ├── __init__.py -│ └── agent.py -├── base/ # 基础工具类 +│ └── agent.py # 定义 root_agent,包含子智能体引用 +├── note_agent/ # 笔记子智能体 │ ├── __init__.py -│ └── agent.py # HuiYuBaseAgent 基类 -├── common/ # 公共模块 -│ ├── __init__.py # 环境初始化(.env 加载、日志配置) -│ ├── logger.py # 模型调用耗时日志 -│ └── prompt_guard.py # 防提示词注入检测 -├── .env # 环境变量配置(不提交到 Git) -├── .env.example # 配置示例(可提交到 Git) -├── .gitignore +│ ├── agent.py # 定义 root_agent(ADK 要求导出名) +│ └── note_formatter.py # Markdown 笔记格式化器 +├── agent_base/ # Agent 基类 +│ ├── __init__.py +│ └── agent_base.py # HuiYuBaseAgent(防注入 + 日志) +├── common/ # 公共工具 +│ ├── __init__.py # 环境初始化(.env 加载、日志配置) +│ ├── logger.py # 模型调用耗时日志 +│ └── prompt_guard.py # 防提示词注入检测 +├── .env # 环境变量配置(不提交到 Git) +├── .env.example # 配置示例 +├── API_DOC.md # REST API 接口文档 +├── requirements.txt └── README.md ``` @@ -29,16 +31,9 @@ workspace/ - Python >= 3.10 - pip -## 环境搭建 +## 快速开始 -### 1. 克隆项目 - -```bash -git clone -cd -``` - -### 2. 安装依赖 +### 1. 安装依赖 ```bash pip install -r requirements.txt @@ -47,97 +42,98 @@ pip install -r requirements.txt 主要依赖: - `google-adk` — Google Agent Development Kit - `python-dotenv` — 环境变量管理 -- `litellm` — 多模型适配层 +- `litellm` — 多模型适配层(对接 MiniMax 等大模型) -### 3. 配置环境变量 - -复制示例配置文件并填入你的 API Key: +### 2. 配置环境变量 ```bash cp .env.example .env ``` -编辑 `.env` 文件: +编辑 `.env`: ```env -# MiniMax API Key(替换为你自己的) MINIMAX_API_KEY=your_api_key_here - -# MiniMax API 地址 MINIMAX_API_BASE=https://api.minimaxi.com/v1 - -# 模型名称 MINIMAX_MODEL=openai/MiniMax-M2.7 ``` -### 4. 启动服务 +### 3. 启动服务 ```bash -cd agents -adk web +# Web UI 模式(带聊天界面) +adk web . + +# API 服务模式(纯 REST API,适合外部集成) +adk api_server . --auto_create_session ``` -启动后访问 http://127.0.0.1:8000,在下拉菜单中选择 Agent 即可开始对话。 +启动后访问 `http://127.0.0.1:8000`。 + +## 智能体架构 + +``` +root_agent(小慧) +├── 通用对话:回答用户问题 +└── 子智能体委派: + └── note_agent(笔记助手) + ├── generate_text_note — 生成文本笔记 + └── generate_image_note — 生成图片笔记 +``` + +当用户请求涉及笔记生成、内容整理时,root_agent 会自动委派给 note_agent 处理。 + +## API 集成 + +使用 `adk api_server` 启动后,可通过 REST API 与 Agent 对话: + +```bash +# 启动 API 服务 +adk api_server . --auto_create_session --port 8000 + +# 发送对话 +curl -X POST http://localhost:8000/run \ + -H "Content-Type: application/json" \ + -d '{ + "app_name": "root_agent", + "user_id": "user_001", + "session_id": "my_session", + "new_message": {"role": "user", "parts": [{"text": "你好"}]} + }' +``` + +详细的接口文档见 [API_DOC.md](API_DOC.md),Swagger 文档地址:`http://localhost:8000/docs` ## 内置能力 -所有继承 `HuiYuBaseAgent` 的 Agent 自动获得以下能力: +所有继承 `HuiYuBaseAgent` 的 Agent 自动获得: ### 防提示词注入 -在模型调用前自动检测用户输入中的提示词注入攻击,包括: -- 角色扮演 / 身份覆盖 -- 指令泄露尝试 -- 分隔符注入 -- 越狱尝试 - -检测到注入时会拒绝请求并返回提示。 +模型调用前自动检测用户输入中的注入攻击(角色扮演、指令泄露、分隔符注入、越狱尝试等),检测到时拒绝请求。 ### 模型调用日志 -每次模型调用完成后自动记录: -- Agent 名称 -- 模型版本 -- 调用耗时 -- Token 使用量(prompt / completion / total) - -日志示例: +每次模型调用完成后自动记录 Agent 名称、模型版本、调用耗时、Token 用量: ``` -2026-04-06 07:54:59 [adk.agent] INFO - 模型调用完成 | agent=minimax_agent model=MiniMax-M2.7 latency=11.701s prompt_tokens=78 completion_tokens=31 total_tokens=109 +2026-04-06 07:54:59 [adk.agent] INFO - 模型调用完成 | agent=huiyu_agent model=MiniMax-M2.7 latency=11.701s prompt_tokens=78 completion_tokens=31 total_tokens=109 ``` ## 新增 Agent -在 `agents/` 目录下创建新的子目录即可: +在项目根目录下创建新的子目录即可: ``` -agents/ -├── root_agent/ -│ ├── __init__.py -│ └── agent.py -└── my_new_agent/ # 新增 Agent - ├── __init__.py # 内容同 root_agent/__init__.py - └── agent.py +my_new_agent/ +├── __init__.py # 留空即可 +└── agent.py # 必须导出名为 root_agent 的变量 ``` -`__init__.py` 内容(用于设置 Python 路径): +`agent.py` 示例: ```python -import sys -from pathlib import Path - -sys.path.insert(0, str(Path(__file__).parent.parent.parent)) - -from . import agent - -__all__ = ["agent"] -``` - -`agent.py` 中继承 `HuiYuBaseAgent`: - -```python -from base.agent import HuiYuBaseAgent +from agent_base.agent_base import HuiYuBaseAgent from google.adk.models.lite_llm import LiteLlm import os @@ -147,11 +143,26 @@ model = LiteLlm( api_key=os.getenv("MINIMAX_API_KEY"), ) -my_agent = HuiYuBaseAgent( +root_agent = HuiYuBaseAgent( name="my_agent", model=model, + description="我的智能体", instruction="你是一个专业的助手。", ) ``` -重启 `adk web` 后,新 Agent 会自动出现在下拉菜单中。 +> **注意**:ADK 要求每个 agent 目录的 `agent.py` 中必须导出名为 `root_agent` 的变量。 + +如需作为 root_agent 的子智能体,在 `root_agent/agent.py` 中添加引用: + +```python +from my_new_agent.agent import root_agent as my_new_agent + +root_agent = HuiYuBaseAgent( + name="huiyu_agent", + ..., + sub_agents=[my_new_agent], +) +``` + +重启服务后新 Agent 自动生效。 diff --git a/base/__init__.py b/agent_base/__init__.py similarity index 100% rename from base/__init__.py rename to agent_base/__init__.py diff --git a/base/agent.py b/agent_base/agent_base.py similarity index 100% rename from base/agent.py rename to agent_base/agent_base.py diff --git a/agents/__init__.py b/agents/__init__.py deleted file mode 100644 index ba8dcac..0000000 --- a/agents/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -""" -Agent 模块 - -每个 Agent 是一个独立的子目录,包含 agent.py 和 __init__.py。 -""" - -# 导出所有 Agent,供 adk web 服务注册 -from .root_agent import agent as root_agent - -__all__ = ["root_agent"] diff --git a/agents/note_agent/__init__.py b/agents/note_agent/__init__.py deleted file mode 100644 index 92786ce..0000000 --- a/agents/note_agent/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -import sys -from pathlib import Path - -sys.path.insert(0, str(Path(__file__).parent.parent.parent)) - -from . import agent - -__all__ = ["agent"] diff --git a/agents/root_agent/__init__.py b/agents/root_agent/__init__.py deleted file mode 100644 index d10156d..0000000 --- a/agents/root_agent/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -import sys -from pathlib import Path - -# 将项目根目录加入 sys.path(adk web 从 agents/ 启动) -# __file__ = agents/root_agent/__init__.py → parent.parent.parent = workspace/ -sys.path.insert(0, str(Path(__file__).parent.parent.parent)) - -from . import agent - -__all__ = ["agent"] diff --git a/note_agent/__init__.py b/note_agent/__init__.py new file mode 100644 index 0000000..a66dcf3 --- /dev/null +++ b/note_agent/__init__.py @@ -0,0 +1 @@ +# ADK agent_loader 会自动扫描并加载 agent.py diff --git a/agents/note_agent/agent.py b/note_agent/agent.py similarity index 97% rename from agents/note_agent/agent.py rename to note_agent/agent.py index 615ce56..ad6c83d 100644 --- a/agents/note_agent/agent.py +++ b/note_agent/agent.py @@ -1,6 +1,6 @@ import os -from base.agent import HuiYuBaseAgent +from agent_base.agent_base import HuiYuBaseAgent from google.adk.models.lite_llm import LiteLlm from .note_formatter import NoteFormatter @@ -55,7 +55,7 @@ def generate_image_note(title: str, description: str) -> str: # ============================================================ # 定义 Agent(继承 HuiYuBaseAgent) # ============================================================ -note_agent = HuiYuBaseAgent( +root_agent = HuiYuBaseAgent( name="note_agent", model=model, description="一个多模态笔记助手,能够将图片、文字等内容转换为结构化的 Markdown 笔记。", diff --git a/agents/note_agent/note_formatter.py b/note_agent/note_formatter.py similarity index 100% rename from agents/note_agent/note_formatter.py rename to note_agent/note_formatter.py diff --git a/root_agent/__init__.py b/root_agent/__init__.py new file mode 100644 index 0000000..a66dcf3 --- /dev/null +++ b/root_agent/__init__.py @@ -0,0 +1 @@ +# ADK agent_loader 会自动扫描并加载 agent.py diff --git a/agents/root_agent/agent.py b/root_agent/agent.py similarity index 66% rename from agents/root_agent/agent.py rename to root_agent/agent.py index 2c0e7c6..78caea3 100644 --- a/agents/root_agent/agent.py +++ b/root_agent/agent.py @@ -1,7 +1,8 @@ import os -from base.agent import HuiYuBaseAgent +from agent_base.agent_base import HuiYuBaseAgent from google.adk.models.lite_llm import LiteLlm +from note_agent.agent import root_agent as note_agent # ============================================================ # MiniMax 模型配置(从 .env 文件读取) @@ -26,5 +27,10 @@ root_agent = HuiYuBaseAgent( name="huiyu_agent", model=model, description="一个智能助手,能够回答用户的各种问题。", - instruction="你是一个乐于助人的中文 AI 助手,你的名字叫小慧,请用中文回答用户的问题,回答要准确、简洁、友好。", + instruction=( + "你是一个乐于助人的中文 AI 助手,你的名字叫小慧,请用中文回答用户的问题,回答要准确、简洁、友好。\n\n" + "你有一个子助手「笔记助手」(note_agent),当用户需要生成笔记、整理内容、做总结时," + "请将任务委派给 note_agent 处理。" + ), + sub_agents=[note_agent], )