govbridge / src /workflow /graph.py
Vishnu Rama
Rename to GovBridge, expand ideas flow docs, simplify UI
2948416
Raw
History Blame Contribute Delete
2.52 kB
import logging
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver
from src.workflow.state import GovBridgeState
from src.agents.input_agent import input_agent
from src.agents.ideas_agent import ideas_agent
from src.agents.complaint_agent import complaint_agent
from src.agents.email_writer_agent import email_writer_agent
_log = logging.getLogger(__name__)
def _route_after_input(state: GovBridgeState) -> str:
category = state.get("category")
if category == "idea":
_log.info("routing β†’ ideas_agent")
return "ideas_agent"
if category == "complaint":
_log.info("routing β†’ complaint_agent")
return "complaint_agent"
_log.info("routing β†’ input_agent (no category yet)")
return "input_agent"
def _route_after_email_writer(state: GovBridgeState) -> str:
if state.get("draft_approved"):
_log.info("draft approved β€” routing to END")
return END
_log.info("draft not yet approved β€” looping back to email_writer")
return "email_writer"
def _route_after_conversation(node_name: str):
def _route(state: GovBridgeState) -> str:
if state.get("conversation_complete"):
_log.info("%s conversation complete β€” routing to email_writer", node_name)
return "email_writer"
_log.info("%s conversation continuing β€” looping back", node_name)
return node_name
return _route
def build_graph():
graph = StateGraph(GovBridgeState)
graph.add_node("input_agent", input_agent)
graph.add_node("ideas_agent", ideas_agent)
graph.add_node("complaint_agent", complaint_agent)
graph.add_node("email_writer", email_writer_agent)
graph.set_entry_point("input_agent")
graph.add_conditional_edges("input_agent", _route_after_input, {
"ideas_agent": "ideas_agent",
"complaint_agent": "complaint_agent",
"input_agent": "input_agent",
})
graph.add_conditional_edges("ideas_agent", _route_after_conversation("ideas_agent"), {
"email_writer": "email_writer",
"ideas_agent": "ideas_agent",
})
graph.add_conditional_edges("complaint_agent", _route_after_conversation("complaint_agent"), {
"email_writer": "email_writer",
"complaint_agent": "complaint_agent",
})
graph.add_conditional_edges("email_writer", _route_after_email_writer, {
END: END,
"email_writer": "email_writer",
})
return graph.compile(checkpointer=MemorySaver())