import asyncio
from python_a2a import AgentNetwork, A2AClient, Task, Message, MessageRole, TextContent
import json
import uuid
from time import sleep
async def main():
# 步骤1:初始化 AgentNetwork 并注册专家 Agent
# 1.1 创建 AgentNetwork 实例,用于管理 Agent 集合
network = AgentNetwork(name="TravelOrchestrator")
# 1.2 添加票务 Agent
network.add("TicketAgent", "http://127.0.0.1:5009")
# 1.3 添加天气 Agent
network.add("WeatherAgent", "http://127.0.0.1:5008")
print("[主控日志] AgentNetwork 初始化完成,已添加专家代理:")
for agent_info in network.list_agents():
print(json.dumps(agent_info, indent=4, ensure_ascii=False))
print("-" * 50)
# 步骤2:执行串行任务流
# 2.1 任务一:查询天气
weather_query = "北京的天气怎么样" # 用户请求
# 获取 WeatherAgent 的客户端
weather_client = network.get_agent("WeatherAgent")
# 调用客户端
# 方式一:直接调用
weather_result = weather_client.ask(weather_query)
print("[主控日志] 天气查询结果:")
print(weather_result)
# 方式二:异步调用
# Message用来存储具体的任务内容
message = Message(content=TextContent(text=weather_query), role=MessageRole.USER)
# Task中存储和封装Message
weather_task = Task(message=message.to_dict(), id="task-" + str(uuid.uuid4()))
# 使用 send_task_async 实现异步调用
weather_result = await weather_client.send_task_async(weather_task)
# 解析结果
weather_info = "未知天气"
try:
# 获取 artifacts 中的文本部分
weather_parts = weather_result.artifacts[0]["parts"]
if weather_parts and weather_parts[0].get("type") == "text":
weather_info = weather_parts[0].get("text")
print(f"[主控日志] 收到 WeatherAgent 的结果: '{weather_info}'")
except Exception as e:
print(f"[主控日志] 解析天气结果出错: {e}")
# 2.2 任务二: 根据天气的结果预定火车票
ticket_query = f"预订一张从北京到上海的火车票,当前天气是:{weather_info}"
# 获取 TicketAgent 的客户端
ticket_client = network.get_agent("TicketAgent")
# 异步调用
# Message用来存储具体的任务内容
ticket_message = Message(content=TextContent(text=ticket_query), role=MessageRole.USER)
# Task中存储和封装Message
ticket_task = Task(message=ticket_message.to_dict(), id="task-" + str(uuid.uuid4()))
# 使用 send_task_async 实现异步调用
ticket_result = await ticket_client.send_task_async(ticket_task)
# 打印最终结果
print(f"\n[主控日志] 收到 TicketAgent 的最终结果:")
print(json.dumps(ticket_result.to_dict(), indent=4, ensure_ascii=False))
if __name__ == "__main__":
asyncio.run(main())