| import gradio as gr |
| import google.generativeai as genai |
| import os |
| from datetime import datetime |
|
|
| |
| os.environ["GOOGLE_API_KEY"] = "AIzaSyDwMK08RcUvg9JomaJSuX9XT3BGNasQk5M" |
|
|
| |
| genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) |
|
|
| |
| MODEL_ID = "gemini-2.0-flash-exp" |
|
|
| |
| DOCTOR_SYSTEM_PROMPT = """You are Dr. AI Assistant, a professional and empathetic medical doctor conducting a thorough patient consultation. |
| |
| YOUR CONSULTATION PROCESS: |
| 1. **Initial Greeting & Personal Details Collection**: |
| - Greet the patient warmly |
| - Ask for: Name, Age, Gender, Contact details |
| - Ask about occupation and lifestyle |
| |
| 2. **Medical History**: |
| - Ask about chief complaints (main symptoms) |
| - Duration and severity of symptoms |
| - Past medical history |
| - Current medications |
| - Allergies |
| - Family medical history |
| - Previous surgeries or hospitalizations |
| |
| 3. **Detailed Symptom Analysis**: |
| - Ask specific questions about each symptom |
| - Pain level (1-10 scale) |
| - Aggravating and relieving factors |
| - Associated symptoms |
| |
| 4. **Lifestyle Assessment**: |
| - Diet and eating habits |
| - Exercise routine |
| - Sleep patterns |
| - Stress levels |
| - Smoking/alcohol consumption |
| - Water intake |
| |
| 5. **Physical Examination Questions** (virtual): |
| - Ask about vital signs if known (BP, temperature, pulse) |
| - Visible symptoms |
| - Any recent changes in body |
| |
| 6. **Provide Comprehensive Recommendations**: |
| - Preliminary assessment |
| - Dietary recommendations |
| - Lifestyle modifications |
| - Exercise suggestions |
| - Medication suggestions (with disclaimer) |
| - When to seek immediate medical attention |
| - Follow-up advice |
| |
| 7. **Generate Summary** (when patient requests): |
| - Patient details |
| - Chief complaints |
| - Medical history |
| - Assessment |
| - Recommendations (diet, lifestyle, medications) |
| - Disclaimer about consulting a physical doctor |
| |
| IMPORTANT GUIDELINES: |
| - Be professional, empathetic, and reassuring |
| - **CRITICAL: Ask ONLY ONE question at a time - NEVER ask multiple questions in a single response** |
| - Wait for the patient's answer before asking the next question |
| - Use medical terminology but explain in simple terms |
| - Always include disclaimer that this is preliminary advice |
| - Recommend seeing a physical doctor for serious conditions |
| - Show concern and empathy |
| - Be thorough but not overwhelming |
| - Keep the conversation natural and flowing like a real doctor-patient interaction |
| |
| DISCLAIMER TO INCLUDE: |
| "β οΈ Please note: This is an AI-powered preliminary consultation. For accurate diagnosis and treatment, please consult a licensed medical professional in person. In case of emergency, call emergency services immediately." |
| |
| Start by greeting the patient and asking for their name.""" |
|
|
| def initialize_chat(): |
| """Initialize the Gemini chat with doctor system prompt""" |
| model = genai.GenerativeModel( |
| model_name=MODEL_ID, |
| system_instruction=DOCTOR_SYSTEM_PROMPT |
| ) |
| chat = model.start_chat(history=[]) |
| return chat |
|
|
| |
| chat_session = initialize_chat() |
|
|
| def chat_with_doctor(message, history): |
| """Handle patient messages and get doctor's response""" |
| global chat_session |
| |
| try: |
| |
| response = chat_session.send_message(message) |
| doctor_response = response.text |
| |
| return doctor_response |
| |
| except Exception as e: |
| return f"I apologize, but I encountered an error: {str(e)}. Please try again or restart the consultation." |
|
|
| def generate_consultation_summary(history): |
| """Generate a comprehensive summary of the consultation""" |
| global chat_session |
| |
| summary_request = """Please generate a comprehensive consultation summary in the following format: |
| |
| π **MEDICAL CONSULTATION SUMMARY** |
| ββββββββββββββββββββββββββββββββ |
| |
| **Patient Information:** |
| - Name: [name] |
| - Age: [age] |
| - Gender: [gender] |
| - Date of Consultation: [current date] |
| |
| **Chief Complaints:** |
| [List main symptoms and concerns] |
| |
| **Medical History:** |
| [Relevant medical history] |
| |
| **Assessment:** |
| [Your preliminary assessment] |
| |
| **Recommendations:** |
| |
| 1. **Dietary Recommendations:** |
| [Specific diet advice] |
| |
| 2. **Lifestyle Modifications:** |
| [Lifestyle changes needed] |
| |
| 3. **Exercise & Physical Activity:** |
| [Exercise recommendations] |
| |
| 4. **Medication Suggestions:** |
| [If any - with disclaimer] |
| |
| 5. **Follow-up Care:** |
| [When to seek medical attention] |
| |
| **Important Notes:** |
| β οΈ This is a preliminary AI consultation. Please consult a licensed medical doctor for accurate diagnosis and treatment. |
| |
| ββββββββββββββββββββββββββββββββ |
| |
| Generated by Dr. AI Assistant""" |
| |
| try: |
| response = chat_session.send_message(summary_request) |
| return response.text |
| except Exception as e: |
| return f"Error generating summary: {str(e)}" |
|
|
| def restart_consultation(): |
| """Restart the consultation with a fresh session""" |
| global chat_session |
| chat_session = initialize_chat() |
| return [], "Consultation restarted. Please tell me your name to begin." |
|
|
| |
| with gr.Blocks(title="AI Doctor Consultation", theme=gr.themes.Soft()) as demo: |
| gr.Markdown(""" |
| # π©Ί AI Doctor Consultation System |
| ### Professional Medical Consultation with Dr. AI Assistant |
| |
| Welcome! I'm Dr. AI Assistant, here to conduct a thorough medical consultation. |
| I'll ask about your symptoms, medical history, lifestyle, and provide comprehensive recommendations. |
| |
| **β οΈ Important:** This is a preliminary consultation. Always consult a licensed physician for proper diagnosis and treatment. |
| """) |
| |
| with gr.Row(): |
| with gr.Column(scale=4): |
| chatbot = gr.Chatbot( |
| height=500, |
| show_label=False, |
| avatar_images=(None, "https://api.dicebear.com/7.x/bottts/svg?seed=doctor"), |
| bubble_full_width=False |
| ) |
| |
| with gr.Row(): |
| msg = gr.Textbox( |
| placeholder="Type your message here...", |
| show_label=False, |
| scale=4 |
| ) |
| send_btn = gr.Button("Send π€", scale=1, variant="primary") |
| |
| with gr.Row(): |
| summary_btn = gr.Button("π Generate Consultation Summary", variant="secondary") |
| clear_btn = gr.Button("π Restart Consultation", variant="stop") |
| |
| with gr.Column(scale=1): |
| gr.Markdown(""" |
| ### π Consultation Guide |
| |
| **What I'll ask about:** |
| - Personal details |
| - Chief complaints |
| - Medical history |
| - Current medications |
| - Lifestyle habits |
| - Diet & exercise |
| |
| **I'll provide:** |
| - Preliminary assessment |
| - Dietary advice |
| - Lifestyle changes |
| - Exercise plan |
| - Medication suggestions |
| - Follow-up guidance |
| |
| **Commands:** |
| - Type normally to chat |
| - Click "Generate Summary" for full report |
| - Click "Restart" for new consultation |
| |
| βοΈ *Be honest and detailed for best advice* |
| """) |
| |
| summary_output = gr.Textbox( |
| label="π Consultation Summary", |
| placeholder="Click 'Generate Summary' after consultation", |
| lines=15, |
| max_lines=20 |
| ) |
| |
| |
| def start_conversation(): |
| initial_message = "Hello! I'm Dr. AI Assistant. I'm here to help you today. Let's start with some basic information.\n\nπ€ May I have your name, please?" |
| return [[None, initial_message]] |
| |
| demo.load( |
| start_conversation, |
| outputs=[chatbot] |
| ) |
| |
| |
| def respond(message, chat_history): |
| if not message.strip(): |
| return "", chat_history |
| |
| |
| chat_history.append((message, None)) |
| |
| |
| bot_response = chat_with_doctor(message, chat_history) |
| chat_history[-1] = (message, bot_response) |
| |
| return "", chat_history |
| |
| msg.submit(respond, [msg, chatbot], [msg, chatbot]) |
| send_btn.click(respond, [msg, chatbot], [msg, chatbot]) |
| |
| |
| summary_btn.click( |
| lambda history: generate_consultation_summary(history), |
| inputs=[chatbot], |
| outputs=[summary_output] |
| ) |
| |
| |
| def restart_and_update(): |
| new_history, greeting = restart_consultation() |
| return [[None, greeting]], "" |
| |
| clear_btn.click( |
| restart_and_update, |
| outputs=[chatbot, summary_output] |
| ) |
|
|
| |
| if __name__ == "__main__": |
| demo.launch(share=True) |