| from langgraph.graph import StateGraph, START | |
| from src.graph.state import SandboxState | |
| from src.graph.nodes import ( | |
| coder_node, | |
| executor_node, | |
| critic_node, | |
| success_node, | |
| fail_node, | |
| ) | |
| def should_retry(state: SandboxState) -> str: | |
| if state.get("sandbox_result") and state["sandbox_result"].success: | |
| return "success" | |
| if state["retry_count"] < state["max_retries"]: | |
| return "critic" | |
| return "fail" | |
| def build_sandbox_graph(max_retries: int = 3) -> StateGraph: | |
| builder = StateGraph(SandboxState) | |
| builder.add_node("coder", coder_node) | |
| builder.add_node("executor", executor_node) | |
| builder.add_node("critic", critic_node) | |
| builder.add_node("success", success_node) | |
| builder.add_node("fail", fail_node) | |
| builder.add_edge(START, "coder") | |
| builder.add_edge("coder", "executor") | |
| builder.add_conditional_edges( | |
| "executor", | |
| should_retry, | |
| { | |
| "success": "success", | |
| "critic": "critic", | |
| "fail": "fail", | |
| }, | |
| ) | |
| builder.add_edge("critic", "coder") | |
| return builder.compile() | |