buster / gradio_app.py
jerpint's picture
update examples
c525408
raw
history blame
3.35 kB
import os
import cfg
import gradio as gr
import pandas as pd
from cfg import buster
import logging
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
USERNAME = os.getenv("BUSTER_USERNAME")
PASSWORD = os.getenv("BUSTER_PASSWORD")
def check_auth(username: str, password: str) -> bool:
valid_user = username == USERNAME
valid_password = password == PASSWORD
is_auth = valid_user and valid_password
logger.info(f"Log-in attempted by {username=}. {is_auth=}")
return is_auth
def format_sources(matched_documents: pd.DataFrame) -> str:
if len(matched_documents) == 0:
return ""
documents_answer_template: str = "πŸ“ Here are the sources I used to answer your question:\n\n{documents}\n\n{footnote}"
document_template: str = "[πŸ”— {document.title}]({document.url}), relevance: {document.similarity_to_answer:2.1f} %"
matched_documents.similarity_to_answer = (
matched_documents.similarity_to_answer * 100
)
documents = "\n".join(
[
document_template.format(document=document)
for _, document in matched_documents.iterrows()
]
)
footnote: str = "I'm a bot πŸ€– and not always perfect."
return documents_answer_template.format(documents=documents, footnote=footnote)
def add_sources(history, completion):
if completion.answer_relevant:
formatted_sources = format_sources(completion.matched_documents)
history.append([None, formatted_sources])
return history
def user(user_input, history):
"""Adds user's question immediately to the chat."""
return "", history + [[user_input, None]]
def chat(history):
user_input = history[-1][0]
completion = buster.process_input(user_input)
history[-1][1] = ""
for token in completion.answer_generator:
history[-1][1] += token
yield history, completion
block = gr.Blocks(css="#chatbot .overflow-y-auto{height:500px}")
with block:
with gr.Row():
gr.Markdown(
"<h3><center>Buster πŸ€–: A Question-Answering Bot for your documentation</center></h3>"
)
chatbot = gr.Chatbot()
with gr.Row():
question = gr.Textbox(
label="What's your question?",
placeholder="Ask a question to AI stackoverflow here...",
lines=1,
)
submit = gr.Button(value="Send", variant="secondary").style(full_width=False)
examples = gr.Examples(
examples=[
"What's a genetic algorithm?",
"What's PCA? What is it used for?",
"How do I deal with noisy data?",
],
inputs=question,
)
gr.Markdown(
"This application uses GPT to search the docs for relevant info and answer questions."
)
response = gr.State()
submit.click(user, [question, chatbot], [question, chatbot], queue=False).then(
chat, inputs=[chatbot], outputs=[chatbot, response]
).then(add_sources, inputs=[chatbot, response], outputs=[chatbot])
question.submit(user, [question, chatbot], [question, chatbot], queue=False).then(
chat, inputs=[chatbot], outputs=[chatbot, response]
).then(add_sources, inputs=[chatbot, response], outputs=[chatbot])
block.queue(concurrency_count=16)
block.launch(debug=True, share=False, auth=check_auth)