import os import streamlit as st from groq import Groq import re from datetime import datetime from dotenv import load_dotenv load_dotenv() # Initialize Groq client with environment variable Groq_API_KEY = os.getenv("GROQ_API_KEY") # Initialize Groq client client = Groq(api_key= Groq_API_KEY) # Set page configuration st.set_page_config( page_title="Virtual Medical Assistant", page_icon="👨‍⚕️", layout="wide", initial_sidebar_state="expanded", ) # Custom CSS with improved chat styling st.markdown( """ """, unsafe_allow_html=True, ) # Updated System prompt for multilingual support SYSTEM_PROMPT = """You are a multilingual virtual medical assistant with great expertise and empathy. Your role is: 1. Scope of Assistance: - Diagnose common symptoms - Suggest possible conditions - Provide recommendations for common over-the-counter medications - Offer advice on managing health issues - Answer medical questions only - Inform the patient about symptoms of illnesses 2. Important Limitations: - Do not answer non-medical questions - When asked a non-medical question, simply say in the user's language: "Sorry, this question is outside my medical expertise." - Provide definitive diagnoses only for very common conditions - Do not prescribe prescription medications - Do not provide advice on serious medical conditions - Do not greet the user in every response. Do so only if the user starts with a greeting. 3. When dealing with symptoms: A. Gather information - Ask specific questions about: - Duration of symptoms - Severity of symptoms - Age - Medical history - Current medications - Associated symptoms B. Assessment: - Analyze the reported symptoms - Link symptoms to common possible conditions - Determine the severity of the condition C. Recommendations: - Suggest safe home remedies - Recommend over-the-counter medications - Provide prevention and self-care tips 4. When to refer the patient to a doctor: - In case of severe symptoms - If symptoms persist for a long time - If the condition worsens - When specific medical tests are needed - In emergencies 5. Mandatory Reminder: - Always emphasize that the advice provided is not a substitute for consulting a doctor - Encourage visiting a healthcare provider in serious cases - Explain that this advice is general and not an official medical diagnosis 6. Language and Communication: - ALWAYS respond in the same language the user is using - If the user writes in Spanish, respond in Spanish - If the user writes in Arabic, respond in Arabic - If the user writes in French, respond in French - For any language the user chooses, respond in that same language - Use simple and clear language - Maintain a professional and empathetic tone - Avoid complex medical terminology 7. In emergencies: - Direct the patient immediately to the nearest emergency department - Provide simple first aid instructions if necessary - Emphasize the importance of seeking immediate medical help Always remember: Patient safety is the top priority, and in case of doubt, always recommend visiting a doctor.""" # Initialize session state if "chat_history" not in st.session_state: st.session_state.chat_history = {} if "current_chat_id" not in st.session_state: st.session_state.current_chat_id = None if "temp_chat" not in st.session_state: st.session_state.temp_chat = None def get_groq_response(messages): try: chat_completion = client.chat.completions.create( messages=messages, model="llama3-8b-8192", temperature=0.7, max_tokens=1000, ) return chat_completion.choices[0].message.content except Exception as e: return f"Sorry, there was an error in the connection: {str(e)}" def create_new_chat(): chat_id = datetime.now().strftime("%Y%m%d_%H%M%S") st.session_state.temp_chat = [{"role": "system", "content": SYSTEM_PROMPT}] st.session_state.current_chat_id = chat_id return chat_id def save_chat(): if st.session_state.temp_chat and len(st.session_state.temp_chat) > 1: st.session_state.chat_history[st.session_state.current_chat_id] = ( st.session_state.temp_chat ) st.session_state.temp_chat = None def delete_chat(chat_id): if chat_id in st.session_state.chat_history: del st.session_state.chat_history[chat_id] if st.session_state.current_chat_id == chat_id: st.session_state.current_chat_id = None def get_chat_preview(chat): for message in chat: if message["role"] == "user": preview = message["content"][:30] return f"{preview}..." if len(message["content"]) > 30 else preview return "New Chat" # Main layout st.markdown( '

👨‍⚕️ Call on Doc Virtual Medical Assistant

', unsafe_allow_html=True ) # Add language indicator in the sidebar with st.sidebar: st.markdown('", unsafe_allow_html=True) # Main chat interface current_chat = st.session_state.temp_chat or ( st.session_state.chat_history.get(st.session_state.current_chat_id, None) ) if current_chat: st.markdown('
', unsafe_allow_html=True) # Display chat history for message in current_chat[1:]: # Skip system prompt if message["role"] == "user": st.markdown( f'
{message["content"]}
', unsafe_allow_html=True, ) else: st.markdown( f'
{message["content"]}
', unsafe_allow_html=True, ) st.markdown("
", unsafe_allow_html=True) # User input user_input = st.chat_input("Type your question in any language...") if user_input: # Check if current_chat_id exists, if not create a new one if not st.session_state.current_chat_id: create_new_chat() current_chat = st.session_state.temp_chat # Add user message current_chat.append({"role": "user", "content": user_input}) # Get assistant response with st.spinner("Thinking..."): assistant_response = get_groq_response(current_chat) # Add assistant response to chat current_chat.append({"role": "assistant", "content": assistant_response}) # Save chat if temporary if st.session_state.temp_chat: save_chat() st.rerun() else: st.markdown( """

Start a new chat by clicking the 'New Chat ➕' button

You can ask questions in any language, and the assistant will respond in the same language.

""", unsafe_allow_html=True, ) # Footer st.markdown( """

Reminder: This medical assistant is for general consultations only. Please consult a doctor for serious medical conditions.

""", unsafe_allow_html=True, )