main_orchestrator.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import asyncio
  2. from python_a2a import AgentNetwork, A2AClient, Task, Message, MessageRole, TextContent
  3. import json
  4. import uuid
  5. from time import sleep
  6. async def main():
  7. # 步骤1:初始化 AgentNetwork 并注册专家 Agent
  8. # 1.1 创建 AgentNetwork 实例,用于管理 Agent 集合
  9. network = AgentNetwork(name="TravelOrchestrator")
  10. # 1.2 添加票务 Agent
  11. network.add("TicketAgent", "http://127.0.0.1:5009")
  12. # 1.3 添加天气 Agent
  13. network.add("WeatherAgent", "http://127.0.0.1:5008")
  14. print("[主控日志] AgentNetwork 初始化完成,已添加专家代理:")
  15. for agent_info in network.list_agents():
  16. print(json.dumps(agent_info, indent=4, ensure_ascii=False))
  17. print("-" * 50)
  18. # 步骤2:执行串行任务流
  19. # 2.1 任务一:查询天气
  20. weather_query = "北京的天气怎么样" # 用户请求
  21. print(f"[主控日志] 串行任务第一步:向 WeatherAgent 查询天气 -> '{weather_query}'")
  22. # 获取 WeatherAgent 客户端
  23. weather_client = network.get_agent("WeatherAgent")
  24. # 创建消息和任务
  25. message_weather = Message(content=TextContent(text=weather_query), role=MessageRole.USER)
  26. task_weather = Task(id="task-" + str(uuid.uuid4()), message=message_weather.to_dict())
  27. # 发送任务并等待结果,这是串行执行的关键
  28. weather_result_task = await weather_client.send_task_async(task_weather)
  29. sleep(1) # 模拟处理延迟
  30. # 从返回的任务中解析出天气信息
  31. weather_info = "未知天气"
  32. try:
  33. # 获取 artifacts 中的文本部分
  34. weather_parts = weather_result_task.artifacts[0]["parts"]
  35. if weather_parts and weather_parts[0].get("type") == "text":
  36. weather_info = weather_parts[0].get("text")
  37. print(f"[主控日志] 收到 WeatherAgent 的结果: '{weather_info}'")
  38. except Exception as e:
  39. print(f"[主控日志] 解析天气结果出错: {e}")
  40. # 2.2 任务二:根据天气结果预订高铁票
  41. # 这是将一个 Agent 的输出作为另一个 Agent 的输入的关键步骤
  42. print(f"\n[主控日志] 串行任务第二步:根据天气结果决定预订高铁票")
  43. ticket_query = f"预订一张从北京到上海的高铁票,当前天气是:{weather_info}"
  44. print(f"[主控日志] 传递给 TicketAgent 的查询为: '{ticket_query}'")
  45. # 获取 TicketAgent 客户端
  46. ticket_client = network.get_agent("TicketAgent")
  47. # 创建新的任务
  48. message_ticket = Message(content=TextContent(text=ticket_query), role=MessageRole.USER)
  49. task_ticket = Task(id="task-" + str(uuid.uuid4()), message=message_ticket.to_dict())
  50. # 发送任务并获取最终结果
  51. ticket_result_task = await ticket_client.send_task_async(task_ticket)
  52. sleep(1) # 模拟处理延迟
  53. # 打印最终结果
  54. print(f"\n[主控日志] 收到 TicketAgent 的最终结果:")
  55. print(json.dumps(ticket_result_task.to_dict(), indent=4, ensure_ascii=False))
  56. print("-" * 50)
  57. print("[主控日志] 所有串行任务完成!")
  58. if __name__ == "__main__":
  59. # 请确保 weather_agent.py 和 ticket_agent.py 正在运行...
  60. asyncio.run(main())