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!")