Afeefa123's picture
Update app.py
23ad23d verified
import streamlit as st
import openai
import os
import json
import base64
from PIL import Image
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
# ---------------- CONFIG ---------------- #
openai.api_key = os.getenv("OPENAI_API_KEY")
SCOPES = [
"https://www.googleapis.com/auth/classroom.courses",
"https://www.googleapis.com/auth/classroom.coursework.students",
"https://www.googleapis.com/auth/classroom.rosters"
]
# ---------------- GOOGLE AUTH ---------------- #
def authenticate_google():
creds = None
if os.path.exists("token.json"):
creds = Credentials.from_authorized_user_file("token.json", SCOPES)
if not creds or not creds.valid:
flow = InstalledAppFlow.from_client_secrets_file(
"credentials.json",
SCOPES
)
creds = flow.run_local_server(port=0)
with open("token.json", "w") as token:
token.write(creds.to_json())
service = build("classroom", "v1", credentials=creds)
return service
# ---------------- AI FUNCTIONS ---------------- #
def analyze_image(image):
buffered = image_to_base64(image)
prompt = """
Analyze this educational image and generate:
1. Course Title
2. Course Description
3. Topic Name
4. Detailed Explanation
"""
response = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": [
{"type": "text", "text": prompt},
{
"type": "image_url",
"image_url": {"url": f"data:image/png;base64,{buffered}"}
}
]}
]
)
return response.choices[0].message.content
def generate_mcqs(text):
prompt = f"""
Create 5 multiple choice questions in JSON format.
Based on:
{text}
Format:
[
{{
"question": "",
"options": ["A","B","C","D"],
"answer": ""
}}
]
"""
response = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
def image_to_base64(img):
import io
buffer = io.BytesIO()
img.save(buffer, format="PNG")
return base64.b64encode(buffer.getvalue()).decode()
# ---------------- CLASSROOM FUNCTIONS ---------------- #
def create_course(service, title, desc):
course = {
"name": title,
"descriptionHeading": title,
"description": desc,
"room": "AI Classroom",
"ownerId": "me"
}
return service.courses().create(body=course).execute()
def create_topic(service, course_id, name):
topic = {
"name": name
}
return service.courses().topics().create(
courseId=course_id,
body=topic
).execute()
def post_material(service, course_id, topic_id, text):
material = {
"title": "AI Generated Lesson",
"description": text,
"topicId": topic_id,
"state": "PUBLISHED",
"workType": "ASSIGNMENT"
}
return service.courses().courseWork().create(
courseId=course_id,
body=material
).execute()
# ---------------- STREAMLIT UI ---------------- #
st.set_page_config(page_title="AI E-Learning Platform")
st.title("📘 AI Powered E-Learning System")
uploaded = st.file_uploader(
"Upload Educational Image",
type=["png", "jpg", "jpeg"]
)
if uploaded:
image = Image.open(uploaded)
st.image(image, caption="Uploaded Image")
if st.button("Generate Explanation"):
with st.spinner("Analyzing..."):
output = analyze_image(image)
st.subheader("AI Output")
st.write(output)
st.session_state["lesson"] = output
if "lesson" in st.session_state:
if st.button("Generate MCQs"):
with st.spinner("Creating Questions..."):
mcqs = generate_mcqs(st.session_state["lesson"])
st.subheader("MCQs")
st.code(mcqs, language="json")
st.session_state["mcqs"] = mcqs
if "lesson" in st.session_state:
if st.button("Publish to Google Classroom"):
with st.spinner("Connecting to Classroom..."):
service = authenticate_google()
title = "AI Generated Course"
desc = "Created using LLM"
course = create_course(service, title, desc)
topic = create_topic(
service,
course["id"],
"AI Topic"
)
post_material(
service,
course["id"],
topic["topicId"],
st.session_state["lesson"]
)
st.success("Course Published Successfully!")