Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
import json | |
from data_service import DataAssessmentService | |
from sheets_integration import SheetsLogger | |
from datetime import datetime | |
# Initialize services | |
service = DataAssessmentService(api_key=os.environ.get("OPENAI_API_KEY")) | |
sheets_logger = SheetsLogger() | |
# Department mapping from abbreviations to full names | |
DEPARTMENTS = { | |
"Executive Management": "บริหาร ผอ รอง ผู้ช่วย", | |
"Education Support": "สนับสนุนการศึกษา", | |
"Medicine": "MED", | |
"Cardiology": "Cardio", | |
"Gastroenterology": "GI", | |
"Medical Oncology": "Onco MED", | |
"Hematology": "Hematology", | |
"Operating Room": "OR", | |
"Surgery": "Sx", | |
"Orthopedics": "Ortho", | |
"Obstetrics and Gynecology": "OBgyne", | |
"Ophthalmology": "Oph", | |
"Ear, Nose, and Throat": "ENT", | |
"Anesthesiology": "Anes", | |
"Emergency Medicine & EMS": "ER and EMS", | |
"Pediatrics": "PED", | |
"Family Medicine & Preventive Medicine": "GP Fammed preventive med", | |
"Psychiatry": "Psych", | |
"Physical Medicine & Rehabilitation": "PM&R Physiotherapy", | |
"Pathology": "Patho", | |
"Radiology": "Xray", | |
"Radiation Oncology": "Onco radiology", | |
"Cyclotron": "Cyclotron", | |
"Inpatient Department": "IPD", | |
"Outpatient Department": "OPD", | |
"Pharmacy": "Pharmacy", | |
"Dentistry": "dentistry", | |
"Nutrition": "Nutrition", | |
"Medical Records": "เวชระเบียน", | |
"Finance": "การเงิน", | |
"Other": "Other" | |
} | |
# Frequency options | |
FREQUENCIES = ["One-time request", "Weekly", "Monthly"] | |
# Urgency options | |
URGENCY = ["Within a week", "Within a month", "Within a year"] | |
# Example requests | |
EXAMPLE_REQUESTS = """ | |
### Example 1: Clinical Data Request | |
I need OPD patient statistics for the Cardiology department from January to June 2024, including daily patient volume, types of cardiac conditions (ICD-10 codes), average waiting times, and number of follow-up vs. new cases. This data will be used for department capacity planning and resource allocation. | |
### Example 2: Quality Improvement Request | |
Requesting waiting time analysis for all OPD clinics for Q1 2024, including: | |
- Registration to first nurse contact time | |
- Nurse station to doctor examination time | |
- Doctor examination duration | |
- Time at pharmacy | |
- Total visit duration | |
Break down by day of week and time slots (morning/afternoon). This data will help identify service bottlenecks. | |
### Example 3: Department Performance Analysis | |
Need Emergency Department performance data for March 2024: | |
- Daily patient volume by triage level | |
- Door-to-doctor times | |
- Length of stay in ED | |
- Admission rates | |
- Transfer rates to other departments | |
Purpose: Monthly performance review and staff allocation planning. | |
""" | |
def format_user_summary(analysis_result): | |
"""Format analysis result into user-friendly summary""" | |
available = analysis_result.get("data_availability", {}).get("available_reports", []) | |
data_lake = analysis_result.get("data_lake_requirements", {}).get("reports_needed", []) | |
unavailable = analysis_result.get("unavailable_data", []) | |
interpretation = analysis_result.get("request_analysis", {}).get("interpretation", "") | |
summary = [ | |
"### Summary of Your Request", | |
f"**What you need**: {interpretation}\n", | |
"\n**Data Availability Status:**\n" | |
] | |
if available: | |
summary.append("✅ **Available in Web Data System:**") | |
for report in available: | |
summary.append(f"- {report['name']}") | |
summary.append(f"\nEstimated processing time: 3 working days\n") | |
if data_lake: | |
summary.append("🔄 **Requires Additional Database Query:**") | |
for report in data_lake: | |
summary.append(f"- {report['report_type']}") | |
summary.append(f"\nEstimated processing time: 2 weeks\n") | |
if unavailable: | |
summary.append("❌ **Data Not Currently Available:**") | |
for item in unavailable: | |
summary.append(f"- {item['report_type']}") | |
summary.append("\nRecommendation: Schedule a meeting to discuss alternative data sources or solutions\n") | |
return "\n".join(summary) | |
def process_request(name, employee_id, email, department, other_dept, request_details, frequency, urgency): | |
# Validate inputs | |
if not all([name, employee_id, email, request_details]): | |
return "Please fill in all required fields.", None | |
# Combine department info | |
final_department = other_dept if department == "Other" else department | |
try: | |
# Process the request through GPT | |
result = service.assess_request(request_details) | |
# Create user-friendly summary | |
user_summary = format_user_summary(result) | |
# Prepare data for logging | |
sheet_data = { | |
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), | |
"name": name, | |
"employee_id": employee_id, | |
"email": email, | |
"department": final_department, | |
"request_details": request_details, | |
"frequency": frequency, | |
"urgency": urgency, | |
"user_summary": user_summary, | |
"system_analysis": json.dumps(result, ensure_ascii=False) | |
} | |
# Log to Google Sheets | |
sheets_logger.log_request(sheet_data) | |
return user_summary, result | |
except Exception as e: | |
error_message = f"Error processing request: {str(e)}" | |
return error_message, None | |
# Create Gradio interface | |
with gr.Blocks() as demo: | |
gr.Markdown("# Hospital Data Request System") | |
gr.Markdown("Please fill in the following information to request data access.") | |
with gr.Row(): | |
with gr.Column(): | |
name = gr.Textbox( | |
label="Full Name*", | |
placeholder="Enter your full name" | |
) | |
employee_id = gr.Textbox( | |
label="Employee ID*", | |
placeholder="Enter your employee ID" | |
) | |
email = gr.Textbox( | |
label="Email*", | |
placeholder="Enter your email for contact" | |
) | |
with gr.Row(): | |
with gr.Column(): | |
department = gr.Dropdown( | |
choices=list(DEPARTMENTS.keys()), | |
label="Department*", | |
info="Select your department" | |
) | |
other_dept = gr.Textbox( | |
label="Other Department", | |
placeholder="Specify your department if not in the list", | |
visible=False | |
) | |
department.change( | |
fn=lambda x: gr.update(visible=x=="Other"), | |
inputs=[department], | |
outputs=[other_dept] | |
) | |
with gr.Accordion("📝 Click here to see example requests", open=False): | |
gr.Markdown(EXAMPLE_REQUESTS) | |
with gr.Row(): | |
request_details = gr.Textbox( | |
label="Request Details*", | |
placeholder="Please describe in detail what data you need, including time period, specific parameters, etc.", | |
lines=5 | |
) | |
with gr.Row(): | |
with gr.Column(): | |
frequency = gr.Dropdown( | |
choices=FREQUENCIES, | |
label="Request Frequency*" | |
) | |
urgency = gr.Dropdown( | |
choices=URGENCY, | |
label="Urgency Level*" | |
) | |
submit_btn = gr.Button("Submit Request") | |
with gr.Row(): | |
user_output = gr.Markdown(label="Request Summary") | |
with gr.Accordion("Technical Analysis (For Data Team)", open=False): | |
tech_output = gr.JSON() | |
submit_btn.click( | |
fn=process_request, | |
inputs=[name, employee_id, email, department, other_dept, | |
request_details, frequency, urgency], | |
outputs=[user_output, tech_output] | |
) | |
gr.Markdown(""" | |
### Notes: | |
- Fields marked with * are required | |
- Please provide detailed information about the data you need | |
- Include specific time periods and parameters | |
- Clearly state the purpose of your request | |
- All communications will be sent to the provided email | |
""") | |
if __name__ == "__main__": | |
demo.launch() |