You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

204 lines
5.8 KiB
Python

6 months ago
"""
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✅ 系统已停止")