#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
代码示例 08: Agent工具集成
展示如何在HelloAgents框架中集成MemoryTool和RAGTool
"""

import time
from hello_agents import SimpleAgent, HelloAgentsLLM, ToolRegistry
from hello_agents.tools import MemoryTool, RAGTool

class AgentIntegrationDemo:
    """Agent工具集成演示类"""
    
    def __init__(self):
        self.setup_agent()
    
    def setup_agent(self):
        """设置Agent和工具"""
        print("🤖 Agent工具集成设置")
        print("=" * 50)
        
        # 初始化工具
        print("1. 初始化工具...")
        self.memory_tool = MemoryTool(
            user_id="agent_integration_user",
            memory_types=["working", "episodic", "semantic", "perceptual"]
        )
        
        self.rag_tool = RAGTool(
            knowledge_base_path="./agent_integration_kb",
            rag_namespace="agent_demo"
        )
        
        print("✅ MemoryTool和RAGTool初始化完成")
        
        # 创建Agent
        print("\n2. 创建Agent...")
        self.llm = HelloAgentsLLM()
        self.agent = SimpleAgent(
            name="智能学习助手",
            llm=self.llm,
            description="集成记忆和RAG功能的智能助手"
        )
        
        print("✅ Agent创建完成")
        
        # 注册工具
        print("\n3. 注册工具...")
        self.tool_registry = ToolRegistry()
        self.tool_registry.register_tool(self.memory_tool)
        self.tool_registry.register_tool(self.rag_tool)
        self.agent.tool_registry = self.tool_registry
        
        print("✅ 工具注册完成")
        
        # 显示Agent状态
        print(f"\n📊 Agent状态:")
        print(f"  名称: {self.agent.name}")
        print(f"  描述: {self.agent.description}")
        print(f"  可用工具: {list(self.tool_registry.tools.keys())}")
    
    def demonstrate_tool_registry_pattern(self):
        """演示工具注册模式"""
        print("\n🔧 工具注册模式演示")
        print("-" * 50)
        
        print("工具注册模式特点:")
        print("• 🔌 统一的工具接口")
        print("• 📋 集中的工具管理")
        print("• 🔄 动态工具加载")
        print("• 🎯 工具能力发现")
        
        # 演示工具注册过程
        print(f"\n🔧 工具注册详情:")
        
        for tool_name, tool_instance in self.tool_registry.tools.items():
            print(f"\n工具: {tool_name}")
            print(f"  类型: {type(tool_instance).__name__}")
            print(f"  描述: {tool_instance.description}")
            
            # 显示工具的主要功能
            if tool_name == "memory":
                print(f"  主要功能: 记忆管理、搜索、整合、遗忘")
                print(f"  记忆类型: {tool_instance.memory_types}")
            elif tool_name == "rag":
                print(f"  主要功能: 文档处理、智能问答、知识检索")
                print(f"  命名空间: {tool_instance.rag_namespace}")
        
        # 演示工具发现机制
        print(f"\n🔍 工具能力发现:")
        available_tools = self.tool_registry.list_tools()
        print(f"可用工具列表: {available_tools}")
        
        # 演示工具获取
        memory_tool = self.tool_registry.get_tool("memory")
        rag_tool = self.tool_registry.get_tool("rag")
        
        print(f"\n✅ 工具获取成功:")
        print(f"  Memory工具: {type(memory_tool).__name__}")
        print(f"  RAG工具: {type(rag_tool).__name__}")
    
    def demonstrate_unified_interface(self):
        """演示统一接口模式"""
        print("\n🔗 统一接口模式演示")
        print("-" * 50)
        
        print("统一接口优势:")
        print("• 🎯 一致的调用方式")
        print("• 📝 标准化的参数传递")
        print("• 🛡️ 统一的错误处理")
        print("• 🔄 简化的工具切换")
        
        # 演示统一的execute接口
        print(f"\n🔗 统一execute接口演示:")
        
        # Memory工具操作
        print(f"\n1. Memory工具操作:")
        memory_operations = [
            ("add", {
                "content": "学习了Agent工具集成模式",
                "memory_type": "episodic",
                "importance": 0.8,
                "topic": "agent_integration"
            }),
            ("search", {
                "query": "Agent集成",
                "limit": 2
            }),
            ("stats", {})
        ]
        
        for operation, params in memory_operations:
            print(f"  操作: memory.execute('{operation}', {params})")
            result = self.memory_tool.execute(operation, **params)
            print(f"  结果: {str(result)[:100]}...")
        
        # RAG工具操作
        print(f"\n2. RAG工具操作:")
        
        # 先添加一些内容
        self.rag_tool.execute("add_text",
                            text="Agent工具集成是HelloAgents框架的核心特性，允许Agent使用多种工具来完成复杂任务。",
                            document_id="agent_integration_guide")
        
        rag_operations = [
            ("search", {
                "query": "Agent工具集成",
                "limit": 2
            }),
            ("ask", {
                "question": "什么是Agent工具集成？",
                "limit": 2
            }),
            ("stats", {})
        ]
        
        for operation, params in rag_operations:
            print(f"  操作: rag.execute('{operation}', {params})")
            result = self.rag_tool.execute(operation, **params)
            print(f"  结果: {str(result)[:100]}...")
    
    def demonstrate_collaborative_workflow(self):
        """演示协同工作流程"""
        print("\n🤝 协同工作流程演示")
        print("-" * 50)
        
        print("协同工作场景:")
        print("• 📚 学习新知识 → RAG存储 + Memory记录")
        print("• 🔍 回顾学习历程 → Memory检索 + RAG补充")
        print("• 💡 知识应用 → RAG查询 + Memory更新")
        print("• 📊 学习分析 → 两工具统计整合")
        
        # 场景1：学习新知识
        print(f"\n📚 场景1：学习新知识")
        
        # 向RAG添加学习资料
        learning_content = """# 设计模式：观察者模式

## 定义
观察者模式定义了对象间的一对多依赖关系，当一个对象的状态发生改变时，所有依赖它的对象都会得到通知并自动更新。

## 结构
- Subject（主题）：维护观察者列表，提供注册和删除观察者的方法
- Observer（观察者）：定义更新接口
- ConcreteSubject（具体主题）：实现主题接口
- ConcreteObserver（具体观察者）：实现观察者接口

## 应用场景
- GUI事件处理
- 模型-视图架构
- 发布-订阅系统
"""
        
        rag_result = self.rag_tool.execute("add_text",
                                         text=learning_content,
                                         document_id="observer_pattern")
        print(f"RAG添加结果: {rag_result}")
        
        # 记录学习活动到记忆系统
        memory_result = self.memory_tool.execute("add",
                                                content="学习了观察者设计模式的定义、结构和应用场景",
                                                memory_type="episodic",
                                                importance=0.8,
                                                topic="design_patterns",
                                                pattern_type="observer")
        print(f"Memory记录结果: {memory_result}")
        
        # 场景2：回顾学习历程
        print(f"\n🔍 场景2：回顾学习历程")
        
        # 从记忆系统检索学习历史
        memory_search = self.memory_tool.execute("search",
                                                query="设计模式学习",
                                                limit=3)
        print(f"学习历史回顾: {memory_search}")
        
        # 从RAG获取相关知识补充
        rag_search = self.rag_tool.execute("search",
                                         query="观察者模式",
                                         limit=2)
        print(f"知识内容补充: {rag_search}")
        
        # 场景3：知识应用
        print(f"\n💡 场景3：知识应用")
        
        # 通过RAG查询应用方法
        application_query = self.rag_tool.execute("ask",
                                                question="观察者模式适用于什么场景？",
                                                limit=2)
        print(f"应用场景查询: {application_query}")
        
        # 记录应用实践到记忆
        application_memory = self.memory_tool.execute("add",
                                                     content="查询了观察者模式的应用场景，准备在GUI项目中使用",
                                                     memory_type="working",
                                                     importance=0.7,
                                                     application_context="gui_project")
        print(f"应用记录: {application_memory}")
        
        # 场景4：学习分析
        print(f"\n📊 场景4：学习分析")
        
        # 获取记忆系统统计
        memory_stats = self.memory_tool.execute("stats")
        print(f"记忆统计: {memory_stats}")
        
        # 获取RAG系统统计
        rag_stats = self.rag_tool.execute("stats")
        print(f"知识库统计: {rag_stats}")
        
        # 生成学习摘要
        learning_summary = self.memory_tool.execute("summary", limit=5)
        print(f"学习摘要: {learning_summary}")
    
    def demonstrate_agent_orchestration(self):
        """演示Agent编排能力"""
        print("\n🎭 Agent编排能力演示")
        print("-" * 50)
        
        print("Agent编排特点:")
        print("• 🧠 智能工具选择")
        print("• 🔄 工具链式调用")
        print("• 📊 结果整合分析")
        print("• 🎯 目标导向执行")
        
        # 模拟复杂任务的工具编排
        print(f"\n🎭 复杂任务编排示例:")
        print(f"任务: 创建一个关于机器学习的学习计划")
        
        # 步骤1：从RAG获取机器学习知识结构
        print(f"\n步骤1: 获取知识结构")
        
        # 添加机器学习知识
        ml_content = """# 机器学习学习路径

## 基础阶段
1. 数学基础：线性代数、概率统计、微积分
2. 编程基础：Python、NumPy、Pandas
3. 机器学习概念：监督学习、无监督学习、强化学习

## 进阶阶段
1. 算法实现：从零实现经典算法
2. 深度学习：神经网络、CNN、RNN、Transformer
3. 实践项目：端到端机器学习项目

## 高级阶段
1. 模型优化：超参数调优、模型压缩
2. 部署运维：模型部署、监控、更新
3. 前沿技术：最新论文、开源项目
"""
        
        self.rag_tool.execute("add_text",
                            text=ml_content,
                            document_id="ml_learning_path")
        
        knowledge_structure = self.rag_tool.execute("ask",
                                                  question="机器学习的学习路径是什么？",
                                                  limit=3)
        print(f"知识结构: {knowledge_structure[:200]}...")
        
        # 步骤2：记录学习计划到记忆系统
        print(f"\n步骤2: 记录学习计划")
        
        plan_memory = self.memory_tool.execute("add",
                                             content="制定了机器学习学习计划，包括基础、进阶、高级三个阶段",
                                             memory_type="episodic",
                                             importance=0.9,
                                             plan_type="learning",
                                             subject="machine_learning")
        print(f"计划记录: {plan_memory}")
        
        # 步骤3：检索相关学习经验
        print(f"\n步骤3: 检索学习经验")
        
        experience_search = self.memory_tool.execute("search",
                                                    query="学习计划 学习经验",
                                                    limit=3)
        print(f"相关经验: {experience_search}")
        
        # 步骤4：整合生成最终建议
        print(f"\n步骤4: 生成最终建议")
        
        final_advice = self.rag_tool.execute("ask",
                                            question="如何制定有效的机器学习学习计划？",
                                            limit=4)
        print(f"最终建议: {final_advice[:300]}...")
        
        # 记录编排过程
        orchestration_memory = self.memory_tool.execute("add",
                                                       content="完成了复杂的学习计划制定任务，使用了RAG和Memory的协同编排",
                                                       memory_type="working",
                                                       importance=0.8,
                                                       task_type="orchestration")
        print(f"\n编排记录: {orchestration_memory}")
    
    def demonstrate_performance_analysis(self):
        """演示性能分析"""
        print("\n📊 性能分析演示")
        print("-" * 50)
        
        print("性能分析指标:")
        print("• ⏱️ 工具响应时间")
        print("• 🔄 工具切换开销")
        print("• 💾 内存使用情况")
        print("• 🎯 任务完成效率")
        
        # 性能测试
        print(f"\n📊 性能测试:")
        
        # 单工具性能测试
        print(f"\n1. 单工具性能:")
        
        # Memory工具性能
        start_time = time.time()
        for i in range(5):
            self.memory_tool.execute("add",
                                   content=f"性能测试记忆 {i+1}",
                                   memory_type="working",
                                   importance=0.5)
        memory_time = time.time() - start_time
        print(f"Memory工具 - 5次添加操作: {memory_time:.3f}秒")
        
        # RAG工具性能
        start_time = time.time()
        for i in range(3):
            self.rag_tool.execute("search",
                                query=f"测试查询 {i+1}",
                                limit=2)
        rag_time = time.time() - start_time
        print(f"RAG工具 - 3次搜索操作: {rag_time:.3f}秒")
        
        # 协同工作性能测试
        print(f"\n2. 协同工作性能:")
        
        start_time = time.time()
        
        # 模拟协同工作流程
        self.rag_tool.execute("add_text",
                            text="这是一个性能测试文档",
                            document_id="perf_test")
        
        self.memory_tool.execute("add",
                                content="执行了性能测试",
                                memory_type="working",
                                importance=0.6)
        
        rag_result = self.rag_tool.execute("search",
                                         query="性能测试",
                                         limit=1)
        
        memory_result = self.memory_tool.execute("search",
                                                query="性能测试",
                                                limit=1)
        
        collaborative_time = time.time() - start_time
        print(f"协同工作流程: {collaborative_time:.3f}秒")
        
        # 性能分析总结
        print(f"\n📈 性能分析总结:")
        print(f"Memory工具平均响应: {memory_time/5:.3f}秒/操作")
        print(f"RAG工具平均响应: {rag_time/3:.3f}秒/操作")
        print(f"协同工作效率: {collaborative_time:.3f}秒/流程")
        
        # 获取最终统计
        final_memory_stats = self.memory_tool.execute("stats")
        final_rag_stats = self.rag_tool.execute("stats")
        
        print(f"\n📊 最终系统状态:")
        print(f"Memory系统: {final_memory_stats}")
        print(f"RAG系统: {final_rag_stats}")

def main():
    """主函数"""
    print("🤖 Agent工具集成演示")
    print("展示如何在HelloAgents框架中集成MemoryTool和RAGTool")
    print("=" * 70)
    
    try:
        demo = AgentIntegrationDemo()
        
        # 1. 工具注册模式演示
        demo.demonstrate_tool_registry_pattern()
        
        # 2. 统一接口模式演示
        demo.demonstrate_unified_interface()
        
        # 3. 协同工作流程演示
        demo.demonstrate_collaborative_workflow()
        
        # 4. Agent编排能力演示
        demo.demonstrate_agent_orchestration()
        
        # 5. 性能分析演示
        demo.demonstrate_performance_analysis()
        
        print("\n" + "=" * 70)
        print("🎉 Agent工具集成演示完成！")
        print("=" * 70)
        
        print("\n✨ Agent集成核心特性:")
        print("1. 🔧 工具注册模式 - 统一的工具管理和发现")
        print("2. 🔗 统一接口设计 - 一致的工具调用方式")
        print("3. 🤝 协同工作流程 - 工具间的智能协作")
        print("4. 🎭 智能编排能力 - 复杂任务的自动分解")
        print("5. 📊 性能监控分析 - 全面的性能评估")
        
        print("\n🎯 设计优势:")
        print("• 模块化 - 工具独立开发，灵活组合")
        print("• 可扩展 - 支持动态添加新工具")
        print("• 高内聚 - 每个工具专注特定功能")
        print("• 低耦合 - 工具间依赖关系最小")
        
        print("\n💡 应用价值:")
        print("• 智能助手 - 构建多功能智能助手")
        print("• 知识管理 - 企业级知识管理系统")
        print("• 学习平台 - 个性化学习支持系统")
        print("• 决策支持 - 基于知识和经验的决策")
        
    except Exception as e:
        print(f"\n❌ 演示过程中发生错误: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    main()