tb_tst_ai / app.py
Daniil
Updating emails
3672495
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"<h1 style='text-align: center;'>Welcome to the TB Chatbot Evaluation</h1>", 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.
""")