# Write your Python code here
import time
import random
import sys
from typing import TypedDict
from langgraph.graph import StateGraph, END
# ---------------------- STATE ----------------------
class CollegeState(TypedDict):
user_query: str
detected_intent: str
response_text: str
final_reply: str
# ---------------------- AGENTS ----------------------
class AdmissionDesk:
def reply(self):
return (
"\n===== ADMISSION DESK =====\n"
"Admission Process:\n"
"1. Register on the admission portal.\n"
"2. Submit JEE/CUET score.\n"
"3. Upload 10th & 12th documents.\n"
"4. Pay counselling fee.\n"
"5. Participate in counselling rounds.\n"
)
class ExamDesk:
def reply(self):
return (
"\n===== EXAMINATION CELL =====\n"
"• Semester Exams start from 10 December.\n"
"• Admit card available before 5 days.\n"
"• Minimum 75% attendance required.\n"
)
class FeeDesk:
def reply(self):
return (
"\n===== FEES SECTION =====\n"
"Tuition Fee : ₹65,000\n"
"Development Fee : ₹12,000\n"
"Hostel Fee : ₹35,000\n"
"Security Deposit : ₹5,000 (Refundable)\n"
"Total : ₹1,17,000\n"
)
class ScholarshipDesk:
def reply(self):
return (
"\n===== SCHOLARSHIP CELL =====\n"
"• Merit Scholarship\n"
"• NSP Scholarship\n"
"• e-Kalyan Scholarship\n"
"• PMSSS Scheme\n"
"• Government Category Benefits\n"
)
# ---------------------- ROUTER ----------------------
class IntentRouter:
def __init__(self):
self.keywords = {
"admission": [
"admission", "apply", "join", "enroll",
"jee", "cuet", "cutoff", "process"
],
"exam": [
"exam", "semester", "result",
"hall ticket", "admit card", "marks"
],
"fees": [
"fee", "fees", "money",
"tuition", "hostel", "payment"
],
"scholarship": [
"scholarship", "financial aid",
"waiver", "mcm", "nsp"
],
"help": [
"help", "menu", "options"
],
"exit": [
"exit", "quit", "bye", "close"
]
}
def classify(self, query):
query = query.lower()
for intent, words in self.keywords.items():
for word in words:
if word in query:
return intent
return "unknown"
# ---------------------- GRAPH NODES ----------------------
def detect_intent_node(state: CollegeState):
router = IntentRouter()
return {
"detected_intent": router.classify(state["user_query"])
}
def admission_node(state: CollegeState):
return {
"response_text": AdmissionDesk().reply()
}
def exam_node(state: CollegeState):
return {
"response_text": ExamDesk().reply()
}
def fees_node(state: CollegeState):
return {
"response_text": FeeDesk().reply()
}
def scholarship_node(state: CollegeState):
return {
"response_text": ScholarshipDesk().reply()
}
def final_response_node(state: CollegeState):
intent = state["detected_intent"]
if intent == "help":
message = (
"\n===== HELP MENU =====\n"
"You can ask questions like:\n"
"• Admission process\n"
"• Exam schedule\n"
"• Fee structure\n"
"• Scholarship details\n\n"
"Type 'exit' to close the assistant.
)
elif intent == "exit":
goodbye = [
"Thank you for visiting. Goodbye!",
"Session ended successfully.",
"Have a great day. See you again!"
]
message = random.choice(goodbye)
elif intent == "unknown":
message = (
"\nSorry! I can only answer questions related to:\n"
"• Admission\n"
"• Exams\n"
"• Fees\n"
"• Scholarships\n\n"
"Type 'help' to see available options."
)
else:
message = state["response_text"]
return {
"final_reply": message
}
# ---------------------- ROUTING-------------
def next_node(state: CollegeState):
routes = {
"admission": "admission_node",
"exam": "exam_node",
"fees": "fees_node",
"scholarship": "scholarship_node"
}
return routes.get(
state["detected_intent"],
"final_response_node"
)
# ---------------------- BUILD GRAPH ----------------------
graph = StateGraph(CollegeState)
# Add Nodes
graph.add_node("intent_node", detect_intent_node)
graph.add_node("admission_node", admission_node)
graph.add_node("exam_node", exam_node)
graph.add_node("fees_node", fees_node)
graph.add_node("scholarship_node", scholarship_node)
graph.add_node("final_response_node", final_response_node)
# Entry Point
graph.set_entry_point("intent_node")
# Conditional Routing
graph.add_conditional_edges(
"intent_node",
next_node,
{
"admission_node": "admission_node",
"exam_node": "exam_node",
"fees_node": "fees_node",
"scholarship_node": "scholarship_node",
"final_response_node": "final_response_node",
}
)
# Return to Final Response
graph.add_edge("admission_node", "final_response_node")
graph.add_edge("exam_node", "final_response_node")
graph.add_edge("fees_node", "final_response_node")
graph.add_edge("scholarship_node", "final_response_node")
# End Workflow
graph.add_edge("final_response_node", END)
# Compile Graph
college_bot = graph.compile()
# ---------------------- DISPLAY FUNCTION--------
def type_writer(message, speed=0.015):
for ch in message:
sys.stdout.write(ch)
sys.stdout.flush()
time.sleep(speed)
print()
# ---------------------- MAIN PROGRAM ----------------------
def main():
print("=" * 65)
print(" UNIVERSITY AI ASSISTANT USING LANGGRAPH")
print("=" * 65)
student = input("\nEnter Your Name : ").strip().title()
if student == "":
student = "Student"
greeting = (
f"\nHello {student}!\n"
"Welcome to the University AI Assistant.\n"
"Type 'help' to see available services."
)
type_writer(greeting)
while True:
query = input(f"\n{student} >> ").strip()
if query == "":
continue
state = {
"user_query": query,
"detected_intent": "",
"response_text": "",
"final_reply": ""
}
result = college_bot.invoke(state)
print("\n" + "-" * 65)
type_writer(result["final_reply"])
print("-" * 65)
if result["detected_intent"] == "exit":
break
# ---------------------- PROGRAM START ----------------------
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\n\nProgram Closed Successfully.")
sys.exit(0)