import os import gradio as gr import markdown from openai import OpenAI # --- Initialize Hugging Face router client --- HF_TOKEN = os.getenv("HF_TOKEN") if not HF_TOKEN: raise ValueError("❌ HF_TOKEN not found. Please set it in your Hugging Face Space secrets.") client = OpenAI( base_url="https://router.huggingface.co/v1", api_key=HF_TOKEN, ) # --- AI processing function --- def generate_report(age, gender, height, weight, albumin, creatinine, glucose, crp, mcv, rdw, alp, wbc, lymphocytes, hb, pv): # --- System prompt --- system = """You are an advanced Medical Insight Generation AI trained to analyze clinical biomarkers, urine analysis, and lab test results. Your goal is to generate a medically accurate, empathetic, and client-friendly health report in the following structured format: 1. Executive Summary 2. System-Specific Analysis 3. Personalized Action Plan 4. Interaction Alerts 5. Longevity Metrics 6. Tabular Mapping 7. Enhanced AI Insight 8. AI Insights & Longitudinal Risk Assessment 9. Predictive Longevity Risk Profile 10. Actionable Next Steps Maintain a professional, compassionate tone and explain medical reasoning in accessible language. """ # --- Format user message --- user_message = ( f"Patient Info:\n" f"- Age: {age}\n" f"- Gender: {gender}\n" f"- Height: {height} cm\n" f"- Weight: {weight} kg\n\n" f"Biomarkers:\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: {hb} g/dL\n" f"- Plasma (PV): {pv} mL\n" ) try: # --- Query model --- response = client.chat.completions.create( model="openai/gpt-oss-120b:groq", messages=[ {"role": "system", "content": system}, {"role": "user", "content": user_message}, ], temperature=0.5, ) # --- 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( generate_report, inputs=[ age, gender, height, weight, albumin, creatinine, glucose, crp, mcv, rdw, alp, wbc, lymphocytes, hb, pv ], outputs=output_box ) demo.launch()