graph.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. # backend/agents/defense/graph.py
  2. from langgraph.graph import StateGraph, START, END
  3. from backend.agents.defense.state import DefenseState, DefenseStage
  4. from backend.agents.defense.nodes import (
  5. load_context_node,
  6. check_stage_node,
  7. evaluate_answer_node,
  8. generate_response_node,
  9. generate_report_node,
  10. save_report_node,
  11. save_memory_node,
  12. )
  13. from backend.core.memory import get_memory_saver
  14. def _route_after_check_stage(state: DefenseState) -> str:
  15. """
  16. check_stage 后的条件路由:
  17. - 已进入 FINISHED → 生成评估报告路径
  18. - 其他阶段 → 正常对话路径
  19. """
  20. if state.get("current_stage") == DefenseStage.FINISHED.value:
  21. return "generate_report"
  22. return "evaluate_answer"
  23. def build_defense_graph():
  24. """
  25. 构建并编译供应商答辩 Agent 的 LangGraph 状态图。
  26. 图拓扑:
  27. START → load_context → check_stage
  28. ├─(finished)→ generate_report → save_report → save_memory → END
  29. └─(else) → evaluate_answer → generate_response → save_memory → END
  30. """
  31. builder = StateGraph(DefenseState)
  32. # 注册节点
  33. builder.add_node("load_context", load_context_node)
  34. builder.add_node("check_stage", check_stage_node)
  35. builder.add_node("evaluate_answer", evaluate_answer_node)
  36. builder.add_node("generate_response", generate_response_node)
  37. builder.add_node("generate_report", generate_report_node)
  38. builder.add_node("save_report", save_report_node)
  39. builder.add_node("save_memory", save_memory_node)
  40. # 固定边
  41. builder.add_edge(START, "load_context")
  42. builder.add_edge("load_context", "check_stage")
  43. # 条件分支
  44. builder.add_conditional_edges(
  45. "check_stage",
  46. _route_after_check_stage,
  47. {
  48. "generate_report": "generate_report",
  49. "evaluate_answer": "evaluate_answer",
  50. },
  51. )
  52. # 正常对话路径
  53. builder.add_edge("evaluate_answer", "generate_response")
  54. builder.add_edge("generate_response", "save_memory")
  55. builder.add_edge("save_memory", END)
  56. # 报告生成路径
  57. builder.add_edge("generate_report", "save_report")
  58. builder.add_edge("save_report", "save_memory")
  59. # 有 checkpointer:多轮对话需要状态跨请求持久化
  60. checkpointer = get_memory_saver("defense")
  61. return builder.compile(checkpointer=checkpointer)