import re from typing import Literal, Tuple Intent = Literal["attendance", "result", "syllabus", "other"] def classify_intent(query: str) -> Tuple[Intent, bool]: q = query.strip().lower() if not q: return "other", False greeting_words = { "hi", "hello", "hey", "good morning", "good afternoon", "good evening", } attendance_keywords = { "attendance", "attend", "absent", "present", "classes", "attendance percentage", "overall attendance", } result_keywords = { "result", "results", "marks", "score", "sgpa", "cgpa", "gpa", "grade", "ia", "exam", "performance", "passed", "fail", } syllabus_keywords = { "syllabus", "unit", "units", "module", "modules", "topic", "topics", "course content", "chapters", "what is covered", } education_keywords = ( attendance_keywords | result_keywords | syllabus_keywords | { "semester", "course", "subject", "study", "assignment", "project", "college", "class", "exam prep", } ) has_course_code = bool(re.search(r"\b\d{2}[a-z]{2,}[a-z0-9]*\d+[a-z]?\b", q, flags=re.I)) is_greeting = any(word in q for word in greeting_words) is_education = has_course_code or any(k in q for k in education_keywords) or is_greeting if any(k in q for k in attendance_keywords): return "attendance", is_education if any(k in q for k in result_keywords): return "result", is_education if any(k in q for k in syllabus_keywords): return "syllabus", is_education return "other", is_education