File size: 4,308 Bytes
42e1dbe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import pyperclip
from scraper import scrape_websites
from chatbot import create_chain, answer_query
from langchain_core.messages import HumanMessage, AIMessage
from pdf_converter import create_pdf


data = None
chains = [None]




def load(pdf_doc):
    return create_chain(chains, pdf_doc)


def answer(query, chat_history=[]):
    prepared_history = []
    for a, b in chat_history:
        prepared_history.append(HumanMessage(content=a))
        prepared_history.append(AIMessage(content=b))
    answer = answer_query(chain=chains[0], query=query, chat_history=prepared_history)
    return '', chat_history + [(query, answer)]


async def scrape(topic, num_results):
    global data
    results = await scrape_websites(topic, num_results)
    data = results
    choices = [result.split('\n')[0] for result in results]
    return gr.update(choices=choices, value=None)


def update_outlines(index):
    if index:
        return data[index]
    else:
        return 'choose a source to see its outlines'


def copy_curr_page_link(curr_page_index):
    if data and curr_page_index:
        page_details = data[curr_page_index]
        page_link = page_details.split('\n')[1].split(' ')[1]
        pyperclip.copy(page_link)
    return update_outlines(curr_page_index)


html = """
<div style="text-align:center; max-width: 900px; margin: 0 auto; margin-top:5px">
    <h1>Research Assistant</h1>
    <p> Welcome to the Research Assistant app! This tool helps you find relevant information on your topic of interest.</p>
</div>"""
css = """container{max-width:900px; margin-left:auto; margin-right:auto;padding:20px}
.centered{text-align:center;}"""
theme = gr.themes.Monochrome(
    primary_hue=gr.themes.colors.orange,
    secondary_hue=gr.themes.colors.blue,
    neutral_hue=gr.themes.colors.gray,
    radius_size=gr.themes.sizes.radius_md
)

with gr.Blocks(css=css, theme=theme) as demo:
    gr.HTML(html)
    with gr.Tab("Scrape Google"):
        with gr.Row():
            with gr.Column(variant="panel"):
                topic = gr.Textbox(label="What is your Research Topic?", container=True)
                num_links = gr.Slider(label="Specify the Number of Links to Scrape!", minimum=0, maximum=15, step=1,
                                      container=True)
                text_button = gr.Button("Scrape")

            with gr.Column(min_width=600):
                websites_dropdown = gr.Dropdown(interactive=True, type='index', label='Sources')
                text_output = gr.Textbox(label="Outlines", lines=10, container=True, autoscroll=True, interactive=False)
                copy_button = gr.Button(value='copy this page link')

            text_button.click(scrape, inputs=[topic, num_links], outputs=websites_dropdown, scroll_to_output=False)
            websites_dropdown.change(fn=update_outlines, inputs=websites_dropdown, outputs=text_output)
            copy_button.click(copy_curr_page_link, inputs=websites_dropdown, outputs=text_output)

    with gr.Tab("Convert To PDF"):
        with gr.Column():
            url_input = gr.Textbox(label="Insert URL of webpage you want to convert to pdf")
            pdf_button = gr.Button("Convert")
            gr.Markdown('or', elem_classes='centered')
            pdf_doc = gr.File(label="Upload a pdf directly from your device:", file_types=['.pdf', '.docx'],type='filepath')

            with gr.Row():
                load_pdf = gr.Button('Load pdf file')
                status = gr.Textbox(label="Status", placeholder='', interactive=False)

            load_pdf.click(load, inputs=pdf_doc, outputs=status)
            pdf_button.click(create_pdf, inputs=url_input, outputs=pdf_doc)

    with gr.Tab('Chat with your PDF'):
        with gr.Column():
            chatbot = gr.Chatbot()
            user_input = gr.Textbox(label="type in your question")
            with gr.Row():
                submit_query = gr.Button("submit")
                clear = gr.ClearButton([user_input, chatbot])

            
            submit_query.click(answer, inputs=[user_input, chatbot], outputs=[user_input, chatbot])
            
            #Optional
            user_input.submit(answer, inputs=[user_input, chatbot], outputs=[user_input, chatbot])
            

if __name__ == "__main__":
    demo.launch(share=False)