Files
Agent-Docs/ADKLearning/google-adk-tutorial/code/multi_agent_demo.py
Nelson 514723dbe7 init
2026-04-06 12:36:04 +08:00

276 lines
10 KiB
Python
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.
"""
Google ADK 多智能体系统完整示例
展示各种多 Agent 协作模式
对应教程第05章 - 多智能体系统
"""
# 导入 ADK 核心模块
from google.adk.agents import ( # 导入所有 Agent 类型
Agent, # LLM Agent别名
LlmAgent, # LLM Agent完整名
SequentialAgent, # 顺序工作流
ParallelAgent, # 并行工作流
LoopAgent, # 循环工作流
BaseAgent, # 基础 Agent自定义用
)
from google.adk.events import Event, EventActions # 导入事件类型
from google.adk.agents.invocation_context import InvocationContext # 导入上下文
from typing import AsyncGenerator # 导入异步生成器
# ========================================
# 模式一:协调器/调度器模式
# ========================================
# 定义专门的子 Agent
math_agent = LlmAgent(
name="MathExpert", # 数学专家
model="gemini-2.0-flash", # 模型
description="擅长数学计算和统计分析。", # 描述
instruction="你是数学专家,解决数学问题。给出详细的计算过程。", # 指令
)
writing_agent = LlmAgent(
name="WritingExpert", # 写作专家
model="gemini-2.0-flash", # 模型
description="擅长文案撰写和内容创作。", # 描述
instruction="你是写作专家,帮助用户撰写高质量的内容。", # 指令
)
coding_agent = LlmAgent(
name="CodingExpert", # 编程专家
model="gemini-2.0-flash", # 模型
description="擅长编程和代码调试。", # 描述
instruction="你是编程专家,帮助用户解决编程问题。提供带注释的代码。", # 指令
)
# 定义协调器
coordinator = LlmAgent(
name="Coordinator", # 协调器
model="gemini-2.0-flash", # 模型
description="根据问题类型分配给合适的专家。", # 描述
instruction=( # 指令
"你是一个任务协调器。\n"
"根据用户的问题类型,将任务分配给合适的专家:\n"
"- 数学相关 → MathExpert\n"
"- 写作相关 → WritingExpert\n"
"- 编程相关 → CodingExpert\n"
"使用 transfer_to_agent 工具进行任务分配。"
),
sub_agents=[math_agent, writing_agent, coding_agent], # 注册子 Agent
)
# ========================================
# 模式二:顺序流水线模式
# ========================================
# 步骤一:信息提取
extractor = LlmAgent(
name="Extractor", # 信息提取 Agent
model="gemini-2.0-flash", # 模型
instruction="从用户输入中提取关键信息。只输出提取的关键信息。", # 指令
output_key="extracted_info", # 输出保存到 state
)
# 步骤二:信息分析
analyzer = LlmAgent(
name="Analyzer", # 信息分析 Agent
model="gemini-2.0-flash", # 模型
instruction=( # 指令:引用上一步输出
"分析以下提取的信息,给出深度分析报告。\n"
"提取的信息:{extracted_info}"
),
output_key="analysis_result", # 输出保存到 state
)
# 步骤三:报告生成
reporter = LlmAgent(
name="Reporter", # 报告生成 Agent
model="gemini-2.0-flash", # 模型
instruction=( # 指令:引用前两步输出
"根据分析结果生成一份简洁的报告。\n"
"原始信息:{extracted_info}\n"
"分析结果:{analysis_result}"
),
)
# 创建顺序流水线
pipeline = SequentialAgent(
name="InfoPipeline", # 流水线名称
sub_agents=[extractor, analyzer, reporter], # 按顺序执行
)
# ========================================
# 模式三:并行扇出模式
# ========================================
# 并行任务一:天气查询
weather_agent = LlmAgent(
name="WeatherFetcher", # 天气查询
model="gemini-2.0-flash", # 模型
instruction="查询并返回天气信息。只返回天气数据。", # 指令
output_key="weather_data", # 输出保存到 state
)
# 并行任务二:新闻查询
news_agent = LlmAgent(
name="NewsFetcher", # 新闻查询
model="gemini-2.0-flash", # 模型
instruction="查询并返回最新新闻。只返回新闻摘要。", # 指令
output_key="news_data", # 输出保存到 state
)
# 并行任务三:交通查询
traffic_agent = LlmAgent(
name="TrafficFetcher", # 交通查询
model="gemini-2.0-flash", # 模型
instruction="查询并返回交通状况。只返回交通信息。", # 指令
output_key="traffic_data", # 输出保存到 state
)
# 创建并行执行器
gatherer = ParallelAgent(
name="InfoGatherer", # 并行执行器名称
sub_agents=[weather_agent, news_agent, traffic_agent], # 并行执行
)
# ========================================
# 模式四循环优化模式Generator-Critic
# ========================================
# 生成器 Agent
generator = LlmAgent(
name="Generator", # 生成器
model="gemini-2.0-flash", # 模型
instruction=( # 指令
"你是一个创意写手。\n"
"根据用户需求创作内容。\n"
"将创作的内容保存到 state['draft']。"
),
output_key="draft", # 输出保存到 state
)
# 评审器 Agent
critic = LlmAgent(
name="Critic", # 评审器
model="gemini-2.0-flash", # 模型
instruction=( # 指令
"你是一个严格的内容评审。\n"
"评审以下内容给出评分1-10和改进建议。\n"
"当前草稿:{draft}\n"
"如果评分 >= 8将 state['approved'] 设为 True。\n"
"否则,将改进建议保存到 state['feedback']。"
),
)
# 条件检查 Agent
class ApprovalChecker(BaseAgent):
"""检查内容是否通过审批"""
async def _run_async_impl(
self,
ctx: InvocationContext, # 调用上下文
) -> AsyncGenerator[Event, None]: # 返回事件生成器
"""执行检查"""
approved = ctx.session.state.get("approved", False) # 获取审批状态
yield Event( # 生成事件
author=self.name, # 事件作者
actions=EventActions(
escalate=approved, # 通过则退出循环
),
)
# 创建迭代优化循环
review_loop = LoopAgent(
name="ReviewLoop", # 循环名称
max_iterations=3, # 最多迭代3次
sub_agents=[critic, ApprovalChecker(name="Checker"), generator], # 循环体
)
# ========================================
# 模式五:多层级嵌套
# ========================================
# 第三层:具体执行 Agent
code_reviewer = LlmAgent(
name="CodeReviewer", # 代码审查
model="gemini-2.0-flash", # 模型
description="审查代码质量。", # 描述
instruction="审查代码并给出改进建议。", # 指令
)
test_writer = LlmAgent(
name="TestWriter", # 测试编写
model="gemini-2.0-flash", # 模型
description="编写单元测试。", # 描述
instruction="为代码编写单元测试。", # 指令
)
# 第二层:开发流水线
dev_pipeline = SequentialAgent(
name="DevPipeline", # 流水线
sub_agents=[code_reviewer, test_writer], # 顺序执行
)
# 第二层:其他 Agent
doc_writer = LlmAgent(
name="DocWriter", # 文档编写
model="gemini-2.0-flash", # 模型
description="编写技术文档。", # 描述
instruction="编写清晰的技术文档。", # 指令
)
# 第一层:根协调器
root_agent = LlmAgent(
name="RootCoordinator", # 根协调器
model="gemini-2.0-flash", # 模型
description="开发团队协调器。", # 描述
instruction=( # 指令
"你是一个开发团队协调器。\n"
"代码审查和测试交给 DevPipeline。\n"
"文档编写交给 DocWriter。"
),
sub_agents=[dev_pipeline, doc_writer], # 子 Agent
)
# ========================================
# 打印结构信息
# ========================================
if __name__ == "__main__":
print("=" * 60) # 分隔线
print("Google ADK 多智能体系统示例") # 标题
print("=" * 60) # 分隔线
print("\n📦 模式一:协调器/调度器") # 模式一
print(f" 根 Agent: {coordinator.name}") # 根 Agent
print(f" 子 Agent: {[a.name for a in coordinator.sub_agents]}") # 子 Agent
print("\n📦 模式二:顺序流水线") # 模式二
print(f" 流水线: {pipeline.name}") # 流水线
print(f" 步骤: {[a.name for a in pipeline.sub_agents]}") # 步骤
print("\n📦 模式三:并行扇出") # 模式三
print(f" 并行器: {gatherer.name}") # 并行器
print(f" 任务: {[a.name for a in gatherer.sub_agents]}") # 任务
print("\n📦 模式四:循环优化") # 模式四
print(f" 循环: {review_loop.name}") # 循环
print(f" 最大迭代: {review_loop.max_iterations}") # 最大迭代
print("\n📦 模式五:多层级嵌套") # 模式五
print(f" 根: {root_agent.name}") # 根
print(f" 第二层: {[a.name for a in root_agent.sub_agents]}") # 第二层
print(f" 第三层: {[a.name for a in dev_pipeline.sub_agents]}") # 第三层
print("\n✅ 所有模式定义完成!") # 成功信息
print("使用 'adk web''adk run' 运行。") # 运行提示