Update app.py
Browse files
app.py
CHANGED
@@ -5,16 +5,15 @@ from dotenv import load_dotenv
|
|
5 |
import pandas as pd
|
6 |
import numpy as np
|
7 |
from sklearn.ensemble import RandomForestClassifier
|
8 |
-
from sklearn.preprocessing import LabelEncoder
|
9 |
from sentence_transformers import SentenceTransformer, util
|
10 |
|
11 |
-
# Load
|
12 |
load_dotenv()
|
13 |
HF_TOKEN = os.getenv("HF_TOKEN")
|
14 |
-
|
15 |
headers = {"Authorization": f"Bearer {HF_TOKEN}"}
|
16 |
|
17 |
-
# -----------------
|
|
|
18 |
def generate_quiz(text, num_questions):
|
19 |
API_URL = "https://api-inference.huggingface.co/models/mrm8488/t5-base-finetuned-question-generation-ap"
|
20 |
payload = {"inputs": f"generate questions: {text}", "parameters": {"max_length": 256}}
|
@@ -25,7 +24,6 @@ def generate_quiz(text, num_questions):
|
|
25 |
except:
|
26 |
return "β οΈ Failed to generate quiz. Try again later."
|
27 |
|
28 |
-
# ----------------- AI TEACHING ASSISTANT -----------------
|
29 |
def get_bot_response(query):
|
30 |
API_URL = "https://api-inference.huggingface.co/models/HuggingFaceH4/zephyr-7b-beta"
|
31 |
payload = {"inputs": f"Student: {query}\nAI:", "parameters": {"max_new_tokens": 150}}
|
@@ -35,7 +33,6 @@ def get_bot_response(query):
|
|
35 |
except:
|
36 |
return "β οΈ AI Assistant unavailable right now."
|
37 |
|
38 |
-
# ----------------- SUMMARIZER -----------------
|
39 |
def summarize_text(text):
|
40 |
API_URL = "https://api-inference.huggingface.co/models/facebook/bart-large-cnn"
|
41 |
payload = {"inputs": text, "parameters": {"max_length": 120}}
|
@@ -45,7 +42,6 @@ def summarize_text(text):
|
|
45 |
except:
|
46 |
return "β οΈ Unable to summarize content."
|
47 |
|
48 |
-
# ----------------- TRANSLATOR -----------------
|
49 |
def translate_text(text, target_lang="te"):
|
50 |
API_URL = "https://libretranslate.de/translate"
|
51 |
payload = {
|
@@ -60,14 +56,12 @@ def translate_text(text, target_lang="te"):
|
|
60 |
except:
|
61 |
return "β οΈ Translation failed."
|
62 |
|
63 |
-
# ----------------- PLAGIARISM CHECKER -----------------
|
64 |
def check_plagiarism(text1, text2):
|
65 |
model = SentenceTransformer('all-MiniLM-L6-v2')
|
66 |
embeddings = model.encode([text1, text2], convert_to_tensor=True)
|
67 |
similarity = util.pytorch_cos_sim(embeddings[0], embeddings[1]).item()
|
68 |
return f"Similarity Score: {similarity:.2f}\n{('β οΈ Possible Plagiarism' if similarity > 0.75 else 'β
No significant overlap')}"
|
69 |
|
70 |
-
# ----------------- WEAKNESS ANALYZER -----------------
|
71 |
def analyze_weakness(file):
|
72 |
try:
|
73 |
df = pd.read_csv(file.name)
|
@@ -77,16 +71,14 @@ def analyze_weakness(file):
|
|
77 |
except:
|
78 |
return "β οΈ Failed to analyze file. Ensure it contains 'Topic' and 'Score' columns."
|
79 |
|
80 |
-
# ----------------- ENGAGEMENT PREDICTOR -----------------
|
81 |
def predict_engagement(attendance, login_freq, video_watch):
|
82 |
X = np.array([[attendance, login_freq, video_watch]])
|
83 |
-
y = [0, 1, 1, 0, 1]
|
84 |
X_train = np.array([[90, 5, 80], [85, 4, 90], [95, 6, 85], [60, 2, 40], [88, 3, 75]])
|
85 |
clf = RandomForestClassifier().fit(X_train, y)
|
86 |
prediction = clf.predict(X)[0]
|
87 |
return "β
Likely to be Engaged" if prediction else "β οΈ At Risk of Disengagement"
|
88 |
|
89 |
-
# ----------------- BADGE GENERATOR -----------------
|
90 |
def generate_badge(score, speed):
|
91 |
if score >= 90 and speed <= 30:
|
92 |
return "π
Gold Badge"
|
@@ -95,61 +87,63 @@ def generate_badge(score, speed):
|
|
95 |
else:
|
96 |
return "π₯ Bronze Badge"
|
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 |
-
gr.
|
|
|
|
|
|
5 |
import pandas as pd
|
6 |
import numpy as np
|
7 |
from sklearn.ensemble import RandomForestClassifier
|
|
|
8 |
from sentence_transformers import SentenceTransformer, util
|
9 |
|
10 |
+
# Load Hugging Face token
|
11 |
load_dotenv()
|
12 |
HF_TOKEN = os.getenv("HF_TOKEN")
|
|
|
13 |
headers = {"Authorization": f"Bearer {HF_TOKEN}"}
|
14 |
|
15 |
+
# ----------------- FEATURE FUNCTIONS -----------------
|
16 |
+
|
17 |
def generate_quiz(text, num_questions):
|
18 |
API_URL = "https://api-inference.huggingface.co/models/mrm8488/t5-base-finetuned-question-generation-ap"
|
19 |
payload = {"inputs": f"generate questions: {text}", "parameters": {"max_length": 256}}
|
|
|
24 |
except:
|
25 |
return "β οΈ Failed to generate quiz. Try again later."
|
26 |
|
|
|
27 |
def get_bot_response(query):
|
28 |
API_URL = "https://api-inference.huggingface.co/models/HuggingFaceH4/zephyr-7b-beta"
|
29 |
payload = {"inputs": f"Student: {query}\nAI:", "parameters": {"max_new_tokens": 150}}
|
|
|
33 |
except:
|
34 |
return "β οΈ AI Assistant unavailable right now."
|
35 |
|
|
|
36 |
def summarize_text(text):
|
37 |
API_URL = "https://api-inference.huggingface.co/models/facebook/bart-large-cnn"
|
38 |
payload = {"inputs": text, "parameters": {"max_length": 120}}
|
|
|
42 |
except:
|
43 |
return "β οΈ Unable to summarize content."
|
44 |
|
|
|
45 |
def translate_text(text, target_lang="te"):
|
46 |
API_URL = "https://libretranslate.de/translate"
|
47 |
payload = {
|
|
|
56 |
except:
|
57 |
return "β οΈ Translation failed."
|
58 |
|
|
|
59 |
def check_plagiarism(text1, text2):
|
60 |
model = SentenceTransformer('all-MiniLM-L6-v2')
|
61 |
embeddings = model.encode([text1, text2], convert_to_tensor=True)
|
62 |
similarity = util.pytorch_cos_sim(embeddings[0], embeddings[1]).item()
|
63 |
return f"Similarity Score: {similarity:.2f}\n{('β οΈ Possible Plagiarism' if similarity > 0.75 else 'β
No significant overlap')}"
|
64 |
|
|
|
65 |
def analyze_weakness(file):
|
66 |
try:
|
67 |
df = pd.read_csv(file.name)
|
|
|
71 |
except:
|
72 |
return "β οΈ Failed to analyze file. Ensure it contains 'Topic' and 'Score' columns."
|
73 |
|
|
|
74 |
def predict_engagement(attendance, login_freq, video_watch):
|
75 |
X = np.array([[attendance, login_freq, video_watch]])
|
76 |
+
y = [0, 1, 1, 0, 1]
|
77 |
X_train = np.array([[90, 5, 80], [85, 4, 90], [95, 6, 85], [60, 2, 40], [88, 3, 75]])
|
78 |
clf = RandomForestClassifier().fit(X_train, y)
|
79 |
prediction = clf.predict(X)[0]
|
80 |
return "β
Likely to be Engaged" if prediction else "β οΈ At Risk of Disengagement"
|
81 |
|
|
|
82 |
def generate_badge(score, speed):
|
83 |
if score >= 90 and speed <= 30:
|
84 |
return "π
Gold Badge"
|
|
|
87 |
else:
|
88 |
return "π₯ Bronze Badge"
|
89 |
|
90 |
+
# ----------------- UI -----------------
|
91 |
+
with gr.Blocks(title="Smart LMS AI Suite") as app:
|
92 |
+
|
93 |
+
with gr.Tab("π§ Quiz Generator"):
|
94 |
+
quiz_text = gr.Textbox(label="Paste Topic Content")
|
95 |
+
quiz_slider = gr.Slider(1, 10, label="Number of Questions", value=3)
|
96 |
+
quiz_output = gr.Textbox(label="Generated Quiz")
|
97 |
+
quiz_button = gr.Button("Generate Quiz")
|
98 |
+
quiz_button.click(fn=generate_quiz, inputs=[quiz_text, quiz_slider], outputs=quiz_output)
|
99 |
+
|
100 |
+
with gr.Tab("π€ AI Teaching Assistant"):
|
101 |
+
bot_input = gr.Textbox(label="Ask a Question")
|
102 |
+
bot_output = gr.Textbox(label="AI Answer")
|
103 |
+
bot_button = gr.Button("Get Answer")
|
104 |
+
bot_button.click(fn=get_bot_response, inputs=bot_input, outputs=bot_output)
|
105 |
+
|
106 |
+
with gr.Tab("π Summarizer"):
|
107 |
+
sum_input = gr.Textbox(label="Paste Content")
|
108 |
+
sum_output = gr.Textbox(label="Summary")
|
109 |
+
sum_button = gr.Button("Summarize")
|
110 |
+
sum_button.click(fn=summarize_text, inputs=sum_input, outputs=sum_output)
|
111 |
+
|
112 |
+
with gr.Tab("π Translator"):
|
113 |
+
trans_input = gr.Textbox(label="Text in English")
|
114 |
+
lang_dropdown = gr.Dropdown(["te", "hi", "ta", "fr"], value="te", label="Target Language Code")
|
115 |
+
trans_output = gr.Textbox(label="Translated Text")
|
116 |
+
trans_button = gr.Button("Translate")
|
117 |
+
trans_button.click(fn=translate_text, inputs=[trans_input, lang_dropdown], outputs=trans_output)
|
118 |
+
|
119 |
+
with gr.Tab("π§Ύ Plagiarism Checker"):
|
120 |
+
plag_1 = gr.Textbox(label="Document 1")
|
121 |
+
plag_2 = gr.Textbox(label="Document 2")
|
122 |
+
plag_out = gr.Textbox(label="Result")
|
123 |
+
plag_btn = gr.Button("Check Plagiarism")
|
124 |
+
plag_btn.click(fn=check_plagiarism, inputs=[plag_1, plag_2], outputs=plag_out)
|
125 |
+
|
126 |
+
with gr.Tab("π Weakness Analyzer"):
|
127 |
+
csv_input = gr.File(label="Upload CSV with 'Topic' and 'Score' Columns")
|
128 |
+
weak_out = gr.Textbox(label="Weak Topics")
|
129 |
+
weak_btn = gr.Button("Analyze")
|
130 |
+
weak_btn.click(fn=analyze_weakness, inputs=csv_input, outputs=weak_out)
|
131 |
+
|
132 |
+
with gr.Tab("π Engagement Predictor"):
|
133 |
+
att = gr.Slider(0, 100, value=85, label="Attendance %")
|
134 |
+
login = gr.Slider(0, 10, value=5, label="Login Frequency")
|
135 |
+
video = gr.Slider(0, 100, value=80, label="Video Watch %")
|
136 |
+
engage_out = gr.Textbox(label="Prediction")
|
137 |
+
engage_btn = gr.Button("Predict")
|
138 |
+
engage_btn.click(fn=predict_engagement, inputs=[att, login, video], outputs=engage_out)
|
139 |
+
|
140 |
+
with gr.Tab("π
Badge Generator"):
|
141 |
+
score = gr.Slider(0, 100, label="Score")
|
142 |
+
speed = gr.Slider(0, 60, label="Time Taken (mins)")
|
143 |
+
badge_out = gr.Textbox(label="Badge Awarded")
|
144 |
+
badge_btn = gr.Button("Generate Badge")
|
145 |
+
badge_btn.click(fn=generate_badge, inputs=[score, speed], outputs=badge_out)
|
146 |
+
|
147 |
+
gr.Markdown("π Built using Hugging Face, Gradio, and Free APIs")
|
148 |
+
|
149 |
+
app.launch()
|