test_validation_graph.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. from __future__ import annotations
  2. """测试方案校验阶段子图:验证确定性规则校验与校验失败后的路由。"""
  3. import asyncio
  4. from rich.console import Console
  5. from rich.table import Table
  6. from app.graph.planner_builder import (
  7. build_planner_graph,
  8. )
  9. console = Console()
  10. async def main() -> None:
  11. graph = await build_planner_graph()
  12. result = await graph.ainvoke(
  13. {
  14. "user_query": (
  15. "我和妻子计划2026年8月10日"
  16. "从上海去成都,8月13日返回,"
  17. "总预算8000元。"
  18. "喜欢熊猫、自然景观和川菜,"
  19. "希望行程轻松一些。"
  20. "酒店每晚不超过600元,"
  21. "评分不低于4.5,"
  22. "并且希望靠近地铁。"
  23. "机票价格和便利性综合考虑。"
  24. ),
  25. "errors": [],
  26. "missing_fields": [],
  27. "planning_attempts": 0,
  28. "revision_feedback": [],
  29. }
  30. )
  31. console.rule(
  32. "[bold]Validator工作流结果"
  33. )
  34. console.print(result["final_answer"])
  35. validation = result.get(
  36. "plan_validation_result"
  37. )
  38. if validation is None:
  39. console.print(
  40. {
  41. "系统错误": result.get("errors"),
  42. }
  43. )
  44. return
  45. console.print(
  46. {
  47. "校验通过": validation.is_valid,
  48. "错误数": validation.error_count,
  49. "警告数": validation.warning_count,
  50. "已知费用": (
  51. validation.budget.known_total
  52. ),
  53. "用户预算": (
  54. validation.budget.user_budget
  55. ),
  56. "预算状态": (
  57. validation.budget.status
  58. ),
  59. "已知预算余额": (
  60. validation
  61. .budget
  62. .remaining_known_budget
  63. ),
  64. }
  65. )
  66. issue_table = Table(
  67. title="确定性校验问题"
  68. )
  69. issue_table.add_column("级别")
  70. issue_table.add_column("代码")
  71. issue_table.add_column("日期序号")
  72. issue_table.add_column("活动序号")
  73. issue_table.add_column("问题")
  74. for issue in validation.issues:
  75. issue_table.add_row(
  76. issue.severity,
  77. issue.code,
  78. (
  79. str(issue.day_index)
  80. if issue.day_index is not None
  81. else ""
  82. ),
  83. (
  84. str(issue.activity_sequence)
  85. if issue.activity_sequence
  86. is not None
  87. else ""
  88. ),
  89. issue.message,
  90. )
  91. console.print(issue_table)
  92. console.rule("[bold]预算覆盖说明")
  93. console.print(
  94. validation.budget.coverage_note
  95. )
  96. if validation.revision_feedback:
  97. console.rule(
  98. "[bold yellow]需要Planner修改"
  99. )
  100. for feedback in (
  101. validation.revision_feedback
  102. ):
  103. console.print(f"- {feedback}")
  104. if __name__ == "__main__":
  105. asyncio.run(main())