weather_agent.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import json
  2. from python_a2a import A2AServer, run_server, AgentCard, AgentSkill, TaskStatus, TaskState
  3. # A2A Agent 的名片
  4. agent_card = AgentCard(
  5. name="WeatherAgentServer",
  6. description="一个天气预报查询的专家 Agent",
  7. url="http://127.0.0.1:5008",
  8. skills=[AgentSkill(name="query", description="接受天气查询查询",examples=["天气北京"])]
  9. )
  10. class WeatherAgentServer(A2AServer):
  11. def __init__(self):
  12. super().__init__(agent_card=agent_card)
  13. def handle_task(self, task):
  14. print("收到A2A任务的task:=>", task)
  15. query = (task.message or {}).get("content", {}).get("text", "")
  16. print(f"[{self.agent_card.name} 日志] 收到 A2A 任务: '{query}'")
  17. # 决策:如果查询包含“天气”,就调用 MCP 工具
  18. if "天气" in query:
  19. print(f"[{self.agent_card.name} 日志] 决策:任务需要天气数据,准备调用工具...")
  20. try:
  21. # 这里的结果可以来自于 MCP 模块,这里我们直接模拟结果
  22. weather_result = {"温度": 30, "天气": "晴天"}
  23. print(f"[{self.agent_card.name} 日志] 从 MCP 工具获得结果: '{weather_result}'")
  24. # 将结果保存为任务 artifacts,artifacts是任务的输出结果
  25. task.artifacts = [{"parts": [{"type": "text", "text": json.dumps(weather_result, ensure_ascii=False)}]}]
  26. except Exception as e:
  27. error_msg = f"调用 工具失败: {e}"
  28. print(f"[{self.agent_card.name} 日志] {error_msg}")
  29. task.artifacts = [{"parts": [{"type": "text", "text": error_msg}]}]
  30. task.status = TaskStatus(state=TaskState.FAILED)
  31. return task
  32. else:
  33. task.artifacts = [{"parts": [{"type": "text", "text": "无法理解的任务"}]}]
  34. if "天气" in query:
  35. task.status = TaskStatus(state=TaskState.COMPLETED)
  36. else:
  37. task.status = TaskStatus(state=TaskState.INPUT_REQUIRED)
  38. print(f"[{self.agent_card.name} 日志] 任务处理完毕")
  39. print(f"[{self.agent_card.name} 日志] 输出结果task: {task}")
  40. print(f"[{self.agent_card.name} 日志] 输出结果task.artifacts: {task.artifacts}")
  41. return task
  42. if __name__ == "__main__":
  43. server = WeatherAgentServer()
  44. print(f"[{server.agent_card.name}] 已启动,在 {server.agent_card.url}")
  45. run_server(server, host="127.0.0.1", port=5008)