autostream-agent / agent /graph.py
kaori02's picture
feat: AutoStream AI Sales Agent with LangGraph + Streamlit UI
3295172
from __future__ import annotations
from langgraph.graph import StateGraph, END
from agent.state import AgentState
from agent.nodes import (
classify_intent,
retrieve_rag,
extract_lead_fields,
capture_lead,
generate_response,
)
def _route_after_classify(state: AgentState) -> str:
intent = state.get("intent", "unknown")
if intent == "inquiry":
return "retrieve_rag"
if intent == "collecting":
return "extract_lead_fields"
return "generate_response"
def _route_after_extract(state: AgentState) -> str:
if state.get("lead_name") and state.get("lead_email") and state.get("lead_platform"):
return "capture_lead"
return "generate_response"
def build_graph() -> StateGraph:
g = StateGraph(AgentState)
g.add_node("classify_intent", classify_intent)
g.add_node("retrieve_rag", retrieve_rag)
g.add_node("extract_lead_fields", extract_lead_fields)
g.add_node("capture_lead", capture_lead)
g.add_node("generate_response", generate_response)
g.set_entry_point("classify_intent")
g.add_conditional_edges(
"classify_intent",
_route_after_classify,
{
"retrieve_rag": "retrieve_rag",
"extract_lead_fields": "extract_lead_fields",
"generate_response": "generate_response",
},
)
# After RAG retrieval, generate the response
g.add_edge("retrieve_rag", "generate_response")
# After field extraction, either capture or ask for more
g.add_conditional_edges(
"extract_lead_fields",
_route_after_extract,
{
"capture_lead": "capture_lead",
"generate_response": "generate_response",
},
)
# After capture, generate the confirmation message
g.add_edge("capture_lead", "generate_response")
g.add_edge("generate_response", END)
return g.compile()
_app = None
def get_app():
global _app
if _app is None:
_app = build_graph()
return _app