MCQ-Generator / app.py
Manikandan-Alagu's picture
Update app.py
c8bebdb verified
import os
import json
import pandas as pd
import traceback
import streamlit as st
from src.mcqgenerator.utilis import read_file, get_table_data
from src.mcqgenerator.logger import logging
from src.mcqgenerator.mcqgenerator import generate_evaluate_chain
from langchain_community.callbacks import get_openai_callback
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.chains import SequentialChain
from weasyprint import HTML
with open('Response.json', 'r') as file:
RESPONSE_JSON = json.load(file)
st.title("MCQs Creator Application")
with st.form("user_inputs"):
uploader_file = st.file_uploader("Upload a PDF or Txt file")
mcq_count = st.text_input("No. of MCQS")
subject = st.text_input("Insert subject", max_chars=20)
tone = st.text_input("Complexity Level of Questions", max_chars=20, placeholder="Simple")
button = st.form_submit_button("Create MCQs")
df = None # Declare df at a broader scope
if button and uploader_file is not None and mcq_count and subject and tone:
with st.spinner("loading..."):
try:
text = read_file(uploader_file)
# Count tokens and the cost of the API call
with get_openai_callback() as cb:
response = generate_evaluate_chain(
{
"text": text,
"number": mcq_count,
"subject": subject,
"tone": tone,
"response_json": json.dumps(RESPONSE_JSON)
}
)
except Exception as e:
traceback.print_exception(type(e), e, e.__traceback__)
st.error("Error")
else:
print(f"Total Tokens:{cb.total_tokens}")
print(f"Prompt Tokens:{cb.prompt_tokens}")
print(f"Completion Tokens:{cb.completion_tokens}")
print(f"Total Cost:{cb.total_cost}")
if isinstance(response, dict):
# Extract the quiz data from the response
quiz = response.get("quiz", None)
if quiz is not None:
table_data = get_table_data(quiz)
if table_data is not None:
df = pd.DataFrame(table_data)
df.index = df.index + 1
st.table(df)
# Display the review in a text box as well
st.text_area(label="Review", value=response["review"])
# Call the download function
else:
st.error("Error in the table data")
else:
st.write(response)
def download(df):
col1, col2 = st.columns(2)
html_content = df.to_html(index=False)
pdf_path = "generated_mcqs.pdf"
if button:
# Download CSV
col1.download_button(
label="Download CSV",
data=df.to_csv(index=False).encode("utf-8"),
file_name="generated_mcqs.csv",
key="csv-download",
help="Click to download as CSV",
)
# Now you can use df outside the form if needed
if df is not None:
download(df)