arena_hw_tester / app.py
lisabdunlap's picture
Update app.py
4a2140f verified
import json
import re
import argparse
import gradio as gr
# Load the JSONL file
def load_jsonl(file_path):
data = []
with open(file_path, 'r') as f:
for line in f:
data.append(json.loads(line))
return data
def display_pairwise_answer(data):
chat_mds = pairwise_to_gradio_chat_mds(data)
return chat_mds
newline_pattern1 = re.compile("\n\n(\d+\. )")
newline_pattern2 = re.compile("\n\n(- )")
def post_process_answer(x):
return x
def pairwise_to_gradio_chat_mds(data):
end = data["turn"] * 3
ans_a = data["conversation_a"]
ans_b = data["conversation_b"]
mds = [""] * end
base = 0
for i in range(0, end, 3):
mds[i] = "## User Prompt\n" + data["conversation_a"][base]["content"].strip()
mds[i + 1] = f"## {data['model_a']}\n" + post_process_answer(ans_a[base + 1]["content"].strip())
mds[i + 2] = f"## {data['model_b']}\n" + post_process_answer(ans_b[base + 1]["content"].strip())
base += 2
if data["winner"] == "tie":
winner = "tie"
elif data["winner"] == "model_a":
winner = "gemini" if "gemini" in data["model_a"] else "opponent"
else:
winner = "gemini" if "gemini" in data["model_b"] else "opponent"
mds += [f"## Winner: {winner}"]
mds += [""] * (16 - len(mds))
return mds
# Filtering functions
def filter_by_language(language):
return [item for item in data if item['language'] == language]
def filter_by_winner(winner_model, filtered_data):
if winner_model == "anyone":
return [item for item in filtered_data]
return [item for item in filtered_data if item['winner'] == winner_model]
def filter_by_conversation_a_prefix(prefix, filtered_data):
return [item for item in filtered_data if item['conversation_a'][0]["content"][:128] == prefix]
# Create Gradio interface
def update_winner_and_questions(language):
filtered_data = filter_by_language(language)
winners = ["anyone"] + sorted(set(item['winner'] for item in filtered_data))
prefixes = [item['conversation_a'][0]["content"][:128] for item in filtered_data]
return gr.update(choices=winners, value=winners[0]), gr.update(choices=prefixes, value=prefixes[0])
def update_question_options(language, winner_model):
filtered_data = filter_by_language(language)
filtered_data = filter_by_winner(winner_model, filtered_data)
prefixes = [item['conversation_a'][0]["content"][:128] for item in filtered_data]
return gr.update(choices=prefixes, value=prefixes[0])
def display_filtered_data(language, winner_model, prefix):
filtered_data = filter_by_language(language)
filtered_data = filter_by_winner(winner_model, filtered_data)
filtered_data = filter_by_conversation_a_prefix(prefix, filtered_data)
if len(filtered_data) == 0:
return [""] * 16
return pairwise_to_gradio_chat_mds(filtered_data[0])
def next_question(language, winner_model, prefix):
filtered_data = filter_by_language(language)
filtered_data = filter_by_winner(winner_model, filtered_data)
all_items = [item['conversation_a'][0]["content"][:128] for item in filtered_data]
if prefix:
i = all_items.index(prefix) + 1
else:
i = 0
if i >= len(all_items):
return gr.update(choices=all_items, value=all_items[-1])
return gr.update(choices=all_items, value=all_items[i])
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--host", type=str, default="0.0.0.0")
parser.add_argument("--port", type=int)
parser.add_argument("--share", action="store_true")
args = parser.parse_args()
data = load_jsonl('gemini_battles.jsonl')
default_lang = "English"
filter_data = filter_by_language(language=default_lang)
question_prefixes = [item['conversation_a'][0]["content"][:128] for item in filter_data]
default_question = question_prefixes[2]
with gr.Blocks() as demo:
gr.Markdown(value="# Welcome to gemini-1.5-pro-api-0514 battles")
with gr.Row():
with gr.Column():
languages = ["English"] + list(sorted(set([item['language'] for item in data if item['language'] != "English"])))
language_dropdown = gr.Dropdown(label="Select Language", choices=languages, value=default_lang)
with gr.Column():
winners = ["anyone"] + sorted(set(item['winner'] for item in filter_data))
winner_dropdown = gr.Dropdown(label="Winner Model", choices=winners, value="anyone")
with gr.Row():
with gr.Column(scale=5):
question_dropdown = gr.Dropdown(label="Select Question", choices=question_prefixes, value=default_question)
with gr.Column():
next_button = gr.Button("Next Question")
default_chat_mds = display_filtered_data(default_lang, "anyone", default_question)
chat_mds = []
for i in range(5):
chat_mds.append(gr.Markdown(elem_id=f"user_question_{i+1}", value=default_chat_mds[len(chat_mds)]))
with gr.Row():
for j in range(2):
with gr.Column(scale=100):
chat_mds.append(gr.Markdown(value=default_chat_mds[len(chat_mds)]))
if j == 0:
with gr.Column(scale=1, min_width=8):
gr.Markdown()
chat_mds.append(gr.Markdown())
language_dropdown.change(fn=update_winner_and_questions, inputs=language_dropdown, outputs=[winner_dropdown, question_dropdown])
winner_dropdown.change(fn=update_question_options, inputs=[language_dropdown, winner_dropdown], outputs=question_dropdown)
next_button.click(fn=next_question, inputs=[language_dropdown, winner_dropdown, question_dropdown], outputs=question_dropdown)
question_dropdown.change(fn=display_filtered_data, inputs=[language_dropdown, winner_dropdown, question_dropdown], outputs=chat_mds)
demo.launch(share=args.share)