File size: 5,239 Bytes
a5b48a7
 
 
 
0b9c45d
a5b48a7
c003b8d
a5b48a7
5b3f957
a5b48a7
 
 
0b9c45d
65b4ef2
0db6418
0b9c45d
5b3f957
a5b48a7
65b4ef2
 
5b3f957
65b4ef2
5b3f957
 
a5b48a7
65b4ef2
 
a5b48a7
5b3f957
5b6eec5
 
0db6418
21e2ad0
 
 
 
 
5b6eec5
 
4d15f04
5b6eec5
7178e21
 
5b6eec5
7178e21
5a3a71e
7178e21
3b6bdd2
7178e21
 
 
 
 
 
 
 
 
5b6eec5
66afc6f
3421166
0b9c45d
 
 
3421166
 
cae39d8
3421166
4d15f04
 
a5b48a7
 
 
66afc6f
0b9c45d
5c13efa
0db6418
 
5c13efa
 
a5b48a7
66afc6f
 
 
 
 
 
 
 
 
 
 
5b3f957
41b12a8
ffef722
5b3f957
 
0b25d1f
5b3f957
 
360577c
ea9303b
a1465ab
a2df623
5b3f957
 
0b25d1f
5b3f957
 
73006db
033caa5
5b3f957
 
 
25a4d3c
 
0b25d1f
5b3f957
 
cf47250
5b3f957
66afc6f
41b12a8
0b25d1f
5b3f957
0b25d1f
 
5b3f957
0b25d1f
 
9c0fae5
41b12a8
85c68a8
 
9c0fae5
41b12a8
0b25d1f
5b3f957
0b25d1f
85c68a8
41b12a8
 
0b25d1f
5b3f957
85c68a8
0b25d1f
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
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)

# Initialize or get user-specific ELO ratings
def get_user_elo_ratings(state):
    return state['elo_ratings']

# Read and write ELO ratings to file (thread-safe)
def read_elo_ratings():
    try:
        with open('elo_ratings.json', 'r') as file:
            return json.load(file)
    except FileNotFoundError:
        return {model: 1200 for model in chatbots.keys()}

def write_elo_ratings(elo_ratings):
    with open('elo_ratings.json', 'w') as file:
        json.dump(elo_ratings, file, indent=4)

# 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."
    for message in state["history"]:
        j=""
        if message['role']=='user':
            j="### Instruction:\n"
        else:
            j="### Response:\n"
        alpaca_prompt += j+ message['content']+"\n\n"
    return alpaca_prompt+"### Response:\n"
def get_bot_response(url, prompt,state):
    alpaca_prompt = format_alpaca_prompt(state)
    payload = {
        "input": {
            "prompt": alpaca+prompt,
            "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):
    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,state)
    bot2_response = get_bot_response(bot2_url, user_input,state)

    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):
    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"] = read_elo_ratings()
    if "history" not in state:
        state.update({'history': []})
    state["history"].extend([
        {"role": "user", "content": user_input}])
    # Chat with bots
    bot1_response, bot2_response = chat_with_bots(user_input, state)

    # Update chat history in state
    if "history" not in state:
        state.update({'history': []})
    state["history"].append([
        {"role": "bot1", "content": bot1_response},
        {"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

# Gradio interface setup
with gr.Blocks() as demo:
    state = gr.State({})

    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)
    submit_btn = gr.Button(value="Send")

    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], outputs=[chatbot1])
    upvote_btn_b.click(vote_down_model, inputs=[state, chatbot2], outputs=[chatbot2])

    demo.launch()