Spaces:
Runtime error
Runtime error
| 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!") | |