arena / app.py
Kang Suhyun
[#6] Block vote when options are not set (#15)
a089fa0 unverified
raw
history blame
5.18 kB
"""
It provides a platform for comparing the responses of two LLMs.
"""
import enum
import json
import os
from uuid import uuid4
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import gradio as gr
from leaderboard import build_leaderboard
import response
from response import get_responses
# Path to local credentials file, used in local development.
CREDENTIALS_PATH = os.environ.get("CREDENTIALS_PATH")
# Credentials passed as an environment variable, used in deployment.
CREDENTIALS = os.environ.get("CREDENTIALS")
def get_credentials():
# Set credentials using a file in a local environment, if available.
if CREDENTIALS_PATH and os.path.exists(CREDENTIALS_PATH):
return credentials.Certificate(CREDENTIALS_PATH)
# Use environment variable for credentials when the file is not found,
# as credentials should not be public.
json_cred = json.loads(CREDENTIALS)
return credentials.Certificate(json_cred)
# TODO(#21): Fix auto-reload issue related to the initialization of Firebase.
firebase_admin.initialize_app(get_credentials())
db = firestore.client()
SUPPORTED_TRANSLATION_LANGUAGES = [
"Korean", "English", "Chinese", "Japanese", "Spanish", "French"
]
class VoteOptions(enum.Enum):
MODEL_A = "Model A is better"
MODEL_B = "Model B is better"
TIE = "Tie"
def vote(vote_button, response_a, response_b, model_a_name, model_b_name,
user_prompt, instruction, category, source_lang, target_lang):
doc_id = uuid4().hex
winner = VoteOptions(vote_button).name.lower()
deactivated_buttons = [gr.Button(interactive=False) for _ in range(3)]
doc = {
"id": doc_id,
"prompt": user_prompt,
"instruction": instruction,
"model_a": model_a_name,
"model_b": model_b_name,
"model_a_response": response_a,
"model_b_response": response_b,
"winner": winner,
"timestamp": firestore.SERVER_TIMESTAMP
}
if category == response.Category.SUMMARIZE.value:
doc_ref = db.collection("arena-summarizations").document(doc_id)
doc_ref.set(doc)
return deactivated_buttons
if category == response.Category.TRANSLATE.value:
if not source_lang or not target_lang:
raise gr.Error("Please select source and target languages.")
doc_ref = db.collection("arena-translations").document(doc_id)
doc["source_language"] = source_lang.lower()
doc["target_language"] = target_lang.lower()
doc_ref.set(doc)
return deactivated_buttons
raise gr.Error("Please select a response type.")
with gr.Blocks(title="Arena") as app:
with gr.Row():
category_radio = gr.Radio(
[category.value for category in response.Category],
label="Category",
info="The chosen category determines the instruction sent to the LLMs.")
source_language = gr.Dropdown(
choices=SUPPORTED_TRANSLATION_LANGUAGES,
label="Source language",
info="Choose the source language for translation.",
interactive=True,
visible=False)
target_language = gr.Dropdown(
choices=SUPPORTED_TRANSLATION_LANGUAGES,
label="Target language",
info="Choose the target language for translation.",
interactive=True,
visible=False)
def update_language_visibility(category):
visible = category == response.Category.TRANSLATE.value
return {
source_language: gr.Dropdown(visible=visible),
target_language: gr.Dropdown(visible=visible)
}
category_radio.change(update_language_visibility, category_radio,
[source_language, target_language])
model_names = [gr.State(None), gr.State(None)]
response_boxes = [gr.State(None), gr.State(None)]
prompt = gr.TextArea(label="Prompt", lines=4)
submit = gr.Button()
with gr.Row():
response_boxes[0] = gr.Textbox(label="Model A", interactive=False)
response_boxes[1] = gr.Textbox(label="Model B", interactive=False)
# TODO(#5): Display it only after the user submits the prompt.
with gr.Row():
option_a = gr.Button(VoteOptions.MODEL_A.value)
option_b = gr.Button(VoteOptions.MODEL_B.value)
tie = gr.Button(VoteOptions.TIE.value)
# TODO(#7): Hide it until the user votes.
with gr.Accordion("Show models", open=False):
with gr.Row():
model_names[0] = gr.Textbox(label="Model A", interactive=False)
model_names[1] = gr.Textbox(label="Model B", interactive=False)
vote_buttons = [option_a, option_b, tie]
instruction_state = gr.State("")
submit.click(
get_responses, [prompt, category_radio, source_language, target_language],
response_boxes + model_names + vote_buttons + [instruction_state])
common_inputs = response_boxes + model_names + [
prompt, instruction_state, category_radio, source_language,
target_language
]
option_a.click(vote, [option_a] + common_inputs, vote_buttons)
option_b.click(vote, [option_b] + common_inputs, vote_buttons)
tie.click(vote, [tie] + common_inputs, vote_buttons)
build_leaderboard(db)
if __name__ == "__main__":
# We need to enable queue to use generators.
app.queue()
app.launch(debug=True)