File size: 4,069 Bytes
12f2295
 
c57fdf3
12f2295
c57fdf3
 
 
 
 
 
12f2295
 
 
 
 
 
 
 
c57fdf3
 
 
 
 
 
12f2295
 
 
c57fdf3
12f2295
c57fdf3
12f2295
c57fdf3
12f2295
c57fdf3
12f2295
c57fdf3
12f2295
c57fdf3
12f2295
 
 
 
 
 
 
c57fdf3
 
12f2295
 
 
 
c57fdf3
12f2295
 
c57fdf3
 
 
 
 
 
 
 
12f2295
c57fdf3
 
 
12f2295
c57fdf3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12f2295
c57fdf3
 
12f2295
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import os
import streamlit as st
from config import STATIC_DIR, HF_TOKEN, GOOGLE_API_KEY, DEVICE

# App Configuration
st.set_page_config(page_title="RxGuard Prescription Validator", page_icon="⚕️", layout="wide")

# Initialize directories and session state
UPLOADS_DIR = os.path.join(STATIC_DIR, "uploads")
os.makedirs(UPLOADS_DIR, exist_ok=True)

if "analysis_result" not in st.session_state:
    st.session_state.analysis_result = None
if "uploaded_filename" not in st.session_state:
    st.session_state.uploaded_filename = None

def show_service_status():
    """Displays service connectivity status."""
    st.caption("Service Status")
    cols = st.columns(3)
    cols[0].metric("HuggingFace Models", "✅" if HF_TOKEN else "❌")
    cols[1].metric("Google AI Services", "✅" if GOOGLE_API_KEY else "❌")
    cols[2].metric("Hardware Accelerator", DEVICE.upper())
    st.divider()

def main():
    st.title("⚕️ RxGuard Prescription Validator")
    st.caption("Advanced, multi-source AI verification system")
    show_service_status()

    # Only enable upload if required services are available
    if all([HF_TOKEN, GOOGLE_API_KEY]):
        uploaded_file = st.file_uploader(
            "Upload a prescription image (PNG/JPG/JPEG):",
            type=["png", "jpg", "jpeg"],
            help="Upload a clear image of the prescription for analysis."
        )

        if uploaded_file and uploaded_file.name != st.session_state.uploaded_filename:
            with st.status("Analyzing prescription...", expanded=True) as status:
                try:
                    st.session_state.uploaded_filename = uploaded_file.name
                    file_path = os.path.join(UPLOADS_DIR, uploaded_file.name)
                    with open(file_path, "wb") as f:
                        f.write(uploaded_file.getvalue())

                    # Lazily import the processing function
                    from validate_prescription import extract_prescription_info
                    st.session_state.analysis_result = extract_prescription_info(file_path)
                    status.update(label="Analysis complete!", state="complete", expanded=False)
                except Exception as e:
                    st.error(f"A critical error occurred during processing: {str(e)}")
                    st.session_state.analysis_result = {"error": str(e)}
                    status.update(label="Analysis failed", state="error")

    else:
        st.error("Missing API Keys. Please configure HF_TOKEN and GOOGLE_API_KEY in your Space secrets.")

    # Display results if available in the session state
    if result := st.session_state.get("analysis_result"):
        if error := result.get("error"):
            st.error(f"❌ Analysis Error: {error}")
        else:
            info = result.get("info", {})
            tab1, tab2 = st.tabs(["**👤 Patient & Prescription Info**", "**⚙️ Technical Details**"])

            with tab1:
                col1, col2 = st.columns([1, 2])
                with col1:
                    if uploaded_file:
                        st.image(uploaded_file, use_column_width=True, caption="Uploaded Prescription")
                with col2:
                    st.subheader("Patient Details")
                    st.info(f"**Name:** {info.get('Name', 'Not detected')}")
                    st.info(f"**Age:** {info.get('Age', 'N/A')}")
                    st.subheader("Prescription Details")
                    st.info(f"**Date:** {info.get('Date', 'N/A')}")
                    st.info(f"**Physician:** {info.get('PhysicianName', 'N/A')}")

                st.divider()
                st.subheader("💊 Medications")
                for med in info.get("Medications", []):
                    st.success(f"**Drug:** {med.get('drug_raw')} | **Dosage:** {med.get('dosage', 'N/A')} | **Frequency:** {med.get('frequency', 'N/A')}")

            with tab2:
                st.subheader("Debug Information from AI Pipeline")
                st.json(result.get("debug_info", {}))

if __name__ == "__main__":
    main()