Spaces:
Paused
Paused
| 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() | |