""" Sub-Agent 使用示例 演示如何使用 Sub-Agent 机制处理复杂任务。 """ import asyncio import os from agent import AgentRunner, AgentConfig from agent.llm import create_gemini_llm_call from agent.agent_registry import get_agent_registry from agent.models.agent import AgentDefinition async def example_basic_subagent(): """示例 1: 使用内置 Sub-Agent""" print("=== 示例 1: 使用内置 Sub-Agent ===\n") # 配置主 Agent config = AgentConfig( agent_type="primary", max_iterations=20, skills_dir="./skills", ) runner = AgentRunner( llm_call=create_gemini_llm_call(os.getenv("GEMINI_API_KEY")), config=config, ) # 主 Agent 会自动知道如何使用 Task 工具启动 Sub-Agent task = """ 分析这个 Python 项目的架构: 1. 找出所有主要的模块和它们的职责 2. 识别核心的数据流 3. 列出使用的外部依赖 请使用 explore sub-agent 来探索代码库。 """ async for event in runner.run(task=task, model="gemini-2.0-flash-exp"): if event.type == "tool_call" and event.data.get("tool") == "task": print(f"🚀 启动 Sub-Agent: {event.data['args']['subagent_type']}") print(f" 任务: {event.data['args']['description']}") elif event.type == "tool_result" and event.data.get("tool") == "task": metadata = event.data.get("metadata", {}) print(f"✅ Sub-Agent 完成") print(f" Sub-Trace ID: {metadata.get('sub_trace_id')}") print(f" 工具调用: {metadata.get('tool_summary')}") elif event.type == "conclusion": print(f"\n📋 最终结果:\n{event.data['content']}") async def example_custom_subagent(): """示例 2: 定义和使用自定义 Sub-Agent""" print("\n=== 示例 2: 自定义 Sub-Agent ===\n") # 1. 定义自定义 Sub-Agent security_scanner = AgentDefinition( name="security-scanner", description="安全扫描专家,查找常见漏洞和安全问题", mode="subagent", allowed_tools=[ "read_file", "search_code", "list_files", ], denied_tools=[ "write_file", "edit_file", "execute_bash", ], system_prompt="""你是一个安全扫描专家。专注于: 1. 查找常见安全漏洞: - SQL 注入 - XSS 攻击 - CSRF 漏洞 - 不安全的序列化 - 路径遍历 2. 检查敏感信息泄露: - 硬编码的密钥和密码 - API token - 数据库凭据 3. 依赖项安全: - 过时的依赖 - 已知漏洞的包 输出格式: - **漏洞类型**: [类型名称] - **严重程度**: [高/中/低] - **位置**: [文件路径:行号] - **描述**: [详细说明] - **修复建议**: [如何修复] """, max_iterations=25, temperature=0.2, # 更精确的分析 ) # 2. 注册到全局注册表 get_agent_registry().register(security_scanner) print(f"✓ 注册自定义 Sub-Agent: {security_scanner.name}") # 3. 使用自定义 Sub-Agent config = AgentConfig( agent_type="primary", max_iterations=20, ) runner = AgentRunner( llm_call=create_gemini_llm_call(os.getenv("GEMINI_API_KEY")), config=config, ) task = """ 对这个项目进行安全审计,使用 security-scanner sub-agent。 重点关注: 1. 认证和授权相关代码 2. 数据库交互代码 3. 用户输入处理 """ async for event in runner.run(task=task, model="gemini-2.0-flash-exp"): if event.type == "tool_call" and event.data.get("tool") == "task": print(f"🔍 启动安全扫描...") elif event.type == "conclusion": print(f"\n🔒 安全审计报告:\n{event.data['content']}") async def example_multiple_subagents(): """示例 3: 并行使用多个 Sub-Agent""" print("\n=== 示例 3: 并行使用多个 Sub-Agent ===\n") config = AgentConfig( agent_type="primary", max_iterations=30, ) runner = AgentRunner( llm_call=create_gemini_llm_call(os.getenv("GEMINI_API_KEY")), config=config, ) task = """ 完整分析这个项目: 1. 使用 explore sub-agent 探索代码结构 2. 使用 analyst sub-agent 分析技术栈和依赖 3. 综合两个分析结果,给出项目概览 可以并行启动多个 sub-agent 来加快速度。 """ subagent_results = {} async for event in runner.run(task=task, model="gemini-2.0-flash-exp"): if event.type == "tool_call" and event.data.get("tool") == "task": agent_type = event.data['args']['subagent_type'] print(f"🔄 启动 Sub-Agent: {agent_type}") elif event.type == "tool_result" and event.data.get("tool") == "task": metadata = event.data.get("metadata", {}) agent_type = metadata.get("subagent_type") subagent_results[agent_type] = { "sub_trace_id": metadata.get("sub_trace_id"), "summary": metadata.get("tool_summary"), } print(f"✅ {agent_type} 完成: {metadata.get('tool_summary')}") elif event.type == "conclusion": print(f"\n📊 综合分析报告:\n{event.data['content']}") print(f"\n📈 Sub-Agent 使用统计:") for agent_type, result in subagent_results.items(): print(f" - {agent_type}: {result['summary']}") async def example_subagent_config_file(): """示例 4: 从配置文件加载 Sub-Agent""" print("\n=== 示例 4: 配置文件方式 ===\n") # 1. 从配置文件加载 # 假设有 sub_agents.json: # { # "agents": { # "code-reviewer": { # "description": "代码审查专家", # "mode": "subagent", # "allowed_tools": ["read_file", "search_code"], # "system_prompt": "你是代码审查专家..." # } # } # } registry = get_agent_registry() # 如果配置文件存在 config_path = "sub_agents.json" if os.path.exists(config_path): registry.load_from_config(config_path) print(f"✓ 从 {config_path} 加载 Agent 配置") # 2. 列出所有可用的 Sub-Agent print("\n可用的 Sub-Agent:") for agent in registry.list_subagents(): print(f" - {agent.name}: {agent.description}") async def main(): """运行所有示例""" # 示例 1: 基本使用 await example_basic_subagent() # 示例 2: 自定义 Sub-Agent await example_custom_subagent() # 示例 3: 并行使用多个 Sub-Agent await example_multiple_subagents() # 示例 4: 配置文件方式 await example_subagent_config_file() if __name__ == "__main__": asyncio.run(main())