Spaces:
Runtime error
Runtime error
import gradio as gr | |
import requests | |
import os | |
import json | |
import random | |
from elo import update_elo_ratings # Custom function for ELO ratings | |
# Load the chatbot URLs and their respective model names from a JSON file | |
with open('chatbot_urls.json', 'r') as file: | |
chatbots = json.load(file) | |
# Thread-local storage for user-specific data | |
# Initialize or get user-specific ELO ratings | |
def get_user_elo_ratings(state): | |
return state['elo_ratings'] | |
# Read ELO ratings from file (thread-safe) | |
def read_elo_ratings(): | |
try: | |
with open('elo_ratings.json', 'r') as file: | |
elo_ratings = json.load(file) | |
except FileNotFoundError: | |
elo_ratings = {model: 1200 for model in chatbots.keys()} | |
return elo_ratings | |
# Write ELO ratings to file (thread-safe) | |
def write_elo_ratings(elo_ratings): | |
with open('elo_ratings.json', 'w') as file: | |
json.dump(elo_ratings, file, indent=4) | |
def get_bot_response(url, prompt): | |
payload = { | |
"input": { | |
"prompt": prompt, | |
"sampling_params": { | |
"max_new_tokens": 16, | |
"temperature": 0.7, | |
} | |
} | |
} | |
headers = { | |
"accept": "application/json", | |
"content-type": "application/json", | |
"authorization": os.environ.get("RUNPOD_TOKEN") | |
} | |
response = requests.post(url, json=payload, headers=headers) | |
return response.json()['output'][0]['generated_text'].replace(prompt,"") | |
def chat_with_bots(user_input, state): | |
bot_names = list(chatbots.keys()) | |
random.shuffle(bot_names) | |
bot1_url, bot2_url = chatbots[bot_names[0]], chatbots[bot_names[1]] | |
# Update the state with the names of the last bots | |
state.update({'last_bots': [bot_names[0], bot_names[1]]}) | |
bot1_response = get_bot_response(bot1_url, user_input) | |
bot2_response = get_bot_response(bot2_url, user_input) | |
return bot1_response, bot2_response | |
def update_ratings(state, winner_index): | |
elo_ratings = get_user_elo_ratings() | |
bot_names = list(chatbots.keys()) | |
winner = state['last_bots'][winner_index] | |
loser = state['last_bots'][1 - winner_index] | |
elo_ratings = update_elo_ratings(elo_ratings, winner, loser) | |
write_elo_ratings(elo_ratings) | |
return f"Updated ELO ratings:\n{winner}: {elo_ratings[winner]}\n{loser}: {elo_ratings[loser]}" | |
def vote_up_model(state, chatbot): | |
update_message = update_ratings(state, 0) | |
chatbot.append(update_message) | |
return chatbot | |
def vote_down_model(state, chatbot): | |
update_message = update_ratings(state, 1) | |
chatbot.append(update_message) | |
return chatbot | |
def user_ask(state, chatbot1, chatbot2, textbox): | |
user_input = textbox | |
bot1_response, bot2_response = chat_with_bots(user_input, state) | |
chatbot1.append("User: " + user_input) | |
chatbot1.append("Bot 1: " + bot1_response) | |
chatbot2.append("User: " + user_input) | |
chatbot2.append("Bot 2: " + bot2_response) | |
# Enable voting buttons | |
global upvote_btn_a,upvote_btn_b | |
upvote_btn_a.interactive = True | |
upvote_btn_b.interactive = True | |
updated_elo_ratings = get_user_elo_ratings(state) | |
state.update({'elo_ratings': updated_elo_ratings}) | |
return state, chatbot1, chatbot2 | |
# ... [Rest of your existing functions] ... | |
with gr.Blocks() as demo: | |
state = gr.State({}) | |
state.update({"elo_ratings":read_elo_ratings}) | |
with gr.Row(): | |
# First column for Model A | |
with gr.Column(): | |
chatbot1 = gr.Chatbot(label='Model A') | |
upvote_btn_a = gr.Button(value="π Upvote A", interactive=False) | |
# Second column for Model B | |
with gr.Column(): | |
chatbot2 = gr.Chatbot(label='Model B') | |
upvote_btn_b = gr.Button(value="π Upvote B", interactive=False) | |
# Textbox and submit button at the bottom | |
textbox = gr.Textbox(placeholder="Enter your prompt and press ENTER") | |
submit_btn = gr.Button(value="Send") | |
# Interaction logic | |
textbox.submit(user_ask, inputs=[state, chatbot1, chatbot2, textbox], outputs=[state, chatbot1, chatbot2]) | |
submit_btn.click(user_ask, inputs=[state, chatbot1, chatbot2, textbox], outputs=[state, chatbot1, chatbot2]) | |
upvote_btn_a.click(vote_up_model, inputs=[state, chatbot1], outputs=[chatbot1]) | |
upvote_btn_b.click(vote_up_model, inputs=[state, chatbot2], outputs=[chatbot2]) | |
# Start the interface | |
demo.launch() |