agents.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. from .state import TravelState
  2. from .tools import get_transport_tools,get_hotel_tools,get_attraction_tools
  3. from langchain.agents import create_agent
  4. from llm import create_model
  5. from config import load_config
  6. config=load_config()
  7. llm = create_model(config)
  8. def coordinator_node(state: TravelState)->dict:
  9. return{}
  10. #路线agent节点
  11. async def transport_agent_node(state: TravelState) -> dict:
  12. user_request= state["user_request"]
  13. tools=await get_transport_tools()
  14. agent = create_agent(
  15. model=llm,
  16. tools=tools,
  17. system_prompt="""你是旅行规划系统中的交通专家,只负责交通与市内通勤建议。
  18. 根据用户需求,必要时调用地图工具查询路线、距离或交通方式。
  19. 优先提供公共交通建议;用户明确自驾时再提供驾车建议。
  20. 若用户未提供出发地、日期等关键条件,应明确说明你的假设或待确认信息。
  21. 不得推荐酒店、景点或编造工具未返回的路线数据。
  22. 输出应包含:推荐交通方式、预计耗时、关键换乘/路线信息、出行提醒。"""
  23. )
  24. result = await agent.ainvoke({"messages":[{"role":"user","content":user_request}]})
  25. return {"transport_plan":result["messages"][-1].content}
  26. #酒店agent节点
  27. async def hotel_agent_node(state:TravelState)->dict:
  28. user_request= state["user_request"]
  29. tools=await get_hotel_tools()
  30. agent = create_agent(
  31. model=llm,
  32. tools=tools,
  33. system_prompt="""你是旅行规划系统中的住宿专家,只负责查询与推荐住宿。
  34. 当用户给出了目的地时,必要时调用 hotel_search_and_recommend。
  35. 调用时:
  36. - destination 必填,从用户请求中提取城市、区域或地标;
  37. - query 传入完整用户原始需求;
  38. - scene 可映射为商务、亲子、度假、背包或通用;
  39. - 用户明确给出入住/退房日期时,才传 YYYY-MM-DD 格式的 check_in/check_out;
  40. - guests 取用户明确人数,未说明时可省略;
  41. - max_price 只在用户明确给出“每晚预算”时传入;总旅行预算不能直接当作每晚预算。
  42. 如果用户没有目的地,不调用工具,并要求补充目的地。
  43. 不得编造酒店名称、价格、位置、评分或是否有房。
  44. 推荐结果不代表已完成预订。
  45. 不得规划交通、景点或完整行程。
  46. 输出格式:
  47. 1. 推荐住宿
  48. 2. 每晚价格与位置
  49. 3. 适合原因
  50. 4. 需用户确认的信息"""
  51. )
  52. result = await agent.ainvoke({"messages":[{"role":"user","content":user_request}]})
  53. return {"hotel_plan":result["messages"][-1].content}
  54. #景点agent节点
  55. async def attraction_agent_node(state:TravelState)->dict:
  56. user_request= state["user_request"]
  57. tools=await get_attraction_tools()
  58. agent = create_agent(
  59. model=llm,
  60. tools=tools,
  61. system_prompt="""你是旅行规划系统中的景点与活动专家,只负责景点推荐和游玩建议。
  62. 用户提供目的地时,必须调用地图工具查询景点或天气后再回答。
  63. 优先使用关键词搜索查找与用户偏好匹配的 POI。
  64. 需要了解特定地点时,使用详情搜索;需要查询某个地点周边内容时,先获得其坐标,再使用周边搜索。
  65. 根据天气工具结果给出合理出行提醒。
  66. 不得虚构景点地址、营业时间、门票、评分、距离或天气数据。
  67. 不得推荐酒店、规划交通路线或声称已完成预约。
  68. 输出应包含:
  69. 1. 推荐景点或区域;
  70. 2. 每个推荐的类型、位置或商圈信息;
  71. 3. 适合用户偏好的原因;
  72. 4. 天气与游玩提醒;
  73. 5. 需要用户确认的信息。"""
  74. )
  75. result = await agent.ainvoke({"messages":[{"role":"user","content":user_request}]})
  76. return {"attraction_plan":result["messages"][-1].content}
  77. #整合agent
  78. async def integrator_agent_node(state: TravelState) -> dict:
  79. user_request= state["user_request"]
  80. transport_plan=state.get("transport_plan")
  81. hotel_plan=state.get("hotel_plan")
  82. attraction_plan=state.get("attraction_plan")
  83. agent = create_agent(
  84. model=llm,
  85. tools=[],
  86. system_prompt="""你是旅行规划系统中的方案整合专家。
  87. 只能依据用户需求及交通、住宿、景点专家提供的结果生成方案。
  88. 不得自行调用工具、补充未经专家结果支持的酒店、路线、景点价格、天气或营业信息。
  89. 若专家结果冲突、缺失或信息不足,明确标记“待确认”,不要编造。
  90. 输出格式:
  91. 1. 旅行概览
  92. 2. 交通与市内通勤
  93. 3. 住宿建议
  94. 4. 每日行程建议
  95. 5. 注意事项与待确认事项"""
  96. )
  97. compose_text=f"""【用户需求】{user_request}
  98. 【交通专家结果】
  99. {transport_plan}
  100. 【住宿专家结果】
  101. {hotel_plan}
  102. 【景点专家结果】
  103. {attraction_plan}
  104. """
  105. result=await agent.ainvoke({"messages":[{"role":"user","content":compose_text}]})
  106. return {"final_plan":result["messages"][-1].content}