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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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