File size: 8,506 Bytes
8610e5e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
import streamlit as st

from dotenv import load_dotenv
import os
import random
from datetime import datetime

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)

# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# xAI SDK import
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
from xai_sdk import Client
from xai_sdk.chat import system, user

# Load environment variables
load_dotenv(encoding="utf-8")
XAI_API_KEY = os.getenv("XAI_API_KEY")

# Page configuration
st.set_page_config(
    page_title="Mental Health Companion",
    page_icon="๐ŸŒฑ",
    layout="centered"
)

# Custom CSS for better UI
st.markdown("""
    <style>
    .stChatMessage {
        padding: 1rem;
        border-radius: 0.5rem;
    }
    .crisis-warning {
        background-color: #fff3cd;
        border: 2px solid #ffc107;
        padding: 1rem;
        border-radius: 0.5rem;
        margin: 1rem 0;
    }
    </style>
""", unsafe_allow_html=True)

# Initialize session state
if "messages" not in st.session_state:
    st.session_state.messages = []

# Simple default mood (handled by Grok instead of transformers)
if "mood" not in st.session_state:
    st.session_state.mood = "neutral"
    st.session_state.confidence = 0.5

# Initialize xAI client
if XAI_API_KEY:
    try:
        client = Client(api_key=XAI_API_KEY)
    except Exception as e:
        st.error(f"Error initializing xAI client: {e}")
        st.stop()
else:
    st.error("โš ๏ธ XAI_API_KEY not found. Please add it to your .env file.")
    st.stop()

# Enhanced relaxation tips with categories
relaxation_tips = {
    "breathing": [
        "Box breathing: Inhale for 4 seconds, hold for 4, exhale for 4, hold for 4. Repeat 3-5 times.",
        "4-7-8 breathing: Breathe in for 4 counts, hold for 7, exhale slowly for 8.",
    ],
    "physical": [
        "Try progressive muscle relaxation: Tense and relax each muscle group from toes to head.",
        "Do some gentle stretches or yoga poses for 5-10 minutes.",
        "Go for a short walk, even if it's just around your room or building.",
    ],
    "mindfulness": [
        "Practice the 5-4-3-2-1 grounding technique: Name 5 things you see, 4 you can touch, 3 you hear, 2 you smell, 1 you taste.",
        "Spend 5 minutes on mindful breathing, focusing only on your breath.",
        "Try a brief guided meditation using a free app or YouTube.",
    ],
    "creative": [
        "Journal your thoughts: Write freely for 5-10 minutes without editing.",
        "Listen to calming music or nature sounds.",
        "Color, draw, or engage in any creative activity you enjoy.",
    ],
    "social": [
        "Reach out to a friend or family member for a quick chat.",
        "Join a study group or student organization to connect with peers.",
        "Consider talking to a counselor at your school's wellness center.",
    ]
}

# Crisis keywords detection
crisis_keywords = [
    "suicide", "kill myself", "end it all", "want to die", 
    "no reason to live", "better off dead", "hurt myself"
]

def detect_crisis(text):
    """Detect potential crisis situations"""
    text_lower = text.lower()
    return any(keyword in text_lower for keyword in crisis_keywords)

def get_random_tips(num=2):
    """Get random relaxation tips from different categories"""
    tips = []
    categories = random.sample(list(relaxation_tips.keys()), min(num, len(relaxation_tips)))
    for category in categories:
        tips.append(random.choice(relaxation_tips[category]))
    return tips

# Header
st.title("๐ŸŒฑ Mental Health Companion")
st.markdown("*A supportive space for students navigating stress, anxiety, and life's challenges*")

# Sidebar with resources
with st.sidebar:
    st.header("๐Ÿ“š Resources")
    st.markdown("""
    ### Crisis Support (24/7)
    - ๐Ÿ‡ฎ๐Ÿ‡ณ **Vandrevala Foundation**: 1860-2662-345
    - ๐Ÿ‡ฎ๐Ÿ‡ณ **iCall**: 9152987821
    - ๐ŸŒ **International**: Find local helplines
    
    ### Student Wellness Tips
    - Maintain a regular sleep schedule
    - Take study breaks every 45-60 minutes
    - Stay connected with friends and family
    - Exercise regularly, even if just 15 minutes
    - Seek help early from campus counseling
    
    ### About This Bot
    This chatbot uses AI to provide emotional support 
    and coping strategies. It's not a replacement for 
    professional mental health care.
    """)
    
    if st.button("๐Ÿ”„ Clear Chat History"):
        st.session_state.messages = []
        st.rerun()

# Display chat history
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# User input
user_input = st.chat_input("Share what's on your mind...")

if user_input:
    # Check for crisis situation
    if detect_crisis(user_input):
        st.markdown("""
        <div class="crisis-warning">
        <h3>๐Ÿ†˜ Immediate Support Available</h3>
        <p>I'm concerned about what you've shared. Please reach out to a crisis counselor immediately:</p>
        <ul>
            <li><strong>India - Vandrevala Foundation</strong>: 1860-2662-345 (24/7)</li>
            <li><strong>India - iCall</strong>: 9152987821 (Mon-Sat, 8am-10pm)</li>
            <li><strong>Your campus counseling center</strong></li>
        </ul>
        <p>You don't have to face this alone. Professional help is available and things can get better.</p>
        </div>
        """, unsafe_allow_html=True)
        st.stop()
    
    # Add user message to history & display
    st.session_state.messages.append({"role": "user", "content": user_input})
    with st.chat_message("user"):
        st.markdown(user_input)
    

    # Default mood (sentiment handled implicitly)
    mood = st.session_state.get("mood", "neutral")
    confidence = st.session_state.get("confidence", 0.5)


    
    # Prepare prompt (now as messages list)
    system_prompt = f"""
You are a compassionate mental health support chatbot for students.

Guidelines:
1. Show empathy and validate their feelings
2. Be warm, supportive, and non-judgmental
3. Use encouraging language appropriate for students
4. If the mood seems negative, acknowledge their struggle
5. Offer hope and perspective when appropriate
6. Keep responses conversational and under 120 words
7. Do NOT provide medical diagnosis or treatment
8. If issues seem serious, gently suggest professional support
9. Use "I" statements to make it personal (e.g., "I hear you")

Detected emotional tone: {mood} (confidence: {confidence:.2f})
    """.strip()

    messages = [
        system(system_prompt),
        user(user_input)
    ]

    # Generate response
    with st.spinner("๐Ÿ’ญ Thinking..."):
        try:
            chat = client.chat.create(model="grok-4")          # or "grok-beta", "grok-3", etc.
            for msg in messages:
                chat.append(msg)

            response = chat.sample()
            bot_response = response.content.strip()

            # Add practical tips for negative sentiment
            if mood == 'negative' and confidence > 0.6:
                tips = get_random_tips(2)
                bot_response += "\n\n**Quick coping strategies to try:**\n"
                for i, tip in enumerate(tips, 1):
                    bot_response += f"{i}. {tip}\n"

            # Add timestamp (optional)
            timestamp = datetime.now().strftime("%I:%M %p")
            # bot_response += f"\n\n<small>{timestamp}</small>"

        except Exception:
              bot_response = (
                   "โš ๏ธ I'm temporarily unable to connect to the AI service right now.\n\n"
                   "That said, I still want to support you. If you're feeling overwhelmed, "
                   "consider reaching out to someone you trust or your campus counseling services.\n\n"
                   "Youโ€™re not alone, and help is available ๐Ÿ’™"
        )

    
    # Add bot response to history & display
    st.session_state.messages.append({"role": "assistant", "content": bot_response})
    with st.chat_message("assistant"):
        st.markdown(bot_response)

# Footer
st.markdown("---")
st.caption(
    "๐Ÿ’™ Remember: This chatbot is a support tool, not a replacement for "
    "professional mental health care. If you're in crisis, please contact "
    "emergency services or a crisis hotline immediately."
)