File size: 6,493 Bytes
116bc60
0819278
 
 
c865db2
0819278
116bc60
 
 
 
 
 
c865db2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116bc60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80dc7be
116bc60
 
80dc7be
116bc60
 
 
0819278
 
116bc60
 
 
 
 
 
0819278
 
c865db2
 
0819278
c865db2
 
 
 
 
 
 
 
 
 
 
 
 
 
0819278
116bc60
c865db2
0819278
80dc7be
116bc60
0819278
 
 
 
 
c865db2
 
 
 
0819278
116bc60
 
 
0819278
c865db2
0819278
c865db2
0819278
116bc60
0819278
 
116bc60
0819278
116bc60
c865db2
0819278
116bc60
80dc7be
0819278
c865db2
0819278
c865db2
0819278
 
c865db2
0819278
 
116bc60
 
0819278
116bc60
 
 
 
80dc7be
116bc60
0819278
 
c865db2
 
80dc7be
0819278
116bc60
c865db2
 
0819278
116bc60
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
import os
import gradio as gr
import pandas as pd
import requests
from urllib.parse import quote

leaderboard_url = os.getenv("LEADERBOARD_URL", "https://leaderboard.nexa4ai.com")

get_ranking_url = f"{leaderboard_url}/model/get-ranking-by-category"
get_models_url = f"{leaderboard_url}/model/get-models-by-category"
vote_url = f"{leaderboard_url}/model/vote"
submit_models_url = f"{leaderboard_url}/model/submit-models"
submit_category_url = f"{leaderboard_url}/model/submit-category"

def make_clickable_model(model_id):
    model_name_show = ' '.join(model_id.split('/')[1:])
    link = "https://huggingface.co/" + model_id
    return f'<a target="_blank" href="{link}" style="color: var(--link-text-color); text-decoration: underline;text-decoration-style: dotted;">{model_name_show}</a>'

def update_table(category):
    retries = 3
    while retries > 0:
        try:
            encoded_category = quote(category)
            url_with_params = f"{get_ranking_url}?category={encoded_category}"
            response = requests.get(url_with_params)
            if response.status_code == 200:
                ranking_data = response.json()["ranking"]
                api_model_data = {
                    "Model": [make_clickable_model(item["model_id"]) for item in ranking_data],
                    "Votes": [item["votes"] for item in ranking_data],
                    "Categories": [item["categories"] for item in ranking_data] if category == "all" else [category] * len(ranking_data)
                }
                api_df = pd.DataFrame(api_model_data)
                return api_df
            else:
                print(f"Failed to submit request: {response.text}")
                retries -= 1
        except requests.exceptions.RequestException as e:
            print(f"Error occurred while making request: {e}")
            retries -= 1
    return pd.DataFrame()


def get_vote_models(category):
    if not category:
        return []

    url_with_params = f"{get_models_url}?category={category}" 

    response = requests.get(url_with_params)

    if response.status_code == 200:
        models_data = response.json()
        return gr.CheckboxGroup(choices=models_data, label="Choose your options", interactive=True)
    else:
        print(f"Failed to get models: {response.text}")
        return []


def submit_vote(category, models):
    if not category or not models:
        return "All fields are required!"

    data = {
        "category": category,
        "model_ids": models
    }
    
    response = requests.post(vote_url, json=data)
    
    if response.status_code == 200:
        return f"Vote '{models}' submitted successfully!"
    else:
        return f"Failed to vote: {response.text}"


def submit_model(category, customize_category, model_id):
    if not model_id:
        return "All fields are required!"
    if not category or not customize_category:
        return "Please choose a category or customize your own category!"

    selected_category = category

    if customize_category:
        category_data = {
            "category": customize_category
        }
        response = requests.post(submit_category_url, json=category_data)
        if response.status_code != 200:
            return f"Failed to submit category: {response.text}"
        selected_category = customize_category

    data = {
        "model_id": model_id,
        "categories": [selected_category]
    }

    response = requests.post(submit_models_url, json=data)
    if response.status_code == 200:
        return "Your request has been submitted successfully. We will notify you by email once processing is complete."
    else:
        return f"Failed to submit request: {response.text}"

def update_dropdown(customize_category, category):
    if customize_category:  
        return "", gr.update(value="") 
    return category, gr.update() 

theme = gr.themes.Soft()

with gr.Blocks(theme=theme) as app:
    with gr.Tabs():
        with gr.TabItem("Table"):       
            category = gr.Dropdown(
                choices=["all", "Art & Design", "Biology", "Physics", "Business", "Chemistry", "Economics", "Philosophy", "History", "Culture", "Computer Science", "Math", "Education", "Health", "Law", "Engineering", "Coding", "Science", "Other"],
                label="Select Category",
                value="all"
            )
            
            initial_data = update_table("all")
            table = gr.Dataframe(
                headers=["Model", "Votes", "Categories"],
                datatype=["markdown", "number", "str"],
                value=initial_data,
                col_count=(3, "fixed"),
                height=600
            )
            app.load(lambda: update_table("all"), outputs=table)
            category.change(update_table, inputs=category, outputs=table)
   
        with gr.TabItem("Vote"):
            category = gr.Dropdown(
                choices=["Art & Design", "Biology", "Physics", "Business", "Chemistry", "Economics", "Philosophy", "History", "Culture", "Computer Science", "Math", "Education", "Health", "Law", "Engineering", "Coding", "Science", "Other"], 
                label="Select Category"
            )

            cbg = gr.CheckboxGroup(choices=[], label="Choose your options",interactive=True)
            submit_button = gr.Button("Submit Vote")
            submit_result = gr.Markdown()

            category.change(get_vote_models, inputs=category, outputs=cbg) 

            submit_button.click(fn=submit_vote, inputs=[category, cbg], outputs=submit_result)

        
        with gr.TabItem("Submit Model"):
            category = gr.Dropdown(choices=["Art & Design", "Biology", "Physics", "Business", "Chemistry", "Economics", "Philosophy", "History", "Culture", "Computer Science", "Math", "Education", "Health", "Law", "Engineering", "Coding", "Science", "Other"], label="Select Category")
            customize_category = gr.Textbox(label="Customize category", placeholder="Can't find your category? Enter your own.")
            model_id = gr.Textbox(label="Hub Model ID", placeholder="Submit model id")
            submit_model_button = gr.Button("Submit Model")
            submit_model_result = gr.Markdown()
            customize_category.change(fn=update_dropdown, inputs=[customize_category, category], outputs=[category])
            submit_model_button.click(fn=submit_model, inputs=[category, customize_category, model_id], outputs=submit_model_result)

app.launch(share=True)