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)