import gradio as gr import pandas as pd from extract_answer import extract_endpoint_llama from generate_answers_matrix import generate_answers example_queries = [ "What is the size, shape, and energy (watt hour) or capacity (Amp hour) of battery discussed in the paper?", "What specific mechanical testing methods were used to quantify strength?", "What parameters they used to quantify the benefit of their individual design (mass saving, increased run time, etc.)?", "What material chemistry combination (on the anode, cathode, separator, and electrolyte) was used in these papers?", "What kind of end use application they targeted?", ] MAX_CATEGORIES = 10 def change_button(text): if len(text) > 0: return gr.Button(interactive=True) else: return gr.Button(interactive=False) def generate_category_btn(cluster_output): unique_categories = set() for item in cluster_output: unique_categories.update(item["categories"]) update_show = [gr.Button(visible=True, value=w) for w in unique_categories] update_hide = [ gr.Button(visible=False, value="") for _ in range(MAX_CATEGORIES - len(unique_categories)) ] return update_show + update_hide def add_query(this_query, query_list): if not query_list: query_list = [this_query] elif this_query not in query_list: query_list.append(this_query) df = pd.DataFrame(query_list, columns=["Queries"]) return query_list, df def reset_queries(): return [], pd.DataFrame(columns=["Queries"]) btn_list = [] with gr.Blocks() as app: gr.Markdown( """ # Paper Query Matrix This app extracts text from papers and then searches for relevant excerpts based on user queries. ### Input 1. A group of research papers that you want to run the queries on. 1. Queries that you would like to know about these papers. ### Output Table containing the relevant excerpts from the papers for each of the queries. # 1. Upload + Extract First, upload the papers you want to analyze. Currently, we only support PDFs. Once they're uploaded, you can extract the text data from the papers. """ ) file_upload = gr.Files() extract_btn = gr.Button("Extract", interactive=False) with gr.Tab(label="Table"): extract_df = gr.Dataframe( datatype="markdown", column_widths=[100, 400], wrap=True ) with gr.Tab(label="JSON"): extract_output = gr.JSON(label="Extract Output") gr.Markdown( """ ---------------- # 2. Create Queries Enter a the queries that you would like to know about these papers. This will search the papers to find the most relevant excerpts. """ ) gr.Markdown( """ ### Input """ ) query = gr.Textbox( label="Query", value=example_queries[1], lines=3, placeholder="Enter a query" ) add_query_btn = gr.Button("Add Query", interactive=False) gr.Markdown( """ You can also select some example queries below. """ ) with gr.Row(): q0_btn = gr.Button(example_queries[0], interactive=False) q1_btn = gr.Button(example_queries[1], interactive=False) q2_btn = gr.Button(example_queries[2], interactive=False) q3_btn = gr.Button(example_queries[3], interactive=False) q4_btn = gr.Button(example_queries[4], interactive=False) gr.Markdown( """ ### Output """ ) with gr.Tab(label="Queries Table"): query_df = gr.Dataframe( datatype="markdown", column_widths=[100, 100, 300], wrap=True ) with gr.Tab(label="JSON"): query_output = gr.JSON(label="Queries") reset_query_btn = gr.Button("Clear Queries", interactive=False) gr.Markdown( """ ---------------- # 3. Extract Answers Gather the relevant excerpts from each of the papers """ ) with gr.Row(): with gr.Column(): gr.Markdown( """ ### Input """ ) generate_answers_btn = gr.Button("Extract Answers", interactive=False) gr.Markdown( """ ### Answer Matrix """ ) with gr.Tab(label="Output Table"): answers_df = gr.Dataframe( datatype="markdown", column_widths=[100, 100, 300], wrap=True ) with gr.Tab(label="JSON"): answers_output = gr.JSON(label="Answer Output") # Event handlers file_upload.change(fn=change_button, inputs=[file_upload], outputs=[extract_btn]) extract_output.change( fn=change_button, inputs=[extract_output], outputs=[add_query_btn] ) extract_output.change(fn=change_button, inputs=[extract_output], outputs=[q0_btn]) extract_output.change(fn=change_button, inputs=[extract_output], outputs=[q1_btn]) extract_output.change(fn=change_button, inputs=[extract_output], outputs=[q2_btn]) extract_output.change(fn=change_button, inputs=[extract_output], outputs=[q3_btn]) extract_output.change(fn=change_button, inputs=[extract_output], outputs=[q4_btn]) extract_output.change( fn=change_button, inputs=[extract_output], outputs=[reset_query_btn] ) extract_btn.click( fn=extract_endpoint_llama, inputs=[file_upload], outputs=[extract_output, extract_df], ) q0_btn.click( fn=add_query, inputs=[q0_btn, query_output], outputs=[query_output, query_df], ) q1_btn.click( fn=add_query, inputs=[q1_btn, query_output], outputs=[query_output, query_df], ) q2_btn.click( fn=add_query, inputs=[q2_btn, query_output], outputs=[query_output, query_df], ) q3_btn.click( fn=add_query, inputs=[q3_btn, query_output], outputs=[query_output, query_df], ) q4_btn.click( fn=add_query, inputs=[q4_btn, query_output], outputs=[query_output, query_df], ) add_query_btn.click( fn=add_query, inputs=[query, query_output], outputs=[query_output, query_df], ) reset_query_btn.click( fn=reset_queries, inputs=[], outputs=[query_output, query_df], ) query_output.change( fn=change_button, inputs=[query_output], outputs=[generate_answers_btn] ) generate_answers_btn.click( fn=generate_answers, inputs=[extract_output, query_output], outputs=[answers_output, answers_df], # api_name="cluster", ) if __name__ == "__main__": app.launch()