Spaces:
Runtime error
Runtime error
| """ | |
| Mental Health Agent - Specialized agent for mental health support | |
| """ | |
| from config.settings import client, MODEL | |
| from health_data import HealthContext | |
| from personalization import PersonalizationEngine | |
| from rag.rag_integration import get_rag_integration | |
| from agents.core.base_agent import BaseAgent | |
| from agents.core.context_analyzer import ContextAnalyzer | |
| from agents.core.response_validator import ResponseValidator | |
| from datetime import datetime | |
| class MentalHealthAgent(BaseAgent): | |
| def __init__(self, memory=None): | |
| super().__init__(memory) | |
| self.health_context = None | |
| self.personalization = None | |
| self.rag = get_rag_integration() | |
| # Configure handoff triggers for mental health agent | |
| self.handoff_triggers = { | |
| 'symptom_agent': ['đau đầu', 'mất ngủ kéo dài', 'tim đập nhanh'], | |
| 'nutrition_agent': ['ăn uống', 'chán ăn', 'ăn vô độ'], | |
| 'exercise_agent': ['tập thể dục', 'yoga', 'thiền'], | |
| 'general_health_agent': ['thuốc', 'bác sĩ tâm lý', 'điều trị'] | |
| } | |
| self.system_prompt = """Bạn là nhà tâm lý trị liệu chuyên nghiệp, ấm áp và thấu hiểu. | |
| 🧠 CHUYÊN MÔN: | |
| - Hỗ trợ stress, lo âu, trầm cảm | |
| - Tư vấn burnout, mất ngủ | |
| - Kỹ thuật thư giãn, mindfulness | |
| - Quản lý cảm xúc | |
| - Cải thiện giấc ngủ | |
| 🎯 CÁCH TƯ VẤN: | |
| - Lắng nghe, thấu hiểu, không phán xét | |
| - Validate cảm xúc: "Cảm giác của bạn là hợp lý" | |
| - Normalize: "Nhiều người cũng trải qua điều này" | |
| - Đưa ra kỹ thuật cụ thể (breathing, journaling...) | |
| - Khuyến khích tìm kiếm sự hỗ trợ | |
| 🚨 RED FLAGS - Khuyên gặp chuyên gia NGAY: | |
| - Ý định tự tử hoặc tự gây thương tích | |
| - Ý định gây hại người khác | |
| - Ảo giác, hoang tưởng | |
| - Trầm cảm nặng không thể hoạt động | |
| - Nghiện rượu, ma túy | |
| ⚠️ AN TOÀN: | |
| - KHÔNG chẩn đoán bệnh tâm thần | |
| - KHÔNG kê đơn thuốc | |
| - Luôn khuyên gặp chuyên gia với vấn đề nghiêm trọng | |
| - Cung cấp hotline khủng hoảng khi cần | |
| 💬 PHONG CÁCH: | |
| - Ấm áp, đồng cảm 💙 | |
| - Kiên nhẫn, không vội vàng | |
| - Tôn trọng, không phán xét | |
| - Trấn an nhưng thực tế | |
| - Khuyến khích, động viên""" | |
| def set_health_context(self, health_context: HealthContext): | |
| """Inject health context and initialize personalization engine""" | |
| self.health_context = health_context | |
| self.personalization = PersonalizationEngine(health_context) | |
| def handle(self, parameters, chat_history=None): | |
| """ | |
| Handle mental health support request | |
| Args: | |
| parameters (dict): { | |
| "user_query": str, | |
| "context": dict (optional) | |
| } | |
| chat_history (list): Conversation history | |
| Returns: | |
| str: Response message | |
| """ | |
| user_query = parameters.get("user_query", "") | |
| context = parameters.get("context", {}) | |
| # Check for crisis situations first | |
| crisis_response = self._check_crisis(user_query, chat_history) | |
| if crisis_response: | |
| # Persist crisis alert | |
| if self.health_context: | |
| self.health_context.add_health_record('mental_health', { | |
| 'query': user_query, | |
| 'type': 'crisis_alert', | |
| 'response': crisis_response, | |
| 'timestamp': datetime.now().isoformat() | |
| }) | |
| return crisis_response | |
| # Provide mental health support | |
| response = self._provide_support(user_query, context, chat_history) | |
| # Adapt communication style using personalization | |
| if self.personalization: | |
| preferences = self.health_context.get_preferences() if self.health_context else None | |
| if preferences: | |
| adapted_response = self.personalization.adapt_communication_style(response) | |
| else: | |
| adapted_response = response | |
| else: | |
| adapted_response = response | |
| # Persist mental health data | |
| if self.health_context: | |
| self.health_context.add_health_record('mental_health', { | |
| 'query': user_query, | |
| 'response': adapted_response, | |
| 'context': context, | |
| 'timestamp': datetime.now().isoformat() | |
| }) | |
| return adapted_response | |
| def _check_crisis(self, user_query, chat_history): | |
| """Check for mental health crisis situations""" | |
| all_text = user_query.lower() | |
| if chat_history: | |
| all_text += " " + " ".join([msg[0].lower() for msg in chat_history if msg[0]]) | |
| # Suicide risk | |
| suicide_keywords = ["tự tử", "muốn chết", "kết thúc cuộc đời", "không muốn sống", | |
| "suicide", "kill myself", "end my life"] | |
| if any(keyword in all_text for keyword in suicide_keywords): | |
| return """🚨 **KHẨN CẤP - BẠN KHÔNG CÔ ĐƠN** | |
| Mình rất lo lắng về bạn. Những suy nghĩ này rất nghiêm trọng và bạn cần được hỗ trợ ngay. | |
| 🆘 **HÃY LIÊN HỆ NGAY:** | |
| **Đường dây nóng tâm lý:** | |
| - 📞 **115** - Cấp cứu y tế (Trung tâm Cấp cứu 115 TP.HCM) | |
| - 📞 **1900 1267** - Chuyên gia tâm thần (Bệnh viện Tâm Thần TP.HCM) | |
| - 📞 **0909 65 80 35** - Tư vấn tâm lý miễn phí (Chăm sóc sức khỏe Việt - Davipharm) | |
| **Hoặc:** | |
| - Nói chuyện với người thân, bạn bè NGAY | |
| - Đến bệnh viện tâm thần gần nhất | |
| - Nhắn tin cho ai đó bạn tin tưởng | |
| 💙 **BẠN QUAN TRỌNG. CUỘC SỐNG CỦA BẠN CÓ GIÁ TRỊ.** | |
| Những cảm giác này sẽ qua đi. Có người sẵn sàng giúp bạn. Hãy cho họ cơ hội. | |
| Bạn có thể gọi ngay bây giờ không? Hoặc có ai bạn có thể nói chuyện không?""" | |
| # Self-harm | |
| self_harm_keywords = ["tự làm đau", "cắt tay", "tự gây thương tích", "self harm", "cut myself"] | |
| if any(keyword in all_text for keyword in self_harm_keywords): | |
| return """⚠️ **CẦN HỖ TRỢ KHẨN CẤP** | |
| Mình rất lo lắng về bạn. Tự gây thương tích là dấu hiệu bạn đang đau khổ và cần được giúp đỡ. | |
| 🆘 **HÃY LIÊN HỆ:** | |
| - 📞 **115** - Cấp cứu y tế (Trung tâm Cấp cứu 115 TP.HCM) | |
| - 📞 **1900 1267** - Chuyên gia tâm thần (Bệnh viện Tâm Thần TP.HCM) | |
| - 📞 **0909 65 80 35** - Tư vấn tâm lý miễn phí (Chăm sóc sức khỏe Việt - Davipharm) | |
| 💙 **Bạn xứng đáng được chăm sóc và hỗ trợ.** | |
| Có những cách khác để đối phó với cảm xúc khó khăn. Chuyên gia tâm lý có thể giúp bạn tìm ra cách lành mạnh hơn. | |
| Bạn có thể gọi ngay bây giờ không?""" | |
| return None | |
| def _build_mental_health_context_instruction(self, user_query, chat_history, context): | |
| """ | |
| Build context instruction for mental health queries | |
| """ | |
| is_vague = context.get('is_vague', False) | |
| # Handle vague emotional queries | |
| if is_vague: | |
| return """\n\nPHASE: THẤU HIỂU CẢM XÚC (VỚI GỢI Ý) | |
| User đang cảm thấy không ổn nhưng chưa rõ ràng. Empathy + gợi ý: | |
| 1. VALIDATE + GỢI Ý CỤ THỂ: | |
| Format: "Mình hiểu bạn đang [cảm giác user nói]. Bạn có thể chia sẻ thêm không? Ví dụ: | |
| • [Gợi ý cảm xúc 1] | |
| • [Gợi ý cảm xúc 2] | |
| • [Gợi ý cảm xúc 3] | |
| • Hoặc điều gì khác?" | |
| 2. GỢI Ý DỰA VÀO TỪ KHÓA: | |
| - "mệt" → gợi ý: mệt mỏi tinh thần, burnout, stress, mất ngủ | |
| - "không khỏe" → gợi ý: lo âu, buồn bã, căng thẳng, cô đơn | |
| - "khó chịu" → gợi ý: bực bội, tức giận, thất vọng, áp lực | |
| - "không ổn" → gợi ý: lo lắng, trầm cảm, bất an, mất phương hướng | |
| 3. VÍ DỤ CỤ THỂ: | |
| User: "tôi mệt" | |
| Bot: "Mình hiểu bạn đang cảm thấy mệt mỏi. Bạn có thể chia sẻ thêm không? Ví dụ: | |
| • Mệt mỏi về tinh thần, cảm thấy kiệt sức? | |
| • Stress từ công việc hoặc học tập? | |
| • Mất ngủ, ngủ không ngon giấc? | |
| • Hay điều gì khác đang làm bạn khó chịu?" | |
| QUAN TRỌNG: | |
| - Empathy cao, ấm áp | |
| - Gợi ý về CẢM XÚC, không phải triệu chứng vật lý | |
| - Luôn có "hoặc điều gì khác" | |
| - Không ép buộc, để user tự chia sẻ""" | |
| # Check if answering comparison self-assessment | |
| if chat_history and len(chat_history) > 0: | |
| last_bot_msg = chat_history[-1][1] if len(chat_history[-1]) > 1 else "" | |
| if "TỰ KIỂM TRA" in last_bot_msg or "Bạn trả lời" in last_bot_msg: | |
| return """\n\nPHASE: PHÂN TÍCH TÌNH TRẠNG TINH THẦN | |
| User vừa trả lời. Phân tích với empathy: | |
| 1. NHẬN DIỆN (dựa vào RAG): | |
| - Đọc kỹ cảm xúc, triệu chứng | |
| - So sánh với các tình trạng (stress/anxiety/burnout...) | |
| - Đưa ra đánh giá nhẹ nhàng | |
| 2. VALIDATE & NORMALIZE: | |
| "Cảm giác của bạn là bình thường. Nhiều người cũng trải qua điều này." | |
| 3. KỸ THUẬT ĐỐI PHÓ: | |
| - Cụ thể, dễ thực hiện | |
| - Breathing, journaling, grounding... | |
| - Giải thích tại sao hiệu quả | |
| 4. KHUYẺN KHÍCH: | |
| - Nếu nhẹ: "Bạn thử các kỸ thuật này nhé" | |
| - Nếu nặng: "Nên tìm chuyên gia hỗ trợ" | |
| QUAN TRỌNG: Empathy + practical help.""" | |
| # Check if asking comparison | |
| if any(phrase in user_query.lower() for phrase in [ | |
| 'stress hay', 'anxiety hay', 'khác nhau thế nào', | |
| 'phân biệt', 'hay là' | |
| ]): | |
| return """\n\nPHASE: SO SÁNH TÌNH TRẠNG TINH THẦN | |
| User muốn hiểu rõ hơn. Sử dụng RAG: | |
| 1. TẠO BẢNG SO SÁNH: | |
| Format: | |
| **[Tình trạng A]:** | |
| • Cảm giác: [feelings] | |
| • Triệu chứng: [symptoms] | |
| • Thời gian: [duration] | |
| • Trigger: [causes] | |
| **[Tình trạng B]:** | |
| • Cảm giác: [feelings] | |
| • Triệu chứng: [symptoms] | |
| • Thời gian: [duration] | |
| • Trigger: [causes] | |
| **Điểm khác biệt:** [key differences] | |
| 2. CÂU HỊI TỰ KIỂM TRA: | |
| • Bạn cảm thấy thế nào? | |
| • Kéo dài bao lâu? | |
| • Có trigger rõ ràng không? | |
| • Ảnh hưởng đến sinh hoạt không? | |
| 3. LUÔN EMPATHY: | |
| "Dù là gì, cảm giác của bạn đều quan trọng." | |
| 4. Kết thúc: "Bạn chia sẻ để mình hiểu rõ hơn nhé!" | |
| QUAN TRỌNG: Dùng RAG, empathy cao.""" | |
| # Normal support | |
| return """\n\nĐưa ra hỗ trợ tinh thần: | |
| - Empathy & validation | |
| - KỸ thuật cụ thể | |
| - Khuyến khích tìm chuyên gia nếu cần | |
| KHÔNG nói "Dựa trên thông tin".""" | |
| def _provide_support(self, user_query, context, chat_history): | |
| """Provide mental health support with comparison and vague query handling""" | |
| try: | |
| # Analyze context | |
| analyzed_context = ContextAnalyzer.analyze_user_intent(user_query, chat_history) | |
| # Build context from chat history | |
| history_context = "" | |
| if chat_history: | |
| recent = chat_history[-3:] | |
| history_context = "\n".join([f"User: {msg[0]}\nBot: {msg[1]}" for msg in recent]) | |
| # Smart RAG - only query when needed (inherit from BaseAgent) | |
| rag_answer = '' | |
| rag_sources = [] | |
| if self.should_use_rag(user_query, chat_history): | |
| rag_result = self.rag.query_health(user_query) | |
| rag_answer = rag_result.get('answer', '') | |
| rag_sources = rag_result.get('source_docs', []) | |
| # Build RAG context | |
| rag_context = f"\n\nThông tin tham khảo từ cơ sở dữ liệu:\n{rag_answer}" if rag_answer else "" | |
| # Build context instruction | |
| context_instruction = self._build_mental_health_context_instruction( | |
| user_query, chat_history, analyzed_context | |
| ) | |
| response = client.chat.completions.create( | |
| model=MODEL, | |
| messages=[ | |
| {"role": "system", "content": self.system_prompt}, | |
| {"role": "user", "content": f"""Người dùng đang tìm kiếm hỗ trợ về sức khỏe tinh thần. | |
| Lịch sử hội thoại gần đây: | |
| {history_context} | |
| Câu hỏi hiện tại: {user_query} | |
| Ngữ cảnh thêm: {context}{rag_context} | |
| {context_instruction} | |
| Nhớ: Không chẩn đoán, không kê đơn thuốc."""} | |
| ], | |
| temperature=0.8, | |
| max_tokens=1500 | |
| ) | |
| base_response = response.choices[0].message.content | |
| # Add sources using RAG integration formatter (FIXED!) | |
| if rag_sources: | |
| base_response = self.rag.format_response_with_sources({ | |
| 'answer': base_response, | |
| 'source_docs': rag_sources | |
| }) | |
| # Add resource information | |
| base_response += """ | |
| --- | |
| 💙 **Nếu cần hỗ trợ chuyên môn:** | |
| - Nếu cần nói chuyện với chuyên gia, đừng ngại đặt lịch tâm lý trị liệu nhé! | |
| Mình luôn ở đây nếu bạn cần trò chuyện thêm. Bạn không cô đơn! 🤗""" | |
| return base_response | |
| except Exception as e: | |
| return """Mình hiểu bạn đang trải qua thời gian khó khăn. 💙 | |
| Dù mình gặp chút vấn đề kỹ thuật, nhưng mình muốn bạn biết: | |
| - Cảm xúc của bạn là hợp lệ | |
| - Nhiều người cũng trải qua điều tương tự | |
| - Có sự hỗ trợ dành cho bạn | |
| 🆘 **Nếu bạn cần hỗ trợ khẩn cấp:** | |
| - 📞 **115** - Cấp cứu y tế (Trung tâm Cấp cứu 115 TP.HCM) | |
| - 📞 **1900 1267** - Chuyên gia tâm thần (Bệnh viện Tâm Thần TP.HCM) | |
| - 📞 **0909 65 80 35** - Tư vấn tâm lý miễn phí (Chăm sóc sức khỏe Việt - Davipharm) | |
| - Hoặc tìm đến bạn bè, người thân | |
| Bạn có muốn chia sẻ thêm về những gì bạn đang cảm thấy không?""" | |