Spaces:
Runtime error
Runtime error
File size: 8,585 Bytes
a5b48a7 ade1d2c a5b48a7 0b9c45d a5b48a7 c003b8d a5b48a7 5b3f957 a5b48a7 1823a15 e9bb75c 7d3d77d 45dd2d8 7d3d77d a272cb9 7d3d77d 0eb4a58 7d3d77d c99b95e 7d3d77d a272cb9 c99b95e 6a93857 895d918 5b3f957 5b6eec5 3c0c20b 0f925b8 3c0c20b 5b6eec5 7178e21 3c0c20b 7178e21 5a3a71e 7178e21 3b6bdd2 7178e21 5b6eec5 66afc6f 3421166 e9bb75c 3421166 e9bb75c 3421166 e9bb75c a5b48a7 66afc6f 7d3d77d 5c13efa 0db6418 5c13efa c99b95e fa1169f 66afc6f 4c3c8bf 66afc6f fa1169f 1b8f04a 4c3c8bf fa1169f 1b8f04a 66afc6f 5b3f957 41b12a8 ffef722 5b3f957 0b25d1f 5b3f957 7d3d77d 360577c 6eb3c68 a2df623 5b3f957 6eb3c68 5b3f957 6eb3c68 25a4d3c 0b25d1f 5b3f957 cf47250 5b3f957 66afc6f 41b12a8 dad0315 0d45e75 dad0315 0d45e75 c31f1de 0d45e75 c31f1de 0d45e75 dad0315 0d45e75 dad0315 0b25d1f 0d45e75 e5f7a31 5b3f957 0b25d1f f1d1dd8 a44076e f1d1dd8 1b8f04a f1d1dd8 5ee7013 f1d1dd8 e5f7a31 f1d1dd8 ca86104 6c9a789 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
import gradio as gr
import requests
import os
#
import json
import random
from elo import update_elo_ratings # Custom function for ELO ratings
enable_btn = gr.Button.update(interactive=True)
# Load chatbot URLs and model names from a JSON file
with open('chatbot_urls.json', 'r') as file:
chatbots = json.load(file)
def clear_chat(state):
# Reset state including the chatbot order
state = {} if state is not None else state
# Shuffle and reinitialize chatbots in the state
bot_names = list(chatbots.keys())
random.shuffle(bot_names)
state['last_bots'] = [bot_names[0], bot_names[1]]
# Reset other components
return state, None, None, gr.Button.update(interactive=False), gr.Button.update(interactive=False), gr.Textbox.update(interactive=False), gr.Button.update(interactive=False)
from datasets import load_dataset,DatasetDict
import requests
import os
def get_user_elo_ratings():
dataset = load_dataset("rwitz/mistral-elo-ratings",download_mode="force_redownload")
elo_ratings = dataset['train'] # or the relevant split
return elo_ratings
def update_elo_rating(new_rating,winner,loser):
# Fetch the current dataset
elo_ratings = get_user_elo_ratings()
# Function to update the rating of a specific player
# Update the dataset
# Convert updated dataset to a dictionary for pushing
updated_ratings=update_elo_ratings(elo_ratings,winner,loser)
updated_ratings.push_to_hub("rwitz/mistral-elo-ratings",token=os.environ.get("huggingface_token"))
# Function to get bot response
def format_alpaca_prompt(state):
alpaca_prompt = "Below is an instruction that describes a task. Write a response that appropriately completes the request."
alpaca_prompt2 = "Below is an instruction that describes a task. Write a response that appropriately completes the request."
for message in state["history"][0]:
j=""
if message['role']=='user':
j="### Instruction:\n"
else:
j="### Response:\n"
alpaca_prompt += j+ message['content']+"\n\n"
for message in state["history"][1]:
j=""
if message['role']=='user':
j="### Instruction:\n"
else:
j="### Response:\n"
alpaca_prompt2 += j+ message['content']+"\n\n"
return [alpaca_prompt+"### Response:\n",alpaca_prompt2+"### Response:\n"]
def get_bot_response(url, prompt,state,bot_index):
alpaca_prompt = format_alpaca_prompt(state)
payload = {
"input": {
"prompt": alpaca_prompt[bot_index],
"sampling_params": {
"max_new_tokens": 50,
"temperature": 0.7,
"top_p":0.95
}
}
}
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'].split('### Instruction')[0]
def chat_with_bots(user_input, state):
# Use existing bot order from state if available, otherwise shuffle and initialize
if 'last_bots' not in state or not state['last_bots']:
bot_names = list(chatbots.keys())
random.shuffle(bot_names)
state['last_bots'] = [bot_names[0], bot_names[1]]
bot1_url, bot2_url = chatbots[state['last_bots'][0]], chatbots[state['last_bots'][1]]
bot1_response = get_bot_response(bot1_url, user_input, state, 0)
bot2_response = get_bot_response(bot2_url, user_input, state, 1)
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)
update_elo_rating(elo_ratings,winner,loser)
return [('Winner: ',state['last_bots'][winner_index]),('Loser: ',state['last_bots'][1 - winner_index])]
def vote_up_model(state, chatbot,chatbot2):
update_message = update_ratings(state, 0)
chatbot.append(update_message[0])
chatbot2.append(update_message[1])
return chatbot, chatbot2,gr.Button.update(interactive=False),gr.Button.update(interactive=False),gr.Textbox.update(interactive=False),gr.Button.update(interactive=False) # Disable voting buttons
def vote_down_model(state, chatbot,chatbot2):
update_message = update_ratings(state, 1)
chatbot2.append(update_message[0])
chatbot.append(update_message[1])
return chatbot,chatbot2, gr.Button.update(interactive=False),gr.Button.update(interactive=False),gr.Textbox.update(interactive=False),gr.Button.update(interactive=False) # Disable voting buttons
def user_ask(state, chatbot1, chatbot2, textbox):
global enable_btn
user_input = textbox
if len(user_input) > 200:
user_input = user_input[:200] # Limit user input to 200 characters
# Updating state with the current ELO ratings
state["elo_ratings"] = get_user_elo_ratings()
if "history" not in state:
state.update({'history': [[],[]]})
state["history"][0].extend([
{"role": "user", "content": user_input}])
state["history"][1].extend([
{"role": "user", "content": user_input}])
# Chat with bots
bot1_response, bot2_response = chat_with_bots(user_input, state)
state["history"][0].extend([
{"role": "bot1", "content": bot1_response},
])
state["history"][1].extend([
{"role": "bot2", "content": bot2_response},
])
chatbot1.append((user_input,bot1_response))
chatbot2.append((user_input,bot2_response))
# Keep only the last 10 messages in history
state["history"] = state["history"][-10:]
# Format the conversation in ChatML format
return state, chatbot1, chatbot2, textbox,enable_btn,enable_btn
import pandas as pd
# Function to generate leaderboard data
def generate_leaderboard():
elo_ratings_dataset = get_user_elo_ratings() # Returns a Hugging Face dataset
# Convert the Hugging Face dataset to a pandas DataFrame
leaderboard_data = pd.DataFrame(elo_ratings_dataset)
# Rename columns to 'Chatbot' and 'ELO Score'
leaderboard_data.columns = ['Chatbot', 'ELO Score']
# Round the ELO Score to the nearest whole number
leaderboard_data['ELO Score'] = leaderboard_data['ELO Score'].round()
# Sort the DataFrame based on the ELO Score in descending order
leaderboard_data = leaderboard_data.sort_values('ELO Score', ascending=False)
return leaderboard_data
def refresh_leaderboard():
return generate_leaderboard()
# Gradio interface setup
with gr.Blocks() as demo:
state = gr.State({})
with gr.Tab("Chatbot Arena"):
with gr.Row():
with gr.Column():
chatbot1 = gr.Chatbot(label='Model A').style(height=600)
upvote_btn_a = gr.Button(value="👍 Upvote A",interactive=False)
with gr.Column():
chatbot2 = gr.Chatbot(label='Model B').style(height=600)
upvote_btn_b = gr.Button(value="👍 Upvote B",interactive=False)
textbox = gr.Textbox(placeholder="Enter your prompt (up to 200 characters)", max_chars=200)
with gr.Row():
submit_btn = gr.Button(value="Send")
reset_btn = gr.Button(value="Reset")
reset_btn.click(clear_chat, inputs=[state], outputs=[state, chatbot1, chatbot2, upvote_btn_a, upvote_btn_b,textbox,submit_btn])
textbox.submit(user_ask, inputs=[state, chatbot1, chatbot2, textbox], outputs=[state, chatbot1, chatbot2, textbox,upvote_btn_a,upvote_btn_b])
submit_btn.click(user_ask, inputs=[state, chatbot1, chatbot2, textbox], outputs=[state, chatbot1, chatbot2, textbox,upvote_btn_a,upvote_btn_b])
upvote_btn_a.click(vote_up_model, inputs=[state, chatbot1,chatbot2], outputs=[chatbot1,chatbot2,upvote_btn_a,upvote_btn_b,textbox,submit_btn])
upvote_btn_b.click(vote_down_model, inputs=[state, chatbot1,chatbot2], outputs=[chatbot1,chatbot2,upvote_btn_a,upvote_btn_b,textbox,submit_btn])
with gr.Tab("Leaderboard"):
leaderboard = gr.Dataframe(refresh_leaderboard())
refresh_btn = gr.Button("Refresh Leaderboard")
# Function to refresh leaderboard
# Event handler for the refresh button
refresh_btn.click(refresh_leaderboard, inputs=[], outputs=[leaderboard])
# Launch the Gradio interface
if __name__ == "__main__":
demo.launch(share=False)
|