| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- """
- A2A 协议 + HelloAgents SimpleAgent 集成案例
- 展示如何将 A2A 协议的 Agent 作为工具集成到 SimpleAgent 中
- """
- from hello_agents.protocols import A2AServer, A2AClient
- from hello_agents import SimpleAgent, HelloAgentsLLM
- from hello_agents.tools import ToolRegistry, Tool, ToolParameter
- import threading
- import time
- from typing import Dict, Any
- # ============================================================
- # 1. 创建专业 A2A Agent 服务
- # ============================================================
- # 技术专家 Agent
- tech_expert = A2AServer(
- name="tech_expert",
- description="技术专家,回答技术相关问题",
- version="1.0.0"
- )
- @tech_expert.skill("answer")
- def answer_tech_question(text: str) -> str:
- """回答技术问题"""
- import re
- match = re.search(r'answer\s+(.+)', text, re.IGNORECASE)
- question = match.group(1).strip() if match else text
-
- print(f" [技术专家] 回答问题: {question}")
- return f"技术回答:关于'{question}',这是一个技术问题的专业解答..."
- # 销售顾问 Agent
- sales_advisor = A2AServer(
- name="sales_advisor",
- description="销售顾问,回答销售问题",
- version="1.0.0"
- )
- @sales_advisor.skill("answer")
- def answer_sales_question(text: str) -> str:
- """回答销售问题"""
- import re
- match = re.search(r'answer\s+(.+)', text, re.IGNORECASE)
- question = match.group(1).strip() if match else text
-
- print(f" [销售顾问] 回答问题: {question}")
- return f"销售回答:关于'{question}',我们有特别优惠..."
- # ============================================================
- # 2. 启动 A2A Agent 服务
- # ============================================================
- print("="*60)
- print("🚀 启动专业 Agent 服务")
- print("="*60)
- threading.Thread(target=lambda: tech_expert.run(port=6000), daemon=True).start()
- threading.Thread(target=lambda: sales_advisor.run(port=6001), daemon=True).start()
- print("✓ 技术专家 Agent 启动在 http://localhost:6000")
- print("✓ 销售顾问 Agent 启动在 http://localhost:6001")
- print("\n⏳ 等待服务启动...")
- time.sleep(3)
- # ============================================================
- # 3. 创建 A2A 工具(封装 A2A Agent 为 Tool)
- # ============================================================
- class A2ATool(Tool):
- """将 A2A Agent 封装为 HelloAgents Tool"""
- def __init__(self, name: str, description: str, agent_url: str, skill_name: str = "answer"):
- self.agent_url = agent_url
- self.skill_name = skill_name
- self.client = A2AClient(agent_url)
- self._name = name
- self._description = description
- self._parameters = [
- ToolParameter(
- name="question",
- type="string",
- description="要问的问题",
- required=True
- )
- ]
- @property
- def name(self) -> str:
- return self._name
- @property
- def description(self) -> str:
- return self._description
- def get_parameters(self) -> list[ToolParameter]:
- """获取工具参数"""
- return self._parameters
- def run(self, **kwargs) -> str:
- """执行工具"""
- question = kwargs.get('question', '')
- result = self.client.execute_skill(self.skill_name, f"answer {question}")
- if result.get('status') == 'success':
- return result.get('result', 'No response')
- else:
- return f"Error: {result.get('error', 'Unknown error')}"
- # 创建工具
- tech_tool = A2ATool(
- name="tech_expert",
- description="技术专家,回答技术相关问题",
- agent_url="http://localhost:6000"
- )
- sales_tool = A2ATool(
- name="sales_advisor",
- description="销售顾问,回答销售相关问题",
- agent_url="http://localhost:6001"
- )
- # ============================================================
- # 4. 创建 SimpleAgent(使用 A2A 工具)
- # ============================================================
- print("\n" + "="*60)
- print("🤖 创建接待员 SimpleAgent")
- print("="*60)
- # 初始化 LLM
- llm = HelloAgentsLLM()
- # 创建接待员 Agent
- receptionist = SimpleAgent(
- name="接待员",
- llm=llm,
- system_prompt="""你是客服接待员,负责:
- 1. 分析客户问题类型(技术问题 or 销售问题)
- 2. 使用合适的工具(tech_expert 或 sales_advisor)获取答案
- 3. 整理答案并返回给客户
- 可用工具:
- - tech_expert: 回答技术问题
- - sales_advisor: 回答销售问题
- 请保持礼貌和专业。"""
- )
- # 添加 A2A 工具
- receptionist.add_tool(tech_tool)
- receptionist.add_tool(sales_tool)
- print("✓ 接待员 Agent 创建完成")
- print("✓ 已集成 A2A 工具: tech_expert, sales_advisor")
- # ============================================================
- # 5. 测试集成系统
- # ============================================================
- print("\n" + "="*60)
- print("🧪 测试 A2A + SimpleAgent 集成")
- print("="*60)
- # 测试问题
- test_questions = [
- "你们的产品有什么优惠活动吗?",
- "如何配置服务器的SSL证书?",
- "我想了解一下价格方案"
- ]
- for i, question in enumerate(test_questions, 1):
- print(f"\n问题 {i}: {question}")
- print("-" * 60)
- try:
- # 使用 SimpleAgent 的 run 方法
- response = receptionist.run(question)
- print(f"回答: {response}")
- except Exception as e:
- print(f"错误: {str(e)}")
- import traceback
- traceback.print_exc()
- print()
- # ============================================================
- # 6. 保持服务运行
- # ============================================================
- print("="*60)
- print("💡 系统仍在运行")
- print("="*60)
- print("你可以继续测试或按 Ctrl+C 停止\n")
- try:
- while True:
- time.sleep(1)
- except KeyboardInterrupt:
- print("\n\n✅ 系统已停止")
|