import gradio as gr from groq import Groq import os import markdown # 🔹 Set your Groq API Key securely os.environ["GROQ_API_KEY"] = "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" # 🔹 Initialize Groq client client = Groq(api_key=os.getenv("GROQ_API_KEY")) # 🔹 Define model MODEL_ID = "llama-3.3-70b-versatile" # ---------------- AI Response Function ---------------- def respond(albumin, creatinine, glucose, crp, mcv, rdw, alp, wbc, lymphocytes, hemoglobin, pv, age, gender, height, weight): # ----- System Prompt ----- system_message = ( "You are an AI Health Assistant that analyzes laboratory biomarkers " "and generates structured, patient-friendly health summaries.\n\n" "Your task is to evaluate the provided biomarkers and generate an AI-driven medical report " "with insights, observations, and clear explanations.\n" "You must strictly follow this structured format:\n\n" "### Tabular Mapping\n" "- Always include a Markdown table with exactly four columns:\n" "| Biomarker | Value | Status (Low/Normal/High) | AI-Inferred Insight | Reference Range |\n" "- Include **all available biomarkers** below:\n" "Albumin, Creatinine, Glucose, CRP, MCV, RDW, ALP, WBC, Lymphocytes, Hemoglobin, Plasma (PV)\n" "- The first row after the header must begin directly with 'Albumin'.\n" "- Each biomarker must appear exactly once as a separate row.\n\n" "### Executive Summary\n" "- List Top 3 Health Priorities.\n" "- Highlight Key Strengths or normal biomarkers.\n\n" "### System-Specific Analysis\n" "- Summarize findings grouped by organ systems (Liver, Kidney, Immune, Blood, etc.).\n" "- Status: “Optimal” | “Monitor” | “Needs Attention”.\n" "- Provide 2–3 sentences of explanation in plain, supportive language.\n\n" "### Personalized Action Plan\n" "- Provide categorized recommendations (Nutrition, Lifestyle, Testing, Medical Consultation).\n" "- Never recommend medication or treatment.\n\n" "### Interaction Alerts\n" "- Highlight potential relationships between markers (e.g., high CRP + low Albumin).\n\n" "### Constraints\n" "- Never give a diagnosis or prescribe medicine.\n" "- Never use data not present in the input.\n" "- Always recommend consulting a healthcare professional.\n" "- Always include normal reference ranges for each biomarker.\n" "- Use simple, clear, patient-friendly language." ) # ----- User Message ----- user_message = ( f"Patient Information:\n" f"- Age: {age} years\n" f"- Gender: {gender}\n" f"- Height: {height} cm\n" f"- Weight: {weight} kg\n\n" f"Biomarker Values:\n" f"- Albumin: {albumin} g/dL\n" f"- Creatinine: {creatinine} mg/dL\n" f"- Glucose: {glucose} mg/dL\n" f"- CRP: {crp} mg/L\n" f"- MCV: {mcv} fL\n" f"- RDW: {rdw} %\n" f"- ALP: {alp} U/L\n" f"- WBC: {wbc} x10^3/μL\n" f"- Lymphocytes: {lymphocytes} %\n" f"- Hemoglobin: {hemoglobin} g/dL\n" f"- Plasma (PV): {pv} mL" ) try: # --- Query model --- response = client.chat.completions.create( model=MODEL_ID, messages=[ {"role": "system", "content": system_message}, {"role": "user", "content": user_message} ], temperature=0.4, max_tokens=2500, top_p=0.9, stream=False ) # --- Get model reply and convert Markdown → HTML --- reply = response.choices[0].message.content html_output = markdown.markdown( reply, extensions=["tables", "fenced_code", "nl2br"] ) except Exception as e: html_output = f"

⚠️ Error: {str(e)}

" return html_output # --- Gradio Interface --- with gr.Blocks(title="🧬 Biomarker Medical Insight Chatbot") as demo: gr.Markdown( """ ## 🧠 AI-Powered Biomarker Report Generator Enter the patient details and biomarkers below. The AI will generate a **comprehensive medical report** with structured insights, risk assessment, and recommendations. """ ) # --- Basic Info --- with gr.Row(): age = gr.Number(label="Age", value=45) gender = gr.Radio(["Male", "Female"], label="Gender", value="Male") with gr.Row(): height = gr.Number(label="Height (cm)", value=175) weight = gr.Number(label="Weight (kg)", value=72) # --- Biomarkers --- gr.Markdown("### 🧫 Biomarker Inputs (Demo Values Pre-filled)") with gr.Row(): albumin = gr.Number(label="Albumin (g/dL)", value=4.2) creatinine = gr.Number(label="Creatinine (mg/dL)", value=1.1) glucose = gr.Number(label="Glucose (mg/dL)", value=98) with gr.Row(): crp = gr.Number(label="CRP (mg/L)", value=2.5) mcv = gr.Number(label="MCV (fL)", value=90.5) rdw = gr.Number(label="RDW (%)", value=13.2) with gr.Row(): alp = gr.Number(label="ALP (U/L)", value=110) wbc = gr.Number(label="WBC (x10^3/μL)", value=6.8) lymphocytes = gr.Number(label="Lymphocytes (%)", value=35) with gr.Row(): hb = gr.Number(label="Hemoglobin (g/dL)", value=14.5) pv = gr.Number(label="Plasma (PV) (mL)", value=3000) # --- Submit + Output --- submit_btn = gr.Button("📤 Generate Medical Report") output_box = gr.HTML(label="🧠 AI-Generated Medical Report (Rendered in Markup)") submit_btn.click( respond, inputs=[ age, gender, height, weight, albumin, creatinine, glucose, crp, mcv, rdw, alp, wbc, lymphocytes, hb, pv ], outputs=output_box ) demo.launch()