RAMYASRI-39 commited on
Commit
d2cd47f
·
verified ·
1 Parent(s): 6a42df8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +139 -304
app.py CHANGED
@@ -1,10 +1,8 @@
1
  import gradio as gr
2
  from pathlib import Path
3
- from tempfile import NamedTemporaryFile
4
  from sentence_transformers import CrossEncoder
5
  import numpy as np
6
  from time import perf_counter
7
- import pandas as pd
8
  from pydantic import BaseModel, Field
9
  from phi.agent import Agent
10
  from phi.model.groq import Groq
@@ -66,32 +64,114 @@ def generate_quiz_data(question_difficulty, topic, documents_str):
66
  logger.error(f"Failed to generate quiz: {e}")
67
  return None
68
 
69
- def json_to_excel(quiz_data):
70
- data = []
71
- gr.Warning('Generating Shareable file link..', duration=30)
72
- for i, item in enumerate(quiz_data.items, 1):
73
- data.append([
74
- item.question,
75
- "Multiple Choice",
76
- item.choices[0],
77
- item.choices[1],
78
- item.choices[2],
79
- item.choices[3],
80
- '', # Option 5 (empty)
81
- item.correct_answer.replace('C', ''),
82
- 30,
83
- ''
84
- ])
85
- df = pd.DataFrame(data, columns=[
86
- "Question Text", "Question Type", "Option 1", "Option 2", "Option 3", "Option 4", "Option 5", "Correct Answer", "Time in seconds", "Image Link"
87
- ])
88
- temp_file = NamedTemporaryFile(delete=True, suffix=".xlsx")
89
- df.to_excel(temp_file.name, index=False)
90
- return temp_file.name
91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  colorful_theme = gr.themes.Default(primary_hue="cyan", secondary_hue="yellow", neutral_hue="purple")
93
 
94
  with gr.Blocks(title="Quiz Maker", theme=colorful_theme) as QUIZBOT:
 
95
  with gr.Row():
96
  with gr.Column(scale=2):
97
  gr.Image(value='logo.png', height=200, width=200)
@@ -100,294 +180,49 @@ with gr.Blocks(title="Quiz Maker", theme=colorful_theme) as QUIZBOT:
100
  <center>
101
  <h1><span style="color: purple;">GOVERNMENT HIGH SCHOOL,SUTHUKENY</span> STUDENTS QUIZBOT </h1>
102
  <h2>Generative AI-powered Capacity building for STUDENTS</h2>
103
- <i>⚠️ Students can create quiz from any topic from 9th Science and evaluate themselves! ⚠️</i>
104
  </center>
105
  """)
106
 
107
- topic = gr.Textbox(label="Enter the Topic for Quiz", placeholder="Write any topic/details from 9TH Science CBSE")
 
108
  with gr.Row():
109
  difficulty_radio = gr.Radio(["easy", "average", "hard"], label="How difficult should the quiz be?")
110
- model_radio = gr.Radio(choices=['(ACCURATE) BGE reranker'], value='(ACCURATE) BGE reranker', label="Embeddings") # Removed ColBERT option
111
 
112
  generate_quiz_btn = gr.Button("Generate Quiz!🚀")
113
  quiz_msg = gr.Textbox(label="Status", interactive=False)
114
- question_display = gr.HTML(visible=False)
115
- download_excel = gr.File(label="Download Excel")
116
-
117
- @generate_quiz_btn.click(inputs=[difficulty_radio, topic, model_radio], outputs=[quiz_msg, question_display, download_excel])
118
- def generate_quiz(question_difficulty, topic, cross_encoder):
119
- top_k_rank = 10
120
- documents = []
121
- gr.Warning('Generating Quiz may take 1-2 minutes. Please wait.', duration=60)
122
-
123
- document_start = perf_counter()
124
- query_vec = retriever.encode(topic)
125
- documents = [doc[TEXT_COLUMN_NAME] for doc in table.search(query_vec, vector_column_name=VECTOR_COLUMN_NAME).limit(top_k_rank).to_list()]
126
- if cross_encoder == '(ACCURATE) BGE reranker':
127
- cross_encoder1 = CrossEncoder('BAAI/bge-reranker-base')
128
- query_doc_pair = [[topic, doc] for doc in documents]
129
- cross_scores = cross_encoder1.predict(query_doc_pair)
130
- sim_scores_argsort = list(reversed(np.argsort(cross_scores)))
131
- documents = [documents[idx] for idx in sim_scores_argsort[:top_k_rank]]
132
-
133
- documents_str = '\n'.join(documents)
134
- quiz_data = generate_quiz_data(question_difficulty, topic, documents_str)
135
- if not quiz_data or not quiz_data.items:
136
- return ["Error: Failed to generate quiz.", gr.HTML(visible=False), None]
137
-
138
- excel_file = json_to_excel(quiz_data)
139
- html_content = "<div>" + "".join(f"<h3>{i}. {item.question}</h3><p>{'<br>'.join(item.choices)}</p>" for i, item in enumerate(quiz_data.items[:10], 1)) + "</div>"
140
- return ["Quiz Generated!", gr.HTML(value=html_content, visible=True), excel_file]
141
-
142
- check_button = gr.Button("Check Score")
143
- score_textbox = gr.Markdown()
144
-
145
- @check_button.click(inputs=question_display, outputs=score_textbox)
146
- def compare_answers(html_content):
147
- if not quiz_data or not quiz_data.items:
148
- return "Please generate a quiz first."
149
- # Placeholder for user answers (adjust based on actual UI implementation)
150
- user_answers = [] # Implement parsing logic if using radio inputs
151
- correct_answers = [item.correct_answer for item in quiz_data.items[:10]]
152
- score = sum(1 for u, c in zip(user_answers, correct_answers) if u == c)
153
- if score > 7:
154
- message = f"### Excellent! You got {score} out of 10!"
155
- elif score > 5:
156
- message = f"### Good! You got {score} out of 10!"
157
- else:
158
- message = f"### You got {score} out of 10! Don't worry. You can prepare well and try better next time!"
159
- return message
160
-
161
- if __name__ == "__main__":
162
- QUIZBOT.queue().launch(debug=True)
163
-
164
- # # Importing libraries
165
- # import pandas as pd
166
- # import json
167
- # import gradio as gr
168
- # from pathlib import Path
169
- # from ragatouille import RAGPretrainedModel
170
- # from gradio_client import Client
171
- # from tempfile import NamedTemporaryFile
172
- # from sentence_transformers import CrossEncoder
173
- # import numpy as np
174
- # from time import perf_counter
175
- # from sentence_transformers import CrossEncoder
176
-
177
- # #calling functions from other files - to call the knowledge database tables (lancedb for accurate mode) for creating quiz
178
- # from backend.semantic_search import table, retriever
179
-
180
- # VECTOR_COLUMN_NAME = "vector"
181
- # TEXT_COLUMN_NAME = "text"
182
- # proj_dir = Path.cwd()
183
-
184
- # # Set up logging
185
- # import logging
186
- # logging.basicConfig(level=logging.INFO)
187
- # logger = logging.getLogger(__name__)
188
-
189
- # # Replace Mixtral client with Qwen Client
190
- # client = Client("Qwen/Qwen1.5-110B-Chat-demo")
191
-
192
- # def system_instructions(question_difficulty, topic, documents_str):
193
- # return f"""<s> [INST] You are a great teacher and your task is to create 10 questions with 4 choices with {question_difficulty} difficulty about the topic request "{topic}" only from the below given documents, {documents_str}. Then create answers. Index in JSON format, the questions as "Q#":"" to "Q#":"", the four choices as "Q#:C1":"" to "Q#:C4":"", and the answers as "A#":"Q#:C#" to "A#":"Q#:C#". Example: 'A10':'Q10:C3' [/INST]"""
194
-
195
- # # Ragatouille database for Colbert ie highly accurate mode
196
- # RAG_db = gr.State()
197
- # quiz_data = None
198
-
199
-
200
- # #defining a function to convert json file to excel file
201
- # def json_to_excel(output_json):
202
- # # Initialize list for DataFrame
203
- # data = []
204
- # gr.Warning('Generating Shareable file link..', duration=30)
205
- # for i in range(1, 11): # Assuming there are 10 questions
206
- # question_key = f"Q{i}"
207
- # answer_key = f"A{i}"
208
-
209
- # question = output_json.get(question_key, '')
210
- # correct_answer_key = output_json.get(answer_key, '')
211
- # #correct_answer = correct_answer_key.split(':')[-1] if correct_answer_key else ''
212
- # correct_answer = correct_answer_key.split(':')[-1].replace('C', '').strip() if correct_answer_key else ''
213
-
214
- # # Extract options
215
- # option_keys = [f"{question_key}:C{i}" for i in range(1, 6)]
216
- # options = [output_json.get(key, '') for key in option_keys]
217
-
218
- # # Add data row
219
- # data.append([
220
- # question, # Question Text
221
- # "Multiple Choice", # Question Type
222
- # options[0], # Option 1
223
- # options[1], # Option 2
224
- # options[2] if len(options) > 2 else '', # Option 3
225
- # options[3] if len(options) > 3 else '', # Option 4
226
- # options[4] if len(options) > 4 else '', # Option 5
227
- # correct_answer, # Correct Answer
228
- # 30, # Time in seconds
229
- # '' # Image Link
230
- # ])
231
 
232
- # # Create DataFrame
233
- # df = pd.DataFrame(data, columns=[
234
- # "Question Text",
235
- # "Question Type",
236
- # "Option 1",
237
- # "Option 2",
238
- # "Option 3",
239
- # "Option 4",
240
- # "Option 5",
241
- # "Correct Answer",
242
- # "Time in seconds",
243
- # "Image Link"
244
- # ])
245
-
246
- # temp_file = NamedTemporaryFile(delete=False, suffix=".xlsx")
247
- # df.to_excel(temp_file.name, index=False)
248
- # return temp_file.name
249
- # # Define a colorful theme
250
- # colorful_theme = gr.themes.Default(
251
- # primary_hue="cyan", # Set a bright cyan as primary color
252
- # secondary_hue="yellow", # Set a bright magenta as secondary color
253
- # neutral_hue="purple" # Optionally set a neutral color
254
-
255
- # )
256
-
257
- # #gradio app creation for a user interface
258
- # with gr.Blocks(title="Quiz Maker", theme=colorful_theme) as QUIZBOT:
259
-
260
 
261
- # # Create a single row for the HTML and Image
262
- # with gr.Row():
263
- # with gr.Column(scale=2):
264
- # gr.Image(value='logo.png', height=200, width=200)
265
- # with gr.Column(scale=6):
266
- # gr.HTML("""
267
- # <center>
268
- # <h1><span style="color: purple;">GOVERNMENT HIGH SCHOOL,SUTHUKENY</span> STUDENTS QUIZBOT </h1>
269
- # <h2>Generative AI-powered Capacity building for STUDENTS</h2>
270
- # <i>⚠️ Students can create quiz from any topic from 10 science and evaluate themselves! ⚠️</i>
271
- # </center>
272
- # """)
273
-
274
-
275
-
276
-
277
- # topic = gr.Textbox(label="Enter the Topic for Quiz", placeholder="Write any CHAPTER NAME")
278
-
279
- # with gr.Row():
280
- # difficulty_radio = gr.Radio(["easy", "average", "hard"], label="How difficult should the quiz be?")
281
- # model_radio = gr.Radio(choices=[ '(ACCURATE) BGE reranker', '(HIGH ACCURATE) ColBERT'],
282
- # value='(ACCURATE) BGE reranker', label="Embeddings",
283
- # info="First query to ColBERT may take a little time")
284
-
285
- # generate_quiz_btn = gr.Button("Generate Quiz!🚀")
286
- # quiz_msg = gr.Textbox()
287
-
288
- # question_radios = [gr.Radio(visible=False) for _ in range(10)]
289
-
290
- # @generate_quiz_btn.click(inputs=[difficulty_radio, topic, model_radio], outputs=[quiz_msg] + question_radios + [gr.File(label="Download Excel")])
291
- # def generate_quiz(question_difficulty, topic, cross_encoder):
292
- # top_k_rank = 10
293
- # documents = []
294
- # gr.Warning('Generating Quiz may take 1-2 minutes. Please wait.', duration=60)
295
-
296
- # if cross_encoder == '(HIGH ACCURATE) ColBERT':
297
- # gr.Warning('Retrieving using ColBERT.. First-time query will take 2 minute for model to load.. please wait',duration=100)
298
- # RAG = RAGPretrainedModel.from_pretrained("colbert-ir/colbertv2.0")
299
- # RAG_db.value = RAG.from_index('.ragatouille/colbert/indexes/cbseclass10index')
300
- # documents_full = RAG_db.value.search(topic, k=top_k_rank)
301
- # documents = [item['content'] for item in documents_full]
302
-
303
- # else:
304
- # document_start = perf_counter()
305
- # query_vec = retriever.encode(topic)
306
- # doc1 = table.search(query_vec, vector_column_name=VECTOR_COLUMN_NAME).limit(top_k_rank)
307
-
308
- # documents = table.search(query_vec, vector_column_name=VECTOR_COLUMN_NAME).limit(top_k_rank).to_list()
309
- # documents = [doc[TEXT_COLUMN_NAME] for doc in documents]
310
-
311
- # query_doc_pair = [[topic, doc] for doc in documents]
312
-
313
- # # if cross_encoder == '(FAST) MiniLM-L6v2':
314
- # # cross_encoder1 = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
315
- # if cross_encoder == '(ACCURATE) BGE reranker':
316
- # cross_encoder1 = CrossEncoder('BAAI/bge-reranker-base')
317
-
318
- # cross_scores = cross_encoder1.predict(query_doc_pair)
319
- # sim_scores_argsort = list(reversed(np.argsort(cross_scores)))
320
- # documents = [documents[idx] for idx in sim_scores_argsort[:top_k_rank]]
321
-
322
- # #creating a text prompt to Qwen model combining the documents and system instruction
323
- # formatted_prompt = system_instructions(question_difficulty, topic, '\n'.join(documents))
324
- # print(' Formatted Prompt : ' ,formatted_prompt)
325
- # try:
326
- # response = client.predict(query=formatted_prompt, history=[], system="You are a helpful assistant.", api_name="/model_chat")
327
- # response1 = response[1][0][1]
328
-
329
- # # Extract JSON
330
- # start_index = response1.find('{')
331
- # end_index = response1.rfind('}')
332
- # cleaned_response = response1[start_index:end_index + 1] if start_index != -1 and end_index != -1 else ''
333
- # print('Cleaned Response :',cleaned_response)
334
- # output_json = json.loads(cleaned_response)
335
- # # Assign the extracted JSON to quiz_data for use in the comparison function
336
- # global quiz_data
337
- # quiz_data = output_json
338
- # # Generate the Excel file
339
- # excel_file = json_to_excel(output_json)
340
-
341
-
342
- # #Create a Quiz display in app
343
- # question_radio_list = []
344
- # for question_num in range(1, 11):
345
- # question_key = f"Q{question_num}"
346
- # answer_key = f"A{question_num}"
347
-
348
- # question = output_json.get(question_key)
349
- # answer = output_json.get(output_json.get(answer_key))
350
-
351
- # if not question or not answer:
352
- # continue
353
-
354
- # choice_keys = [f"{question_key}:C{i}" for i in range(1, 5)]
355
- # choice_list = [output_json.get(choice_key, "Choice not found") for choice_key in choice_keys]
356
-
357
- # radio = gr.Radio(choices=choice_list, label=question, visible=True, interactive=True)
358
- # question_radio_list.append(radio)
359
-
360
- # return ['Quiz Generated!'] + question_radio_list + [excel_file]
361
-
362
- # except json.JSONDecodeError as e:
363
- # print(f"Failed to decode JSON: {e}")
364
-
365
- # check_button = gr.Button("Check Score")
366
- # score_textbox = gr.Markdown()
367
-
368
- # @check_button.click(inputs=question_radios, outputs=score_textbox)
369
- # def compare_answers(*user_answers):
370
- # user_answer_list = list(user_answers)
371
- # answers_list = []
372
-
373
- # for question_num in range(1, 11):
374
- # answer_key = f"A{question_num}"
375
- # answer = quiz_data.get(quiz_data.get(answer_key))
376
- # if not answer:
377
- # break
378
- # answers_list.append(answer)
379
-
380
- # score = sum(1 for item in user_answer_list if item in answers_list)
381
-
382
- # if score > 7:
383
- # message = f"### Excellent! You got {score} out of 10!"
384
- # elif score > 5:
385
- # message = f"### Good! You got {score} out of 10!"
386
- # else:
387
- # message = f"### You got {score} out of 10! Don't worry. You can prepare well and try better next time!"
388
-
389
- # return message
390
-
391
- # QUIZBOT.queue()
392
- # QUIZBOT.launch(debug=True)
393
 
 
 
 
1
  import gradio as gr
2
  from pathlib import Path
 
3
  from sentence_transformers import CrossEncoder
4
  import numpy as np
5
  from time import perf_counter
 
6
  from pydantic import BaseModel, Field
7
  from phi.agent import Agent
8
  from phi.model.groq import Groq
 
64
  logger.error(f"Failed to generate quiz: {e}")
65
  return None
66
 
67
+ def retrieve_and_generate_quiz(question_difficulty, topic):
68
+ gr.Warning('Generating quiz may take 1-2 minutes. Please wait.', duration=60)
69
+ top_k_rank = 10
70
+ documents = []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
 
72
+ document_start = perf_counter()
73
+ query_vec = retriever.encode(topic)
74
+ documents = [doc[TEXT_COLUMN_NAME] for doc in table.search(query_vec, vector_column_name=VECTOR_COLUMN_NAME).limit(top_k_rank).to_list()]
75
+
76
+ # Apply BGE reranker
77
+ cross_encoder = CrossEncoder('BAAI/bge-reranker-base')
78
+ query_doc_pair = [[topic, doc] for doc in documents]
79
+ cross_scores = cross_encoder.predict(query_doc_pair)
80
+ sim_scores_argsort = list(reversed(np.argsort(cross_scores)))
81
+ documents = [documents[idx] for idx in sim_scores_argsort[:top_k_rank]]
82
+
83
+ documents_str = '\n'.join(documents)
84
+ quiz_data = generate_quiz_data(question_difficulty, topic, documents_str)
85
+ return quiz_data
86
+
87
+ def update_quiz_components(quiz_data):
88
+ if not quiz_data or not quiz_data.items:
89
+ return [gr.update(visible=False) for _ in range(10)] + [gr.update(value="Error: Failed to generate quiz.", visible=True)]
90
+
91
+ radio_updates = []
92
+ for i, item in enumerate(quiz_data.items[:10]):
93
+ choices = item.choices
94
+ radio_update = gr.update(visible=True, choices=choices, label=item.question, value=None)
95
+ radio_updates.append(radio_update)
96
+ return radio_updates + [gr.update(value="Please select answers and click 'Check Score'.", visible=True)]
97
+
98
+ # FIXED FUNCTION: Changed parameter signature to accept all arguments positionally
99
+ def collect_answers_and_calculate(*all_inputs):
100
+ print(f"Total inputs received: {len(all_inputs)}") # Debug print
101
+
102
+ # The last input is quiz_data, the first 10 are radio values
103
+ radio_values = all_inputs[:10] # First 10 inputs are radio button values
104
+ quiz_data = all_inputs[10] # Last input is quiz_data
105
+
106
+ print(f"Received radio_values: {radio_values}") # Debug print
107
+ print(f"Received quiz_data: {quiz_data}") # Debug print
108
+
109
+ # Calculate score by comparing user answers with correct answers
110
+ score = 0
111
+ answered_questions = 0
112
+
113
+ for i, (user_answer, quiz_item) in enumerate(zip(radio_values, quiz_data.items[:10])):
114
+ if user_answer is not None: # Only count if user answered
115
+ answered_questions += 1
116
+
117
+ # Convert correct answer code (e.g., 'C3') to actual choice text
118
+ correct_answer_index = int(quiz_item.correct_answer[1]) - 1 # 'C3' -> index 2
119
+ correct_answer_text = quiz_item.choices[correct_answer_index]
120
+
121
+ print(f"Q{i+1}: User='{user_answer}' vs Correct='{correct_answer_text}'") # Debug
122
+
123
+ if user_answer == correct_answer_text:
124
+ score += 1
125
+
126
+ print(f"Calculated score: {score}/{answered_questions}") # Debug print
127
+
128
+ # Create colorful HTML message
129
+ if answered_questions == 0:
130
+ html_message = """
131
+ <div style="text-align: center; padding: 20px; border-radius: 10px; background: linear-gradient(135deg, #ff6b6b, #ee5a24);">
132
+ <h2 style="color: white; margin: 0;">⚠️ Please answer at least one question!</h2>
133
+ </div>
134
+ """
135
+ elif score == answered_questions:
136
+ html_message = f"""
137
+ <div style="text-align: center; padding: 20px; border-radius: 10px; background: linear-gradient(135deg, #00d2d3, #54a0ff); box-shadow: 0 4px 15px rgba(0,0,0,0.2);">
138
+ <h1 style="color: white; margin: 0; text-shadow: 2px 2px 4px rgba(0,0,0,0.3);">🏆 PERFECT SCORE! 🏆</h1>
139
+ <h2 style="color: #fff3cd; margin: 10px 0;">You got {score} out of {answered_questions} correct!</h2>
140
+ <p style="color: white; font-size: 18px; margin: 0;">Outstanding performance! 🌟</p>
141
+ </div>
142
+ """
143
+ elif score > answered_questions * 0.7:
144
+ html_message = f"""
145
+ <div style="text-align: center; padding: 20px; border-radius: 10px; background: linear-gradient(135deg, #2ed573, #7bed9f); box-shadow: 0 4px 15px rgba(0,0,0,0.2);">
146
+ <h1 style="color: white; margin: 0; text-shadow: 2px 2px 4px rgba(0,0,0,0.3);">🎉 EXCELLENT! 🎉</h1>
147
+ <h2 style="color: #fff3cd; margin: 10px 0;">You got {score} out of {answered_questions} correct!</h2>
148
+ <p style="color: white; font-size: 18px; margin: 0;">Great job! Keep it up! 💪</p>
149
+ </div>
150
+ """
151
+ elif score > answered_questions * 0.5:
152
+ html_message = f"""
153
+ <div style="text-align: center; padding: 20px; border-radius: 10px; background: linear-gradient(135deg, #ffa726, #ffcc02); box-shadow: 0 4px 15px rgba(0,0,0,0.2);">
154
+ <h1 style="color: white; margin: 0; text-shadow: 2px 2px 4px rgba(0,0,0,0.3);">👍 GOOD JOB! 👍</h1>
155
+ <h2 style="color: #fff3cd; margin: 10px 0;">You got {score} out of {answered_questions} correct!</h2>
156
+ <p style="color: white; font-size: 18px; margin: 0;">Well done! Room for improvement! 📚</p>
157
+ </div>
158
+ """
159
+ else:
160
+ html_message = f"""
161
+ <div style="text-align: center; padding: 20px; border-radius: 10px; background: linear-gradient(135deg, #ff7675, #fd79a8); box-shadow: 0 4px 15px rgba(0,0,0,0.2);">
162
+ <h1 style="color: white; margin: 0; text-shadow: 2px 2px 4px rgba(0,0,0,0.3);">💪 KEEP TRYING! 💪</h1>
163
+ <h2 style="color: #fff3cd; margin: 10px 0;">You got {score} out of {answered_questions} correct!</h2>
164
+ <p style="color: white; font-size: 18px; margin: 0;">Don't worry! Practice makes perfect! 📖✨</p>
165
+ </div>
166
+ """
167
+
168
+ return html_message
169
+
170
+ # Define a colorful theme
171
  colorful_theme = gr.themes.Default(primary_hue="cyan", secondary_hue="yellow", neutral_hue="purple")
172
 
173
  with gr.Blocks(title="Quiz Maker", theme=colorful_theme) as QUIZBOT:
174
+ # Create a single row for the HTML and Image
175
  with gr.Row():
176
  with gr.Column(scale=2):
177
  gr.Image(value='logo.png', height=200, width=200)
 
180
  <center>
181
  <h1><span style="color: purple;">GOVERNMENT HIGH SCHOOL,SUTHUKENY</span> STUDENTS QUIZBOT </h1>
182
  <h2>Generative AI-powered Capacity building for STUDENTS</h2>
183
+ <i>⚠️ Students can create quiz from any topic from 10th Science and evaluate themselves! ⚠️</i>
184
  </center>
185
  """)
186
 
187
+ topic = gr.Textbox(label="Enter the Topic for Quiz", placeholder="Write any CHAPTER NAME")
188
+
189
  with gr.Row():
190
  difficulty_radio = gr.Radio(["easy", "average", "hard"], label="How difficult should the quiz be?")
191
+ model_radio = gr.Radio(choices=['(ACCURATE) BGE reranker'], value='(ACCURATE) BGE reranker', label="Embeddings")
192
 
193
  generate_quiz_btn = gr.Button("Generate Quiz!🚀")
194
  quiz_msg = gr.Textbox(label="Status", interactive=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
 
196
+ # Pre-defined radio buttons for 10 questions
197
+ question_radios = [gr.Radio(visible=False, label="", choices=[""], value=None) for _ in range(10)]
198
+ quiz_data_state = gr.State(value=None)
199
+ check_score_btn = gr.Button("Check Score", variant="primary", size="lg")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
 
201
+ # HTML output for colorful score display at bottom
202
+ score_output = gr.HTML(visible=False, label="Your Results")
203
+
204
+ # Register the click event for Generate Quiz without @ decorator
205
+ generate_quiz_btn.click(
206
+ fn=retrieve_and_generate_quiz,
207
+ inputs=[difficulty_radio, topic],
208
+ outputs=[quiz_data_state]
209
+ ).then(
210
+ fn=update_quiz_components,
211
+ inputs=[quiz_data_state],
212
+ outputs=question_radios + [quiz_msg]
213
+ )
214
+
215
+ # FIXED: Register the click event for Check Score with correct input handling
216
+ check_score_btn.click(
217
+ fn=collect_answers_and_calculate,
218
+ inputs=question_radios + [quiz_data_state], # This creates a list of 11 inputs
219
+ outputs=[score_output],
220
+ api_name="check_score"
221
+ ).then(
222
+ fn=lambda: gr.update(visible=True), # Make score output visible after calculation
223
+ inputs=[],
224
+ outputs=[score_output]
225
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
 
227
+ if __name__ == "__main__":
228
+ QUIZBOT.queue().launch(server_name="0.0.0.0", server_port=7860)# import gradio as gr