""" Mental health crisis and self-harm detection engine. """ import re from typing import Optional, Tuple from app.ai.prompt_rules.safety_rules import CRISIS_KEYWORDS_EN, CRISIS_KEYWORDS_INDIC TRANSLITERATED_CRISIS_PHRASES = [ "saaganam pola irukku", "uyiroda irukka virumbala", "saaga poraen", "valave pidikala", "mar jane ka man", "apne aap ko nuksan", "khudkushee", "chani povali", "sathokobeku", ] def check_crisis(user_message: str, lang: str = "en") -> Tuple[bool, Optional[str], Optional[str]]: """ Evaluates patient message for mental health crisis or self-harm intent. Returns: (is_crisis, reason, crisis_reply) """ if not user_message or not user_message.strip(): return False, None, None # Check Indic script crisis keywords FIRST against raw message for kw in CRISIS_KEYWORDS_INDIC: if kw in user_message: reply = _build_crisis_reply(lang) return True, f"Matched Indic crisis phrase: '{kw}'", reply indic_extra = ["காயப்படுத்திக்கணும்", "கொல்லணும்", "வாழவே பிடிக்கல", "உயிரோட இருக்க", "தற்கொலை", "உயிரை"] for kw in indic_extra: if kw in user_message: reply = _build_crisis_reply(lang) return True, f"Matched Indic crisis phrase: '{kw}'", reply msg = user_message.strip().lower() msg_clean = re.sub(r"[^\w\s]", " ", msg) msg_clean = re.sub(r"\s+", " ", msg_clean) # Check English crisis keywords for kw in CRISIS_KEYWORDS_EN: kw_clean = re.sub(r"[^\w\s]", " ", kw.lower()) if re.search(rf"\b{re.escape(kw_clean)}\b", msg_clean) or kw.lower() in msg: reply = _build_crisis_reply(lang) return True, f"Matched crisis phrase: '{kw}'", reply # Check Transliterated crisis phrases for kw in TRANSLITERATED_CRISIS_PHRASES: if kw in msg_clean or kw in msg: reply = _build_crisis_reply(lang) return True, f"Matched transliterated crisis phrase: '{kw}'", reply return False, None, None def _build_crisis_reply(lang: str) -> str: lang_clean = lang.lower() if lang else "en" if lang_clean.startswith("ta"): return "உங்களுக்கு மன உளைச்சல் இருந்தால், தயவுசெய்து டெலி-மானாஸ் (Tele-MANAS) உதவி எண் 14416-ஐ தொடர்பு கொள்ளவும் அல்லது மருத்துவமனை ஊழியர்களிடம் தெரிவிக்கவும்." elif lang_clean.startswith("hi"): return "यदि आप परेशानी में हैं, तो कृपया तुरंत टेली-मानस (Tele-MANAS) 14416 पर संपर्क करें या अस्पताल के कर्मचारियों को सूचित करें।" elif lang_clean.startswith("te"): return "మీరు తీవ్రమైన ఒత్తిడిలో ఉంటే, దయచేసి టెలి-మానస్ (Tele-MANAS) 14416 కు ఫోన్ చేయండి లేదా ఆసుపత్రి సిబ్బందికి చెప్పండి." elif lang_clean.startswith("kn"): return "ನೀವು ಮನೋಒತ್ತಡದಲ್ಲಿದ್ದರೆ, ದಯವಿಟ್ಟು ಟೆಲಿ-ಮಾನಸ್ (Tele-MANAS) 14416 ಗೆ ಕರೆ ಮಾಡಿ ಅಥವಾ ಆಸ್ಪತ್ರೆಯ ಸಿಬ್ಬಂದಿಗೆ ತಿಳಿಸಿ." else: return "If you're in distress, please reach out to Tele-MANAS at 14416 or alert the hospital staff right now."