# To run streamlit, go to terminal and type: 'streamlit run app.py' # Core Packages ########################### import os import shutil import docx2txt import PyPDF2 import streamlit as st import openai import requests import json ####################################################################################################################### current_path = os.path.abspath(os.path.dirname(__file__)) project_title = "ChatGPT Essay Evaluator" project_icon = "46_Knowledge-white4.png" # st.set_page_config(page_title=project_title, initial_sidebar_state='collapsed',page_icon=project_icon) ####################################################################################################################### def read_pdf(file): pdfReader = PyPDF2.PdfReader(file) count = len(pdfReader.pages) all_page_text = "" for i in range(count): page = pdfReader.pages[i] all_page_text += page.extract_text() return all_page_text def build_criteria(criteria, min_score, max_score): text = "" num_criteria = len(criteria) for i, val in enumerate(criteria): text += "Criteria: \n" text += f"({i+1}/{num_criteria}) {val} Minimum Score: {min_score[i]} | Maximum Score: {max_score[i]} \n\n" return text def run_chatgpt(essay, criteria_text): # Define the endpoint URL and payload data endpoint = "https://joshuafreeedu.pythonanywhere.com/evaluate-essay" payload = {"essay_text": essay, "criteria": criteria_text} response = requests.post(endpoint, json=payload) return response.json()["evaluation"] def main(): head_col = st.columns([1,8]) with head_col[0]: st.image(project_icon) with head_col[1]: st.title(project_title) st.markdown("***") st.subheader("") ######################################### # # instructions # st.subheader("How to use: ") # st.write("1a. Input your essay in the text box; or \n\n" # "1b. Click on Upload Files to submit one or multiple essays saved in doc, docx, or txt format.") # st.write("2. Click on \'Grade Essay\' button to run the model.") ######################################### uploaded_file = st.file_uploader('Upload Files', accept_multiple_files=False, type=['docx','txt','pdf']) ta_val = "" # Value for the text area upload_flag = False #If a file/s is uploaded, disable input in the text area; then, display the essays list if uploaded_file: upload_flag = True # Parse the contents of the uploaded file according to their extension txt docx or pdf if uploaded_file.name.split(".")[-1] == "docx": # docx files contents = docx2txt.process(uploaded_file) elif uploaded_file.name.split(".")[-1] == "pdf": # pdf files contents = read_pdf(uploaded_file) else: # txt files contents = uploaded_file.read().decode("utf-8") #ta_val will be the preview of all the essays in the text area; display index numbering if there are more than one file ta_val += contents # text area input for the essay, button to run the model, other widgets response_ta = st.text_area("Essay:",placeholder="You can input your essay here instead of uploading a file.",height=500, value=ta_val, disabled=upload_flag) if "criteria" not in st.session_state: st.session_state["criteria"] = ["Cohesion", "Syntax", "Vocabulary", "Phraseology", "Grammar", "Conventions"] st.session_state["min_scores"] = [0, 0, 0, 0, 0, 0] st.session_state["max_scores"] = [10, 10, 10, 10, 10, 10] st.session_state["remove_criteria"] = False with st.form(key="criteria_form"): col1, col2, col3 = st.columns(3) with col1: st.subheader("Criteria") new_criteria = [] for i, val in enumerate(st.session_state["criteria"]): new_criteria.append(st.text_input(f"Criteria {i + 1}", st.session_state["criteria"][i], label_visibility="collapsed")) with col2: st.subheader("Minimum Score") new_min_scores = [] for i, val in enumerate(st.session_state["min_scores"]): new_min_scores.append(st.number_input(f"Minimum Score {i + 1}", 0, st.session_state["max_scores"][i], st.session_state["min_scores"][i], label_visibility="collapsed")) with col3: st.subheader("Maximum Score") new_max_scores = [] for i, val in enumerate(st.session_state["max_scores"]): new_max_scores.append(st.number_input(f"Maximum Score {i + 1}", st.session_state["min_scores"][i], 100, st.session_state["max_scores"][i], label_visibility="collapsed")) submit_criteria = col1.form_submit_button("Update Criteria") add_criteria = col2.checkbox("Add criteria") remove_criteria = col3.checkbox("Remove criteria") if submit_criteria: # Add new criterion if add_criteria and remove_criteria: st.warning("Cannot add and remove criteria at the same time.") else: if add_criteria: new_criteria.append("Enter new criteria name..") new_min_scores.append(0) new_max_scores.append(10) st.session_state["criteria"] = new_criteria st.session_state["min_scores"] = new_min_scores st.session_state["max_scores"] = new_max_scores st._rerun() # Remove criterion if remove_criteria: remove_list = st.multiselect("Select criteria to remove:", st.session_state["criteria"]) if remove_list: new_criteria = [c for c in new_criteria if c not in remove_list] new_min_scores = [s for c, s in zip(new_criteria, new_min_scores) if c not in remove_list] new_max_scores = [s for c, s in zip(new_criteria, new_max_scores) if c not in remove_list] st.session_state["criteria"] = new_criteria st.session_state["min_scores"] = new_min_scores st.session_state["max_scores"] = new_max_scores st._rerun() else: st.session_state["criteria"] = new_criteria st.session_state["min_scores"] = new_min_scores st.session_state["max_scores"] = new_max_scores st._rerun() # send essay to chatGPT when the button is clicked if st.button("Submit"): if not ta_val: # if the text area is empty: st.error("Please input the essay in the corresponding text area.") else: # ChatGPT Evaluation Section criteria_text = build_criteria(st.session_state["criteria"], st.session_state["min_scores"], st.session_state["max_scores"]) st.session_state.chatgpt_evaluation = run_chatgpt(ta_val, criteria_text) if "chatgpt_evaluation" in st.session_state: st.subheader("Evaluation: ") st.write(st.session_state["chatgpt_evaluation"]) if __name__ == '__main__': main() # To run streamlit, go to terminal and type: 'streamlit run app-source.py'