test_reviewer_graph.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. from __future__ import annotations
  2. """测试Trip Reviewer阶段子图:验证行程独立评审与修改意见生成。"""
  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. "review_attempts": 0,
  29. "revision_feedback": [],
  30. },
  31. config={
  32. "recursion_limit": 50,
  33. },
  34. )
  35. console.rule(
  36. "[bold]Trip Reviewer工作流结果"
  37. )
  38. console.print(result["final_answer"])
  39. validation = result.get(
  40. "plan_validation_result"
  41. )
  42. review = result.get(
  43. "trip_review_result"
  44. )
  45. console.print(
  46. {
  47. "Planner执行次数": result.get(
  48. "planning_attempts"
  49. ),
  50. "Reviewer执行次数": result.get(
  51. "review_attempts"
  52. ),
  53. "确定性校验通过": (
  54. validation.is_valid
  55. if validation
  56. else None
  57. ),
  58. "Reviewer原始结论": (
  59. review.approved
  60. if review
  61. else None
  62. ),
  63. "系统最终审查结论": result.get(
  64. "review_passed"
  65. ),
  66. }
  67. )
  68. if review is None:
  69. console.print(
  70. {
  71. "系统错误": result.get("errors"),
  72. }
  73. )
  74. return
  75. console.rule("[bold]审查总结")
  76. console.print(review.summary)
  77. issue_table = Table(
  78. title="Reviewer发现的问题"
  79. )
  80. issue_table.add_column("级别")
  81. issue_table.add_column("分类")
  82. issue_table.add_column("日期")
  83. issue_table.add_column("活动")
  84. issue_table.add_column("问题")
  85. issue_table.add_column("建议")
  86. for issue in review.issues:
  87. issue_table.add_row(
  88. issue.severity,
  89. issue.category,
  90. (
  91. str(issue.day_index)
  92. if issue.day_index
  93. else ""
  94. ),
  95. issue.activity_name or "",
  96. issue.message,
  97. issue.suggestion or "",
  98. )
  99. console.print(issue_table)
  100. if review.strengths:
  101. console.rule("[bold green]方案优点")
  102. for strength in review.strengths:
  103. console.print(f"- {strength}")
  104. if result.get("revision_feedback"):
  105. console.rule(
  106. "[bold yellow]下一轮修改要求"
  107. )
  108. for feedback in result[
  109. "revision_feedback"
  110. ]:
  111. console.print(f"- {feedback}")
  112. if review.recommendations:
  113. console.rule("[bold]非阻塞建议")
  114. for recommendation in (
  115. review.recommendations
  116. ):
  117. console.print(
  118. f"- {recommendation}"
  119. )
  120. if __name__ == "__main__":
  121. asyncio.run(main())