import gradio as gr import os from dotenv import load_dotenv from pathlib import Path from functions import ( reset_open_ai, fetch_collections, select_collection, reset_collection, handle_submit, ) from models import ( Icons, Message, Messages, ) load_dotenv() css_style = Path('./style.css').read_text() with gr.Blocks(css=css_style) as demo: zot = gr.State(None) zot_collections = gr.State([]) data = gr.State([]) messages = gr.State(Messages([ Message( Icons.INFO, "Please provide all the required OpenAI and Zotero information in the left panel."), ])) with gr.Row(): gr.Markdown("""

Zotero Logo Zotero Q&A

Fan Li ([@FanLi_RnD](https://twitter.com/FanLi_RnD)) - https://apex974.com/articles/literature-reviews-with-paper-qa-and-zotero This tool allows you to ask questions based on your Zotero library. It was built upon [Paper QA](https://github.com/whitead/paper-qa), [LangChain AI](https://github.com/hwchase17/langchain) and [pyZotero](https://github.com/urschrei/pyzotero). Check out Aria, my new AI Research Assistant Plugin for Zotero: https://github.com/lifan0127/ai-research-assistant. """) with gr.Row(): with gr.Column(scale=1): openai_api_key = gr.Textbox( label="OpenAI API Key", type="password", value=os.getenv('OPENAI_API_KEY')) gr.HTML() zot_api_key = gr.Textbox( label="Zotero API Key", type="password", value=os.getenv('ZOTERO_API_KEY')) zot_library_type = gr.Radio(choices=[ "User", "Group"], label="Zotero Library Type", value="User", elem_id="zotero-library-type") zot_library_id = gr.Textbox( label="Zotero User/Group ID", value=os.getenv('ZOTERO_LIBRARY_ID')) zot_citation_style = gr.Textbox( label="Zotero Citation Style", value='nature', ) zot_selected_col = gr.Radio( [], label="Zotero Collection", elem_id="zotero-collection", visible=False) zot_msg = gr.HTML("""
""", visible=True) zot_fetch_col_btn = gr.Button('Fetch Collections') gr.Error("Some Error Message") with gr.Column(scale=3): question = gr.Textbox( placeholder="You have to select a Zotero collection to proceed", label="Question", interactive=False) gr.HTML() with gr.Box(): with gr.Accordion("Messages"): msg_board = gr.HTML(messages.value) answer = gr.HTML(None, elem_id="answer") openai_api_key.change(reset_open_ai, inputs=[openai_api_key], outputs=[ answer], show_progress=False) zot_api_key.change( reset_collection, inputs=[messages], outputs=[zot_selected_col, zot_fetch_col_btn, question, answer, messages, msg_board, zot_selected_col], show_progress=False, ) zot_library_type.change( reset_collection, inputs=[messages], outputs=[zot_selected_col, zot_fetch_col_btn, question, answer, messages, msg_board, zot_selected_col], show_progress=False, ) zot_library_id.change( reset_collection, inputs=[messages], outputs=[zot_selected_col, zot_fetch_col_btn, question, answer, messages, msg_board, zot_selected_col], show_progress=False ) zot_citation_style.change( reset_collection, inputs=[messages], outputs=[zot_selected_col, zot_fetch_col_btn, question, answer, messages, msg_board, zot_selected_col], show_progress=False ) zot_fetch_col_btn.click( fn=fetch_collections, inputs=[openai_api_key, zot_library_id, zot_library_type, zot_api_key, messages], outputs=[zot, zot_collections, zot_selected_col, zot_fetch_col_btn, zot_msg, messages, msg_board], show_progress=False, ) zot_selected_col.change( fn=select_collection, inputs=[zot_selected_col, messages], outputs=[question, messages, msg_board, answer], show_progress=False ) question.submit( fn=handle_submit, inputs=[zot, zot_selected_col, zot_collections, zot_citation_style, question, messages], outputs=[messages, msg_board, answer], show_progress=False ) demo.queue(concurrency_count=10, api_open=False) demo.launch()