Spaces:
Running
Running
""" | |
Usage: | |
python3 qa_browser.py --share | |
""" | |
# import argparse | |
from collections import defaultdict | |
import re | |
import gradio as gr | |
import json | |
MAX_py_file_paths_depth = 3 | |
py_file_paths = {} | |
comment = {"title2comment": {}, "path2comment": {}} | |
model_judgments_normal = {} | |
model_judgments_math = {} | |
def load_py_file_paths(data_path): | |
global py_file_paths | |
py_file_paths = [] | |
with open(data_path, "r") as f: | |
py_file_paths = f.readlines() | |
py_file_paths = [json.loads(line) for line in py_file_paths] | |
py_file_paths = {line["path"]: line['content'] for line in py_file_paths} | |
return py_file_paths | |
def load_comment(data_path): | |
global comment | |
comment = {"title2comment": {}, "path2comment": {}} | |
title2comment = {} | |
path2comment = {} | |
with open(data_path, "r") as f: | |
data_f = f.readlines() | |
data_f = [json.loads(line) for line in data_f] | |
for line in data_f: | |
title2comment[line["title"]] = line | |
path2comment[line["class_link"]] = line | |
comment["title2comment"] = title2comment | |
comment["path2comment"] = path2comment | |
return comment | |
def display_question(question_selector,file_path_selector, request: gr.Request): | |
if question_selector == None: | |
return [gr.Dropdown.update( | |
value=file_path_selector | |
)] + [""] * 4 | |
choice = comment['title2comment'][question_selector]['class_link'].split("#")[0] | |
lines = comment['title2comment'][question_selector]['class_link'].split("#")[1].replace("L","") | |
question = comment['title2comment'][question_selector]['comment'] | |
code_path = choice | |
test_path = comment['title2comment'][question_selector]['test_file_path'] | |
highlight_lines = [int(line) for line in lines.split("-")] | |
class_link = comment['title2comment'][question_selector]['class_link'] | |
question_mds,code_mds = to_gradio_chat_mds(question, code_path, highlight_lines, class_link, test_path) | |
return [gr.Dropdown.update( | |
value=choice | |
)] + question_mds + code_mds | |
def display_answer(question_selector,file_path_selector, request: gr.Request): | |
choice = comment['title2comment'][question_selector]['class_link'].split("#")[0] | |
lines = comment['title2comment'][question_selector]['class_link'].split("#")[1].replace("L","") | |
question = comment['title2comment'][question_selector]['comment'] | |
code_path = choice | |
test_path = comment['title2comment'][question_selector]['test_file_path'] | |
highlight_lines = [int(line) for line in lines.split("-")] | |
class_link = comment['title2comment'][question_selector]['class_link'] | |
if comment['title2comment'][question_selector]['class_link'].split("#")[0] != file_path_selector: | |
highlight_lines = None | |
class_link = None | |
test_path = None | |
code_path = file_path_selector | |
question_mds,code_mds = to_gradio_chat_mds(question, code_path, highlight_lines, class_link, test_path) | |
return code_mds | |
# def display_answer( | |
# file_path_selector, request: gr.Request | |
# ): | |
# # if comment['title2comment'][question_selector]['class_link'].split("#")[0] == file_path_selector: | |
# # choice = question_selector | |
# # else: | |
# # choice = None | |
# code_path = file_path_selector | |
# question = "" | |
# highlight_lines = None | |
# question_mds,code_mds = to_gradio_chat_mds(question, code_path, highlight_lines) | |
# return code_mds | |
newline_pattern1 = re.compile("\n\n(\d+\. )") | |
newline_pattern2 = re.compile("\n\n(- )") | |
def to_gradio_chat_mds(question, code_path, highlight_lines = None, class_link = None, test_path = None): | |
mds = [""] * 1 + [""] * 3 | |
mds[0] = question | |
source_code = py_file_paths[code_path] | |
if test_path: | |
test_code = py_file_paths[test_path] | |
else: | |
test_code = [""] | |
# no highlight, highlight, no highlight | |
if not highlight_lines: | |
# mds[1] = "".join(source_code) | |
mds[1] = "#################################################################\n" + "# Please Check the `Full Code in the File` column\n" + "#################################################################\n" | |
# mds[3] = "" | |
else: | |
highlight_lines[0] -= 1 | |
mds[1] = "#################################################################\n" + "# From " + class_link + "\n" + f"# From Line {highlight_lines[0]+1} to Line {highlight_lines[1]}\n" + "#################################################################\n" | |
mds[1] += "".join(source_code[highlight_lines[0]:highlight_lines[1]]) | |
mds[2] = "".join(source_code) | |
mds[3] = "".join(test_code) | |
return mds[:1], mds[1:] | |
def build_pairwise_browser_tab(): | |
file_path_list = list(py_file_paths.keys()) | |
question_list = list(comment['title2comment'].keys()) | |
num_py_file_paths = MAX_py_file_paths_depth | |
# Build question selector map | |
with gr.Row(): | |
with gr.Column(): | |
question_selector = gr.Dropdown( | |
choices=question_list, | |
label="Question", | |
container=False | |
) | |
# locate_button = gr.Button( | |
# text="Locate", | |
# label="Locate", | |
# type="default" | |
# ) | |
with gr.Column(): | |
file_path_selector = gr.Dropdown( | |
choices=file_path_list, | |
label="File Path", | |
container=False | |
) | |
question_mds = [] | |
code_mds = [] | |
with gr.Row(): | |
with gr.Column(): | |
question_mds.append(gr.Code(language="markdown")) | |
with gr.Column(): | |
with gr.Tab("Infilling Code"): | |
# add code highlight | |
code_mds.append(gr.Code(language="python",elem_id="locate_code")) | |
with gr.Tab("Full Code in the File"): | |
code_mds.append(gr.Code(language="python")) | |
with gr.Tab("Test Code"): | |
code_mds.append(gr.Code(language="python")) | |
# Callbacks | |
question_selector.change(display_question, [question_selector, file_path_selector], [file_path_selector] + question_mds + code_mds) | |
file_path_selector.change(display_answer, [question_selector,file_path_selector], code_mds) | |
return (question_selector,) | |
code_highlight_css = """ | |
#chatbot .hll { background-color: #ffffcc } | |
#chatbot .c { color: #408080; font-style: italic } | |
#chatbot .err { border: 1px solid #FF0000 } | |
#chatbot .k { color: #008000; font-weight: bold } | |
#chatbot .o { color: #666666 } | |
#chatbot .ch { color: #408080; font-style: italic } | |
#chatbot .cm { color: #408080; font-style: italic } | |
#chatbot .cp { color: #BC7A00 } | |
#chatbot .cpf { color: #408080; font-style: italic } | |
#chatbot .c1 { color: #408080; font-style: italic } | |
#chatbot .cs { color: #408080; font-style: italic } | |
#chatbot .gd { color: #A00000 } | |
#chatbot .ge { font-style: italic } | |
#chatbot .gr { color: #FF0000 } | |
#chatbot .gh { color: #000080; font-weight: bold } | |
#chatbot .gi { color: #00A000 } | |
#chatbot .go { color: #888888 } | |
#chatbot .gp { color: #000080; font-weight: bold } | |
#chatbot .gs { font-weight: bold } | |
#chatbot .gu { color: #800080; font-weight: bold } | |
#chatbot .gt { color: #0044DD } | |
#chatbot .kc { color: #008000; font-weight: bold } | |
#chatbot .kd { color: #008000; font-weight: bold } | |
#chatbot .kn { color: #008000; font-weight: bold } | |
#chatbot .kp { color: #008000 } | |
#chatbot .kr { color: #008000; font-weight: bold } | |
#chatbot .kt { color: #B00040 } | |
#chatbot .m { color: #666666 } | |
#chatbot .s { color: #BA2121 } | |
#chatbot .na { color: #7D9029 } | |
#chatbot .nb { color: #008000 } | |
#chatbot .nc { color: #0000FF; font-weight: bold } | |
#chatbot .no { color: #880000 } | |
#chatbot .nd { color: #AA22FF } | |
#chatbot .ni { color: #999999; font-weight: bold } | |
#chatbot .ne { color: #D2413A; font-weight: bold } | |
#chatbot .nf { color: #0000FF } | |
#chatbot .nl { color: #A0A000 } | |
#chatbot .nn { color: #0000FF; font-weight: bold } | |
#chatbot .nt { color: #008000; font-weight: bold } | |
#chatbot .nv { color: #19177C } | |
#chatbot .ow { color: #AA22FF; font-weight: bold } | |
#chatbot .w { color: #bbbbbb } | |
#chatbot .mb { color: #666666 } | |
#chatbot .mf { color: #666666 } | |
#chatbot .mh { color: #666666 } | |
#chatbot .mi { color: #666666 } | |
#chatbot .mo { color: #666666 } | |
#chatbot .sa { color: #BA2121 } | |
#chatbot .sb { color: #BA2121 } | |
#chatbot .sc { color: #BA2121 } | |
#chatbot .dl { color: #BA2121 } | |
#chatbot .sd { color: #BA2121; font-style: italic } | |
#chatbot .s2 { color: #BA2121 } | |
#chatbot .se { color: #BB6622; font-weight: bold } | |
#chatbot .sh { color: #BA2121 } | |
#chatbot .si { color: #BB6688; font-weight: bold } | |
#chatbot .sx { color: #008000 } | |
#chatbot .sr { color: #BB6688 } | |
#chatbot .s1 { color: #BA2121 } | |
#chatbot .ss { color: #19177C } | |
#chatbot .bp { color: #008000 } | |
#chatbot .fm { color: #0000FF } | |
#chatbot .vc { color: #19177C } | |
#chatbot .vg { color: #19177C } | |
#chatbot .vi { color: #19177C } | |
#chatbot .vm { color: #19177C } | |
#chatbot .il { color: #666666 } | |
""" | |
# .highlight { background: #f8f8f8; } | |
table_css = """ | |
table { | |
line-height: 0em | |
} | |
""" | |
old_block_css = ( | |
code_highlight_css | |
+ """ | |
pre { | |
white-space: pre-wrap; /* Since CSS 2.1 */ | |
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ | |
white-space: -pre-wrap; /* Opera 4-6 */ | |
white-space: -o-pre-wrap; /* Opera 7 */ | |
word-wrap: break-word; /* Internet Explorer 5.5+ */ | |
} | |
#notice_markdown th { | |
display: none; | |
} | |
#notice_markdown td { | |
padding-top: 8px; | |
padding-bottom: 8px; | |
} | |
#leaderboard_markdown td { | |
padding-top: 8px; | |
padding-bottom: 8px; | |
} | |
""" | |
) | |
block_css = old_block_css + ( | |
""" | |
#locate_code { | |
background-color: #DEEBF7; | |
} | |
#user_question { | |
background-color: #E2F0D9; | |
} | |
#reference { | |
background-color: #FFF2CC; | |
} | |
#model_explanation { | |
background-color: #FBE5D6; | |
} | |
""" | |
) | |
def load_demo(): | |
dropdown_update = gr.Dropdown.update(value=list(comment['title2comment'].keys())[0]) | |
return dropdown_update | |
def build_demo(): | |
with gr.Blocks( | |
title="Class-level Repo Code Generation Benchmark (numpy-ml)", | |
theme=gr.themes.Base(text_size=gr.themes.sizes.text_lg), | |
css=block_css, | |
) as demo: | |
(question_selector,) = build_pairwise_browser_tab() | |
demo.load(load_demo, [], [question_selector]) | |
thanks_txt = gr.Markdown( | |
""" | |
# Acknowledgement | |
This benchmark is based on the [numpy-ml](https://github.com/ddbourgin/numpy-ml) project. | |
""" | |
) | |
return demo | |
# 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") | |
# parser.add_argument("--bench-name", type=str, default="mt_bench") | |
# args = parser.parse_args() | |
# print(args) | |
py_file_paths_path = "numpyml-display/all_py_content.jsonl" | |
comment_path = "numpyml-display/final_dataset.jsonl" | |
# Load py_file_paths | |
py_file_paths = load_py_file_paths(py_file_paths_path) | |
# Load answers | |
comment = load_comment(comment_path) | |
demo = build_demo() | |
# demo.queue(concurrency_count=10, status_update_rate=10, api_open=False).launch() | |
demo.launch() | |