from app.core.taxonomy import AnswerType, Chapter, Level, Subject from app.schemas.classification import ClassificationResult CHAPTER_KEYWORDS: tuple[tuple[Chapter, tuple[str, ...]], ...] = ( ( Chapter.DERIVATION, ( "dérivée", "derivee", "dérivable", "derivable", "dériver", "derive", "f'(x)", "f’(x)", "signe de la dérivée", "signe de f'", "tableau de variation", ), ), ( Chapter.LIMITES, ( "limite", "tend vers", "infini", "+∞", "-∞", "asymptote", ), ), ( Chapter.SUITES, ( "suite", "u_n", "un+1", "récurrence", "recurrence", "arithmétique", "géométrique", ), ), ( Chapter.FONCTIONS, ( "fonction", "image", "antécédent", "ensemble de définition", "courbe", ), ), ) def detect_answer_type(answer_text: str) -> AnswerType: if "\\" in answer_text or "$" in answer_text: return AnswerType.LATEX_SIMPLE if any(marker in answer_text for marker in ("#", "-", "*", "`")): return AnswerType.MARKDOWN return AnswerType.TEXTE def classify_submission_answer(answer_text: str) -> ClassificationResult: normalized = answer_text.lower() detected_chapter = Chapter.FONCTIONS confidence = 0.55 skill = "raisonner sur une fonction" for chapter, keywords in CHAPTER_KEYWORDS: if any(keyword in normalized for keyword in keywords): detected_chapter = chapter confidence = 0.82 if chapter == Chapter.DERIVATION: skill = "calculer une dérivée et exploiter son signe" elif chapter == Chapter.LIMITES: skill = "calculer une limite" elif chapter == Chapter.SUITES: skill = "étudier une suite numérique" else: skill = "étudier une fonction" break return ClassificationResult( subject=Subject.MATHEMATIQUES, level=Level.DEUXIEME_BAC_SCIENCES, chapter=detected_chapter, skill=skill, answer_type=detect_answer_type(answer_text), language="fr", confidence=confidence, reject_reason=None, )