|
import os |
|
|
|
import nltk |
|
import requests |
|
import streamlit as st |
|
from nltk.tokenize import sent_tokenize |
|
|
|
from responses import SubmitQuestionAndDocumentsResponse |
|
|
|
try: |
|
_ = nltk.data.find("tokenizers/punkt") |
|
except LookupError: |
|
nltk.download("punkt") |
|
|
|
try: |
|
from dotenv import load_dotenv |
|
load_dotenv() |
|
except ImportError: |
|
pass |
|
|
|
|
|
|
|
st.set_page_config(layout="wide") |
|
|
|
if os.getenv("ENV") == "production": |
|
BASE_URL = "https://deven-cleric-backend.onrender.com" |
|
else: |
|
BASE_URL = "http://localhost:8000" |
|
|
|
|
|
def make_sidebar(): |
|
with st.sidebar: |
|
|
|
|
|
|
|
st.write("This functionality is not implemented yet, but it is a placeholder for future use.") |
|
st.write("It can be easily implemented to select the model to use for the question answering task.") |
|
_ = st.selectbox("Select the model", ["GPT-4", "Claude Opus"], disabled=True) |
|
|
|
_ = st.text_input("Enter the system prompt for the model", value="You are a helful assistant.", disabled=True) |
|
|
|
def create_payload(question, documents): |
|
documents = documents.split(",") |
|
payload = {"question": question, "documents": documents} |
|
return payload |
|
|
|
|
|
def main(): |
|
st.title("Deven's Cleric Assignment") |
|
|
|
make_sidebar() |
|
documents, question = None, None |
|
|
|
col1, col2 = st.columns([1,1]) |
|
|
|
with col1: |
|
|
|
documents = st.text_area( |
|
"Enter the URLs of the documents (separated by commas)", |
|
|
|
|
|
) |
|
|
|
with col2: |
|
|
|
question = st.text_input( |
|
"Ask the question", |
|
|
|
) |
|
|
|
|
|
if st.button("Submit"): |
|
|
|
|
|
if len(documents) > 0 and len(question) > 0: |
|
|
|
|
|
payload = create_payload(question, documents) |
|
|
|
|
|
data = SubmitQuestionAndDocumentsResponse(**payload) |
|
|
|
|
|
url = f"{BASE_URL}/submit_question_and_documents/" |
|
resp = requests.post(url, json=data.model_dump()) |
|
|
|
|
|
if resp.status_code == 200: |
|
st.write("Question and documents submitted successfully.") |
|
else: |
|
st.write("There was an error submitting the question and documents.") |
|
st.write(resp.status_code) |
|
st.write(resp.json()) |
|
|
|
url_local_get = f"{BASE_URL}/get_question_and_facts/" |
|
st.write("Polling the facts...") |
|
|
|
|
|
resp = requests.get(url_local_get) |
|
|
|
fact_str = "" |
|
if resp.status_code == 200: |
|
facts = resp.json()["facts"] |
|
|
|
st.write("Facts:") |
|
if facts is not None: |
|
for i, fact in enumerate(facts): |
|
if len(fact) > 0: |
|
fact = fact.replace("$", f"{chr(92)}$") |
|
sentences = sent_tokenize(fact) |
|
for sentence in sentences: |
|
fact_str += f"""1. {sentence}\n""" |
|
|
|
st.markdown(fact_str) |
|
else: |
|
st.warning("No facts found. Check the URLs and question and try again.") |
|
else: |
|
st.write("There was an error fetching the facts.") |
|
st.write(resp.status_code) |
|
st.write(resp.json()) |
|
else: |
|
st.warning("Please enter a question and documents to proceed.") |
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
main() |
|
|