File size: 6,289 Bytes
8e1e80c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4946f89
6a2af70
4946f89
6a2af70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4946f89
6a2af70
 
8e1e80c
 
 
 
 
 
 
 
 
 
 
 
 
6a2af70
8e1e80c
27e1f33
 
 
8e1e80c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import streamlit as st
import google.generativeai as genai
import os
import tempfile

MODEL_ID = "gemini-2.0-flash-exp"
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
model = genai.GenerativeModel(MODEL_ID)
chat = model.start_chat()

# Initialize session state variables
if 'essay_question' not in st.session_state:
    st.session_state.essay_question = ""
if 'scoring_rubric' not in st.session_state:
    st.session_state.scoring_rubric = ""
if "subject" not in st.session_state:
    st.session_state.subject = ""
if "topic" not in st.session_state:
    st.session_state.topic = ""

def generate_essay_question(subject, topic, difficulty):
    try:
        prompt = f"Create an essay question on the topic '{topic}' in the context of {subject} with a {difficulty} difficulty level.  Output the essay question only. Do not provide any other information."
        response = model.generate_content(prompt)
        return response.text
    except Exception as e:
        st.error(f"An error occurred: {e}")
        return None

def generate_scoring_rubric(essay_question):
    return f"Scoring Rubric for the essay question: {essay_question}\n\n1. Clarity: 10 points\n2. Argument Strength: 10 points\n3. Grammar: 10 points\n4. Creativity: 10 points\n5. Relevance to Topic: 10 points\n\nTotal: 50 points"

def capture_exam_photo():
    img_file_buffer = None
    image_path = ""

    # Use the camera to capture an image
    img_file_buffer = st.camera_input("Take a picture")

    if img_file_buffer is not None:
            # Save the image to a temporary file
            with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as temp_file:
                temp_file.write(img_file_buffer.read())
                image_path = temp_file.name
            return image_path
    else:
        st.warning("Please capture an image of the exam paper.")
        return None

def main():

    # Streamlit UI
    st.title("πŸ“ AI Assisted Essay Scoring App")

    about = """# Essay Grading System πŸŽ“  

Welcome to the **Essay Grading System**! This interactive app helps educators generate essay questions, create scoring rubrics, and automate grading using AI.  

## πŸ“Œ Features  
βœ… **Essay Question Generator** – Select a subject, topic, and difficulty to generate thought-provoking essay questions.  
βœ… **Scoring Rubric Builder** – Automatically generate a rubric and refine it as needed.  
βœ… **AI-Powered Grading** – Upload a photo of an exam paper and let AI assess it based on the rubric.  

## 🎯 How It Works  
1️⃣ **Go to the "Essay Question" tab** – Choose your subject, enter a topic, and set the difficulty.  
2️⃣ **Switch to "Scoring Rubric"** – A grading rubric is generated based on the question, and you can edit it.  
3️⃣ **Move to "Grading Outputs"** – Upload an image of a handwritten essay, and the AI will grade it based on the rubric.  

πŸš€ **Enhance efficiency and accuracy in grading with this AI-assisted tool!**    

### πŸ“Œ About the Creator  
**Created by:** *Louie F. Cervantes, M.Eng. (Information Engineering)*  
**(c) 2025 West Visayas State University**
"""

    with st.expander("How to Use this App"):
        st.markdown(about)

    tabs = ["Essay Question", "Scoring Rubric", "Grading Outputs"]
    selected_tab = st.sidebar.radio("Select a Tab", tabs)

    if selected_tab == "Essay Question":
        st.header("Generate Essay Question")
        if st.session_state.subject != "":
            subject = st.text_input("Enter Subject", st.session_state.subject)
        else:
            subject = st.text_input("Enter Subject")
        if st.session_state.subject != "":
            topic = st.text_input("Enter Topic", st.session_state.topic)
        else:
            topic = st.text_input("Enter Topic")

        difficulty = st.selectbox("Select Difficulty", ["Easy", "Moderate", "Difficult"])
        st.session_state.subject = subject
        st.session_state.topic = topic

        if st.button("Generate Question"):
            if subject and topic and difficulty:
                st.session_state.essay_question = generate_essay_question(subject, topic, difficulty)
                st.success("Essay question generated successfully!")
            else:
                st.warning("Please provide the subject and topic.")        
        if st.session_state.essay_question:
            st.subheader("Generated Essay Question:")
            st.write(st.session_state.essay_question)

    elif selected_tab == "Scoring Rubric":
        st.header("Scoring Rubric")
        if not st.session_state.essay_question:
            st.warning("Please generate an essay question first.")
        else:
            if not st.session_state.scoring_rubric:
                st.session_state.scoring_rubric = generate_scoring_rubric(st.session_state.essay_question)
            
            st.subheader("Generated Scoring Rubric:")
            st.session_state.scoring_rubric = st.text_area("Edit Rubric", st.session_state.scoring_rubric, height=200)

    elif selected_tab == "Grading Outputs":
        st.header("Grading Outputs")
        if not st.session_state.essay_question or not st.session_state.scoring_rubric:
            st.warning("Please generate both an essay question and a scoring rubric first.")
        else:
            exam_image_path = capture_exam_photo()
            mime_type = "image/jpeg"
            if exam_image_path is not None:

                # Upload the file with the correct MIME type
                file_data = genai.upload_file(exam_image_path, mime_type=mime_type)

                multimodal_prompt = f"Extract all the text from the image. Score the essay exam response to the Essay Question: {st.session_state.essay_question}\nScoring Rubric: {st.session_state.scoring_rubric}.  Provide feednack on the essay response."
                
                # Send file and prompt to Gemini API
                response = chat.send_message(
                    [
                        multimodal_prompt, 
                        file_data
                    ]
                )                

                st.subheader("AI Grading Response:")
                # Display Gemini response
                st.markdown(response.text)


if __name__ == "__main__":
    main()