File size: 7,354 Bytes
f628dc0
5d61222
 
 
 
264b36f
 
 
5d61222
264b36f
5d61222
264b36f
5d61222
 
 
264b36f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d61222
 
264b36f
 
 
 
 
 
 
 
 
 
5d61222
 
 
 
264b36f
5d61222
264b36f
5d61222
264b36f
5d61222
 
264b36f
5d61222
 
 
 
 
 
 
 
 
264b36f
 
5d61222
 
264b36f
5d61222
 
264b36f
5d61222
 
 
 
 
 
 
 
 
264b36f
 
 
 
5d61222
264b36f
 
 
 
 
 
 
 
 
 
 
 
 
 
5d61222
264b36f
 
5d61222
 
264b36f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d61222
 
264b36f
5d61222
 
264b36f
5d61222
264b36f
5d61222
264b36f
 
 
5d61222
 
 
 
264b36f
 
5d61222
264b36f
 
 
5d61222
264b36f
 
 
 
 
 
 
 
 
 
 
 
 
5d61222
264b36f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189


import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import json
import os
import fitz  # PyMuPDF

# πŸ“¦ Load Granite Model
model_name = "ibm-granite/granite-3.3-2b-instruct"
print("πŸš€ Loading model...")
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"βœ… Model loaded on {device}")

# πŸ’Ύ Load or Initialize Users
user_file = "users.json"
if os.path.exists(user_file):
    with open(user_file, "r") as f:
        users = json.load(f)
else:
    users = {
        "alice": {"password": "1234", "role": "student", "progress": {}},
        "bob": {"password": "abcd", "role": "teacher", "progress": {}},
        "admin": {"password": "admin", "role": "admin", "progress": {}}
    }

# πŸ’Ύ Save Progress
def save_users():
    with open(user_file, "w") as f:
        json.dump(users, f, indent=2)

# 🧠 Session State
session_state = {"user": None}

# πŸ” Register & Login
def register(username, password, role):
    if username in users:
        return "❌ Username already exists!"
    if role not in ["student", "teacher", "admin"]:
        return "❌ Role must be student, teacher, or admin"
    users[username] = {"password": password, "role": role, "progress": {}}
    save_users()
    return f"βœ… Registered {username} as {role}!"

def login(username, password):
    user = users.get(username)
    if user and user["password"] == password:
        session_state["user"] = {"name": username, "role": user["role"]}
        return f"βœ… Logged in as {username} ({user['role']})"
    else:
        return "❌ Login failed"

# πŸ“š Tutor
def ai_tutor(subject, topic):
    if not session_state["user"]:
        return "⚠️ Please login first."
    role = session_state["user"]["role"]
    prompt = (
        f"You are a helpful AI tutor for a {role}. Explain the following topic in {subject}:\n\n"
        f"Topic: {topic}\n\nExplanation:"
    )
    inputs = tokenizer(prompt, return_tensors="pt").to(device)
    outputs = model.generate(**inputs, max_new_tokens=300)
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    user = session_state["user"]["name"]
    users[user]["progress"][f"Tutor: {topic}"] = "Learned"
    save_users()
    return response

# πŸ“ Topic Quiz
def generate_quiz(subject, topic):
    if not session_state["user"]:
        return "⚠️ Please login first."
    role = session_state["user"]["role"]
    prompt = (
        f"You are an AI quiz generator for a {role}. "
        f"Create 3 short quiz questions with answers about {topic} in {subject}.\n\n"
        "Format:\nQ1: ...\nA1: ...\nQ2: ...\nA2: ...\nQ3: ...\nA3: ..."
    )
    inputs = tokenizer(prompt, return_tensors="pt").to(device)
    outputs = model.generate(**inputs, max_new_tokens=300)
    quiz = tokenizer.decode(outputs[0], skip_special_tokens=True)
    user = session_state["user"]["name"]
    users[user]["progress"][f"Quiz: {topic}"] = "Generated"
    save_users()
    return quiz

# πŸ“„ PDF Text Extractor
def extract_text_from_pdf(file):
    doc = fitz.open(stream=file.read(), filetype="pdf")
    return "".join([page.get_text() for page in doc])

# 🧾 PDF Quiz
def generate_quiz_from_pdf(file):
    if not session_state["user"]:
        return "⚠️ Please login first."
    text = extract_text_from_pdf(file)
    prompt = f"You are a teacher. Generate 5 questions with answers from this PDF:\n\n{text}"
    inputs = tokenizer(prompt, return_tensors="pt").to(device)
    outputs = model.generate(**inputs, max_new_tokens=300)
    quiz = tokenizer.decode(outputs[0], skip_special_tokens=True)
    user = session_state["user"]["name"]
    users[user]["progress"]["PDF Quiz"] = "Generated"
    save_users()
    return quiz

# πŸ“˜ PDF Summary + Explanation
def summarize_pdf(file):
    if not session_state["user"]:
        return "⚠️ Please login first."
    text = extract_text_from_pdf(file)
    summary_prompt = f"Summarize the following text in bullet points:\n\n{text}"
    summary = generate_response(summary_prompt)
    explain_prompt = f"Explain the following for a 15-year-old student:\n\n{summary}"
    explanation = generate_response(explain_prompt)
    user = session_state["user"]["name"]
    users[user]["progress"]["PDF Summary"] = "Completed"
    save_users()
    return f"πŸ”Ή Summary:\n{summary}\n\nπŸ“˜ Explanation:\n{explanation}"

# πŸ” Utility
def generate_response(prompt):
    inputs = tokenizer(prompt, return_tensors="pt").to(device)
    outputs = model.generate(**inputs, max_new_tokens=300)
    return tokenizer.decode(outputs[0], skip_special_tokens=True)

# πŸ“ˆ View Progress
def view_progress():
    if not session_state["user"]:
        return "⚠️ Please login first."
    user = session_state["user"]["name"]
    progress = users[user]["progress"]
    return "\n".join([f"{k}: {v}" for k, v in progress.items()]) or "No progress yet."

# 🌐 Gradio UI
with gr.Blocks() as demo:
    gr.Markdown("## πŸŽ“ EduTutor AI with PDF, Quiz & Progress Tracker")

    with gr.Tab("πŸ” Register"):
        reg_username = gr.Textbox(label="Choose Username")
        reg_password = gr.Textbox(label="Choose Password", type="password")
        reg_role = gr.Dropdown(choices=["student", "teacher", "admin"], label="Role")
        reg_btn = gr.Button("Register")
        reg_status = gr.Textbox(label="Status", interactive=False)
        reg_btn.click(register, [reg_username, reg_password, reg_role], reg_status)

    with gr.Tab("πŸ”“ Login"):
        login_username = gr.Textbox(label="Username")
        login_password = gr.Textbox(label="Password", type="password")
        login_btn = gr.Button("Login")
        login_status = gr.Textbox(label="Status", interactive=False)
        login_btn.click(login, [login_username, login_password], login_status)

    with gr.Tab("πŸ“š AI Tutor"):
        subject = gr.Textbox(label="Subject (e.g. Math)")
        topic = gr.Textbox(label="Topic to explain")
        tutor_btn = gr.Button("Ask Tutor")
        tutor_out = gr.Textbox(label="Explanation")
        tutor_btn.click(ai_tutor, [subject, topic], tutor_out)

    with gr.Tab("πŸ“ Topic Quiz"):
        q_subject = gr.Textbox(label="Subject")
        q_topic = gr.Textbox(label="Topic")
        quiz_btn = gr.Button("Generate Quiz")
        quiz_out = gr.Textbox(label="Quiz")
        quiz_btn.click(generate_quiz, [q_subject, q_topic], quiz_out)

    with gr.Tab("πŸ“„ PDF Quiz"):
        pdf_file = gr.File(label="Upload PDF", type="binary")
        pdf_quiz_btn = gr.Button("Generate Quiz from PDF")
        pdf_quiz_out = gr.Textbox(label="PDF-based Quiz")
        pdf_quiz_btn.click(generate_quiz_from_pdf, inputs=pdf_file, outputs=pdf_quiz_out)

    with gr.Tab("πŸ“˜ PDF Summary"):
        pdf_sum_file = gr.File(label="Upload PDF", type="binary")
        sum_btn = gr.Button("Summarize & Explain")
        sum_out = gr.Textbox(label="Summary & Explanation")
        sum_btn.click(summarize_pdf, inputs=pdf_sum_file, outputs=sum_out)

    with gr.Tab("πŸ“ˆ Progress Tracker"):
        prog_btn = gr.Button("Show My Progress")
        prog_out = gr.Textbox(label="Progress")
        prog_btn.click(view_progress, outputs=prog_out)

    demo.launch(share=True)