final_nodes.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from __future__ import annotations
  2. """定稿渲染节点:调用FinalizationService将审核通过的方案渲染为面向用户的Markdown最终答复。"""
  3. from typing import Any
  4. from app.graph.state import TravelState
  5. from app.services.finalization_service import (
  6. FinalizationService,
  7. )
  8. def make_finalization_node(
  9. service: FinalizationService | None = None,
  10. ):
  11. """创建最终回答生成节点。"""
  12. finalization_service = (
  13. service or FinalizationService()
  14. )
  15. def finalization_node(
  16. state: TravelState,
  17. ) -> dict[str, Any]:
  18. """定稿节点:收集请求、方案、校验与审查结果,渲染为完整的最终旅行方案文本。"""
  19. request = state.get("travel_request")
  20. plan = state.get("itinerary_plan")
  21. validation = state.get(
  22. "plan_validation_result"
  23. )
  24. review = state.get(
  25. "trip_review_result"
  26. )
  27. missing: list[str] = []
  28. if request is None:
  29. missing.append("travel_request")
  30. if plan is None:
  31. missing.append("itinerary_plan")
  32. if validation is None:
  33. missing.append(
  34. "plan_validation_result"
  35. )
  36. if review is None:
  37. missing.append(
  38. "trip_review_result"
  39. )
  40. if missing:
  41. message = (
  42. "最终输出阶段缺少必要状态:"
  43. + "、".join(missing)
  44. )
  45. existing_errors = list(
  46. state.get("errors", [])
  47. )
  48. existing_errors.append(message)
  49. return {
  50. "errors": existing_errors,
  51. "workflow_status": "failed",
  52. "final_answer": message,
  53. }
  54. workflow_status = state.get(
  55. "workflow_status",
  56. "completed_with_risks",
  57. )
  58. approved = (
  59. workflow_status == "approved"
  60. )
  61. answer = finalization_service.render(
  62. request=request,
  63. plan=plan,
  64. validation=validation,
  65. review=review,
  66. approved=approved,
  67. planning_attempts=state.get(
  68. "planning_attempts",
  69. 0,
  70. ),
  71. supervisor_reason=state.get(
  72. "supervisor_reason",
  73. "未提供Supervisor说明。",
  74. ),
  75. )
  76. return {
  77. "final_answer": answer,
  78. }
  79. return finalization_node