Spaces:
Running
Running
| from statistics import mode | |
| import streamlit as st | |
| import logging | |
| from PIL import Image, ImageEnhance | |
| import base64 | |
| from groq import Groq | |
| import urllib | |
| import os | |
| logging.basicConfig(level=logging.INFO) | |
| api_key = os.getenv("OPENAI_API_KEY") | |
| client = Groq(api_key=api_key) | |
| st.set_page_config( | |
| page_title="app.py", | |
| page_icon="imgs/avatar_streamly.png", | |
| layout="wide", | |
| initial_sidebar_state="auto", | |
| ) | |
| st.markdown( | |
| """ | |
| <style> | |
| .centered-title { | |
| text-align: center; | |
| font-size: 3em; | |
| font-weight: bold; | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| st.markdown('<div class="centered-title">Chat with Therapist</div>', unsafe_allow_html=True) | |
| def generate_google_maps_link(location, search_term="therapists or hospitals near"): | |
| """Generate a Google Maps search link for nearby therapists or hospitals.""" | |
| query = f"{search_term} {location}" | |
| encoded_query = urllib.parse.quote(query) | |
| google_maps_url = f"https://www.google.com/maps/search/{encoded_query}" | |
| return google_maps_url | |
| def img_to_base64(image_path): | |
| """Convert an image to base64 encoding for display.""" | |
| try: | |
| with open(image_path, "rb") as img_file: | |
| return base64.b64encode(img_file.read()).decode() | |
| except Exception as e: | |
| logging.error(f"Error converting image to base64: {str(e)}") | |
| return None | |
| # Initialize session state | |
| def initialize_session_state(): | |
| if "conversation_history" not in st.session_state: | |
| st.session_state.conversation_history = [] | |
| if "history" not in st.session_state: | |
| st.session_state.history = [] | |
| if "user_details" not in st.session_state: | |
| st.session_state.user_details = {} | |
| initialize_session_state() | |
| def initialize_conversation(): | |
| """Initialize the conversation history with system and assistant messages for the AI therapist.""" | |
| assistant_message = "Hello! I am Your AI Therapist. How can I assist you today?" | |
| st.session_state.conversation_history = [ | |
| {"role": "assistant", "content": assistant_message} | |
| ] | |
| def on_chat_submit(chat_input1): | |
| user_input = chat_input1.strip() | |
| st.session_state.conversation_history.append({"role": "user", "content": user_input}) | |
| fixed_prompt = [ | |
| {"role": "system", "content": """ | |
| You are an AI therapist named Virtual Therapist, designed to provide conversational support and mental health guidance in a clear, concise, and professional manner. Your responses should: | |
| 1. Be short and to the point: Offer brief but supportive answers, especially in a therapeutic setting. | |
| 2. Maintain a professional tone: Use a calm, empathetic, and professional approach in all interactions. | |
| 3. Encourage open dialogue: Ask open-ended questions to understand the user’s concerns without over-explaining. | |
| 4. Provide solutions or suggestions where appropriate: Offer coping techniques, resources, or quick advice. | |
| 5. Stay respectful and non-judgmental: Ensure all responses reflect respect and care for the user's emotions and mental well-being. | |
| 6. Avoid lengthy explanations: Provide short, clear guidance, and direct the user to professional help when needed. | |
| """} | |
| ] | |
| conversation_history_with_prompt = fixed_prompt + st.session_state.conversation_history | |
| assistant_reply = "I'm here to listen. Could you tell me more about how you're feeling?" | |
| try: | |
| model_engine = "llama3-8b-8192" | |
| response = client.chat.completions.create( | |
| messages=conversation_history_with_prompt, | |
| model=model_engine | |
| ) | |
| assistant_reply = response.choices[0].message.content | |
| except Exception as e: | |
| logging.error(f"Error occurred: {e}") | |
| st.error(f"An error occurred: {str(e)}") | |
| st.session_state.conversation_history.append({"role": "assistant", "content": assistant_reply}) | |
| def main(): | |
| """Main function to display Streamlit updates and handle chat interface.""" | |
| initialize_session_state() | |
| if not st.session_state.conversation_history: | |
| st.session_state.conversation_history = initialize_conversation() | |
| st.markdown( | |
| """ | |
| <style> | |
| .cover-glow { | |
| width: 100%; | |
| height: auto; | |
| padding: 3px; | |
| box-shadow: | |
| 0 0 5px #330000, | |
| 0 0 10px #660000, | |
| 0 0 15px #990000, | |
| 0 0 20px #CC0000, | |
| 0 0 25px #FF0000, | |
| 0 0 30px #FF3333, | |
| 0 0 35px #FF6666; | |
| border-radius: 45px; | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True, | |
| ) | |
| img_path = "imgs/sidebar_streamly_avatar.png" | |
| img_base64 = img_to_base64(img_path) | |
| if img_base64: | |
| st.sidebar.markdown( | |
| f'<img src="data:image/png;base64,{img_base64}" class="cover-glow">', | |
| unsafe_allow_html=True, | |
| ) | |
| st.sidebar.markdown("---") | |
| mode = st.sidebar.radio("Select Mode:", options=["Visit Doctor", "Chat with Therapist", "Talk to Therapist"], index=1) | |
| st.session_state.mode = mode | |
| st.sidebar.markdown("---") | |
| # Check if the mode is "Talk to Therapist" | |
| if "mode" in st.session_state and st.session_state["mode"] == "Talk to Therapist": | |
| # Styling template for the glowing effect | |
| st.markdown( | |
| """ | |
| <style> | |
| .cover-glow { | |
| width: 100%; | |
| height: auto; | |
| padding: 5px; | |
| box-shadow: | |
| 0 0 5px #330000, | |
| 0 0 10px #660000, | |
| 0 0 15px #990000, | |
| 0 0 20px #CC0000, | |
| 0 0 25px #FF0000, | |
| 0 0 30px #FF3333, | |
| 0 0 35px #FF6666; | |
| border-radius: 10px; | |
| } | |
| .real-time { | |
| font-family: Arial, sans-serif; | |
| font-size: 16px; | |
| line-height: 1.5; | |
| color: white; | |
| background-color: #1E1E1E; | |
| padding: 15px; | |
| border-radius: 10px; | |
| box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); | |
| } | |
| .progress-message { | |
| font-size: 18px; | |
| color: white; | |
| font-weight: bold; | |
| margin-top: 1em; | |
| text-align: center; | |
| animation: blinker 1.5s linear infinite; | |
| } | |
| @keyframes blinker { | |
| 50% { | |
| opacity: 0.5; | |
| } | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| # Display header with glowing effect | |
| st.markdown( | |
| """ | |
| <p class="cover-glow" style="font-size:17px; color:white; background-color:black; font-weight:bold; | |
| text-align: center; margin-top: 3em; margin-bottom: 3em;"> | |
| TALK TO YOUR AI THERAPIST | |
| </p> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| # st.write("### Real Time Live Therapy Session") | |
| # In-progress message | |
| st.markdown( | |
| """ | |
| <style> | |
| .progress-message { | |
| font-size: 35px; /* Increased font size */ | |
| color: white; | |
| font-weight: bold; /* Bold styling */ | |
| margin-top: 1em; | |
| text-align: center; | |
| animation: blinker 1.5s linear infinite; | |
| } | |
| @keyframes blinker { | |
| 50% { | |
| opacity: 0.5; | |
| } | |
| } | |
| </style> | |
| <p class="progress-message">📞 Real Time Live Therapy Session ☎️</p> | |
| <p class="progress-message">In Progress ⌛️⌛️</p> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| # Simulate real-time communication | |
| # st.write("### Real Time Live Therapy Session") | |
| # Initialize location input field | |
| location = "" | |
| # Location input based on mode | |
| if "mode" in st.session_state and st.session_state["mode"] == "Visit Doctor": | |
| st.markdown( | |
| """ | |
| <style> | |
| .cover-glow { | |
| width: 100%; | |
| height: auto; | |
| padding: 5px; | |
| box-shadow: | |
| 0 0 5px #330000, | |
| 0 0 10px #660000, | |
| 0 0 15px #990000, | |
| 0 0 20px #CC0000, | |
| 0 0 25px #FF0000, | |
| 0 0 30px #FF3333, | |
| 0 0 35px #FF6666; | |
| border-radius: 10px; | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| st.markdown( | |
| f""" | |
| <p class="cover-glow" style="font-size:17px; color:white; background-color:black; font-weight:bold; | |
| text-align: center; margin-top: 3em; margin-bottom: 3em;"> | |
| THERAPIST OR DOCTOR NEAR ME <span style="color:white;">{location.strip()}</span> | |
| </p> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| # location = st.chat_input("Enter your location here...") | |
| # if location: | |
| # st.session_state.user_details["location"] = location | |
| # if location.strip(): | |
| # google_maps_link = f"https://www.google.com/maps/search/{urllib.parse.quote('therapists or hospitals near ' + location)}" | |
| # st.markdown(f"Find a licensed therapist or doctor near **{location}**: [Click here to view on Google Maps]({google_maps_link})") | |
| # Initialize session state for storing chat messages | |
| if "messages" not in st.session_state: | |
| st.session_state["messages"] = [] | |
| user_avatar = "imgs/googlemap.png" | |
| assistant_avatar = "imgs/botreq.png" | |
| # Chat input field for location | |
| location = st.chat_input("Enter your location here...") | |
| # Process input if available | |
| if location: | |
| # Save user's location input | |
| st.session_state["messages"].append({"role": "user", "content": location}) | |
| # Generate Google Maps link and add it as assistant's response | |
| if location.strip(): | |
| google_maps_link = f"https://www.google.com/maps/search/{urllib.parse.quote('therapists or hospitals near ' + location)}" | |
| bot_reply = f"Find a licensed therapist or doctor near **{location}**: [Click here to view on Google Maps]({google_maps_link})" | |
| st.session_state["messages"].append({"role": "assistant", "content": bot_reply}) | |
| # Display chat history with avatars for user and assistant | |
| for message in st.session_state["messages"]: | |
| role = message["role"] | |
| avatar_image = assistant_avatar if role == "assistant" else user_avatar | |
| with st.chat_message(role.capitalize(), avatar=avatar_image): | |
| st.write(message["content"]) | |
| show_basic_info = st.sidebar.checkbox("Quick Chat ", value=False) | |
| if show_basic_info: | |
| st.sidebar.markdown(""" | |
| ### Quick Chat Guidance | |
| - **Share Your Feelings**: Express what you're feeling, like "I'm stressed" or "I'm overwhelmed." | |
| - **How to Respond**: The AI will listen and offer support. Share more if you wish. | |
| - **Be Open**: Take your time and talk about what's on your mind. | |
| - **Ask for Help**: If unsure, say "I need help with stress" and the AI will guide you. | |
| """) | |
| show_advanced_info = st.sidebar.checkbox("Comprehensive Guidance", value=False) | |
| if show_advanced_info: | |
| st.sidebar.markdown(""" | |
| ### Comprehensive Guidance | |
| - **Mental Health**: | |
| - "Seeking help is a sign of strength. Small steps matter." | |
| - "Therapists can guide you through tough times." | |
| - "You deserve to feel better." | |
| - **When to Seek Help**: | |
| - "Feeling overwhelmed? A therapist can support you." | |
| - "Reach out to a doctor if mental health feels too much." | |
| """) | |
| if mode == "Chat with Therapist": | |
| if not st.session_state.conversation_history: | |
| initialize_conversation() | |
| chat_input1 = st.chat_input("Type your message here...") | |
| if chat_input1: | |
| on_chat_submit(chat_input1) | |
| for message in st.session_state.conversation_history[-10:]: | |
| role = message["role"] | |
| avatar_image = "imgs/avatar_streamly.png" if role == "assistant" else "imgs/stuser.png" | |
| with st.chat_message(role.capitalize(), avatar=avatar_image): | |
| st.write(message["content"]) | |
| if __name__ == "__main__": | |
| main() | |