Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
import json | |
import pandas as pd | |
from data_service import DataAssessmentService | |
from datetime import datetime | |
import gspread | |
from oauth2client.service_account import ServiceAccountCredentials | |
from sheets_integration import SheetsLogger | |
# Initialize services | |
service = DataAssessmentService(api_key=os.environ.get("OPENAI_API_KEY")) | |
sheets_logger = SheetsLogger() | |
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. | |
""" | |
# 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"] | |
def save_to_sheet(data): | |
"""Save request data to Google Sheet""" | |
# TODO: Implement Google Sheets integration | |
pass | |
def process_request(name, employee_id, email, department, other_dept, request_details, frequency, urgency): | |
# Combine department info | |
final_department = other_dept if department == "Other" else department | |
# Process the request through GPT | |
result = service.assess_request(request_details) | |
# Prepare data for logging | |
request_data = { | |
"name": name, | |
"employee_id": employee_id, | |
"email": email, | |
"department": final_department, | |
"request_details": request_details, | |
"frequency": frequency, | |
"urgency": urgency, | |
"system_response": json.dumps(result, ensure_ascii=False) | |
} | |
# Log to Google Sheets | |
sheets_logger.log_request(request_data) | |
return result | |
# 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()) + ["Other"], | |
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] | |
) | |
# Add collapsible examples section | |
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", | |
info="How often do you need this data?" | |
) | |
urgency = gr.Dropdown( | |
choices=URGENCY, | |
label="Urgency Level", | |
info="How urgent is your request?" | |
) | |
submit_btn = gr.Button("Submit Request") | |
output = gr.JSON(label="Analysis Result") | |
submit_btn.click( | |
fn=process_request, | |
inputs=[name, employee_id, email, department, other_dept, | |
request_details, frequency, urgency], | |
outputs=[output] | |
) | |
gr.Markdown(""" | |
### Notes: | |
- 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() |