import streamlit as st import os import random import importlib.util import firebase_admin from firebase_admin import credentials, firestore import json # Set page configuration as the first command st.set_page_config( page_title="TB Chatbot Evaluation", page_icon="👋", ) PASSCODE = os.environ["MY_PASSCODE"] creds_dict = { "type": os.environ.get("FIREBASE_TYPE", "service_account"), "project_id": os.environ.get("FIREBASE_PROJECT_ID"), "private_key_id": os.environ.get("FIREBASE_PRIVATE_KEY_ID"), "private_key": os.environ.get("FIREBASE_PRIVATE_KEY", "").replace("\\n", "\n"), "client_email": os.environ.get("FIREBASE_CLIENT_EMAIL"), "client_id": os.environ.get("FIREBASE_CLIENT_ID"), "auth_uri": os.environ.get("FIREBASE_AUTH_URI", "https://accounts.google.com/o/oauth2/auth"), "token_uri": os.environ.get("FIREBASE_TOKEN_URI", "https://oauth2.googleapis.com/token"), "auth_provider_x509_cert_url": os.environ.get("FIREBASE_AUTH_PROVIDER_X509_CERT_URL", "https://www.googleapis.com/oauth2/v1/certs"), "client_x509_cert_url": os.environ.get("FIREBASE_CLIENT_X509_CERT_URL"), "universe_domain": "googleapis.com" } # Create a temporary JSON file file_path = "coco-evaluation-firebase-adminsdk-p3m64-99c4ea22c1.json" with open(file_path, 'w') as json_file: json.dump(creds_dict, json_file, indent=2) # Initialize Firebase if not firebase_admin._apps: cred = credentials.Certificate("coco-evaluation-firebase-adminsdk-p3m64-99c4ea22c1.json") firebase_admin.initialize_app(cred) db = firestore.client() # Set passcode for authentication PASSCODE = os.environ["MY_PASSCODE"] # Initialize authentication state if "authenticated" not in st.session_state: st.session_state["authenticated"] = False # Initialize session state variables def init_session_state(): if "authenticated" not in st.session_state: st.session_state["authenticated"] = False if "evaluator_confirmed" not in st.session_state: st.session_state["evaluator_confirmed"] = None if "model_order" not in st.session_state: st.session_state["model_order"] = [] if "current_index" not in st.session_state: st.session_state["current_index"] = 0 if "models_completed" not in st.session_state: st.session_state["models_completed"] = False if "evaluation_status" not in st.session_state or not st.session_state["evaluation_status"]: st.session_state["evaluation_status"] = {} if "all_evaluations" not in st.session_state: st.session_state["all_evaluations"] = {} if "evaluation_ids" not in st.session_state: st.session_state["evaluation_ids"] = {} if "start_time" not in st.session_state: st.session_state["start_time"] = None if "evaluation_durations" not in st.session_state: st.session_state["evaluation_durations"] = {} if "submitted_evaluations" not in st.session_state: st.session_state["submitted_evaluations"] = set() init_session_state() # Display Welcome Page if not st.session_state["authenticated"]: st.markdown(f"

Welcome to the TB Chatbot Evaluation

", unsafe_allow_html=True) col1, col2, col3 = st.columns([2, 1, 1]) with col1: st.write("Are you an evaluator?") with col2: if st.button("Yes"): st.session_state["evaluator_confirmed"] = True with col3: if st.button("No"): st.session_state["evaluator_confirmed"] = False if st.session_state["evaluator_confirmed"]: evaluator_id = st.text_input("Enter your Evaluator ID (can be anything)") passcode = st.text_input("Enter Passcode to Access Models (password is the same)", type="password") if st.button("Submit"): print("Hello") if passcode == PASSCODE and evaluator_id: print("Submitted") # Save Evaluator ID db.collection("evaluator_ids").document(evaluator_id).set({ "evaluator_id": evaluator_id, "timestamp": firestore.SERVER_TIMESTAMP }) # Update session state st.session_state["authenticated"] = True st.session_state["evaluator_id"] = evaluator_id # Show the main content only if authenticated if st.session_state["authenticated"]: # Sidebar with only randomized page navigation with st.sidebar: # Only create the page mapping if it doesn't already exist in the session state if "page_mapping" not in st.session_state: # Get list of page files and randomize their order PAGES_DIR = "pages" page_files = [f for f in os.listdir(PAGES_DIR) if f.endswith(".py")] random.shuffle(page_files) # Create generic names for display generic_names = [f"Model {chr(65 + i)}" for i in range(len(page_files))] # Create a dictionary to map display names to file paths st.session_state["page_mapping"] = { generic_name: os.path.join(PAGES_DIR, page_file) for generic_name, page_file in zip(generic_names, page_files) } # Retrieve the consistent mapping from session state pages = st.session_state["page_mapping"] # Sidebar navigation selectbox with generic labels selected_generic_name = st.selectbox("Navigation", list(pages.keys()), label_visibility="collapsed") # Load and run the selected page dynamically using the selected generic name selected_page_path = pages[selected_generic_name] spec = importlib.util.spec_from_file_location(selected_generic_name, selected_page_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) # Display main welcome message st.markdown(""" # Welcome to the TB Chatbot Simulation Portal This portal allows you to interact with our TB-powered chatbot, built using OpenAI's GPT-4. Here, you can evaluate multiple chatbot configurations, each designed to foster trust, empathy, and medical accuracy in responses. ## Purpose Your task is to assess the chatbot models by interacting with them using patient scenario-based questions. Evaluate each model based on the following principles: ### Trust - Does the response convey confidence and reliability? - Are the answers factually accurate and rooted in medical expertise? ### Medical Accuracy - Are responses aligned with current medical guidelines and best practices? - Do they avoid misinformation or potentially harmful suggestions? ### Empathy - Does the chatbot demonstrate understanding and compassion? - Are responses emotionally sensitive and supportive? Your feedback will help us identify the best model to support our mission of enhancing patient communication and care through AI-driven solutions. """)