burtenshaw commited on
Commit
d5f098f
·
1 Parent(s): 1258179

add max questions and passing grade functionality

Browse files
Files changed (1) hide show
  1. app.py +41 -12
app.py CHANGED
@@ -1,5 +1,6 @@
1
  import os
2
  from datetime import datetime
 
3
 
4
  import gradio as gr
5
  from datasets import load_dataset, Dataset
@@ -7,11 +8,18 @@ from huggingface_hub import whoami
7
 
8
 
9
  EXAM_DATASET_ID = os.getenv("EXAM_DATASET_ID") or "agents-course/unit_1_quiz"
 
 
10
 
11
  ds = load_dataset(EXAM_DATASET_ID, split="train")
12
 
13
- # Convert dataset to a list of dicts so we can iterate similarly to quiz_data
14
- quiz_data = ds.to_pandas().to_dict("records") # or use a for-loop if you prefer
 
 
 
 
 
15
 
16
 
17
  def on_user_logged_in(token: gr.OAuthToken | None):
@@ -29,25 +37,39 @@ def on_user_logged_in(token: gr.OAuthToken | None):
29
  def push_results_to_hub(user_answers, token: gr.OAuthToken | None):
30
  """
31
  Create a new dataset from user_answers and push it to the Hub.
32
- We use the user's HF token to determine the correct repo.
33
- If no one is logged in, we'll return an error message.
34
  """
35
  if token is None:
36
  gr.Warning("Please log in to Hugging Face before pushing!")
37
  return
38
- else:
39
- gr.Info("Submitting answers to the Hub. Please wait...", duration=2)
 
 
 
 
 
 
 
 
 
 
 
40
 
41
  user_info = whoami(token=token.token)
42
- repo_id = f"{EXAM_DATASET_ID}_student_responses" # e.g. 'myUsername/quiz-responses'
43
  submission_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
44
 
45
  new_ds = Dataset.from_list(user_answers)
46
  new_ds = new_ds.map(
47
- lambda x: {"username": user_info["name"], "datetime": submission_time}
 
 
 
 
48
  )
49
  new_ds.push_to_hub(repo_id)
50
- gr.Success("Your responses have been submitted to the Hub!")
51
 
52
 
53
  def handle_quiz(question_idx, user_answers, selected_answer, is_start):
@@ -83,15 +105,22 @@ def handle_quiz(question_idx, user_answers, selected_answer, is_start):
83
 
84
  # If we've reached the end, show final results
85
  if question_idx >= len(quiz_data):
86
- final_text = f"**All questions answered!**\n\nHere are your selections:\n\n{user_answers}"
 
 
 
 
 
 
 
87
  return (
88
  "", # question_text becomes blank
89
  gr.update(choices=[], visible=False),
90
- "", # status_text (can clear or reuse)
91
  question_idx,
92
  user_answers,
93
  start_btn_update,
94
- gr.update(value=final_text, visible=True), # show final_markdown
95
  )
96
  else:
97
  # Otherwise, show the next question
 
1
  import os
2
  from datetime import datetime
3
+ import random
4
 
5
  import gradio as gr
6
  from datasets import load_dataset, Dataset
 
8
 
9
 
10
  EXAM_DATASET_ID = os.getenv("EXAM_DATASET_ID") or "agents-course/unit_1_quiz"
11
+ EXAM_MAX_QUESTIONS = os.getenv("EXAM_MAX_QUESTIONS") or 10
12
+ EXAM_PASSING_SCORE = os.getenv("EXAM_PASSING_SCORE") or 0.7
13
 
14
  ds = load_dataset(EXAM_DATASET_ID, split="train")
15
 
16
+ # Convert dataset to a list of dicts and randomly sort
17
+ quiz_data = ds.to_pandas().to_dict("records")
18
+ random.shuffle(quiz_data)
19
+
20
+ # Limit to max questions if specified
21
+ if EXAM_MAX_QUESTIONS:
22
+ quiz_data = quiz_data[: int(EXAM_MAX_QUESTIONS)]
23
 
24
 
25
  def on_user_logged_in(token: gr.OAuthToken | None):
 
37
  def push_results_to_hub(user_answers, token: gr.OAuthToken | None):
38
  """
39
  Create a new dataset from user_answers and push it to the Hub.
40
+ Calculates grade and checks against passing threshold.
 
41
  """
42
  if token is None:
43
  gr.Warning("Please log in to Hugging Face before pushing!")
44
  return
45
+
46
+ # Calculate grade
47
+ correct_count = sum(1 for answer in user_answers if answer["is_correct"])
48
+ total_questions = len(user_answers)
49
+ grade = correct_count / total_questions if total_questions > 0 else 0
50
+
51
+ if grade < float(EXAM_PASSING_SCORE):
52
+ gr.Warning(
53
+ f"Score {grade:.1%} below passing threshold of {float(EXAM_PASSING_SCORE):.1%}"
54
+ )
55
+ return f"You scored {grade:.1%}. Please try again to achieve at least {float(EXAM_PASSING_SCORE):.1%}"
56
+
57
+ gr.Info("Submitting answers to the Hub. Please wait...", duration=2)
58
 
59
  user_info = whoami(token=token.token)
60
+ repo_id = f"{EXAM_DATASET_ID}_student_responses"
61
  submission_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
62
 
63
  new_ds = Dataset.from_list(user_answers)
64
  new_ds = new_ds.map(
65
+ lambda x: {
66
+ "username": user_info["name"],
67
+ "datetime": submission_time,
68
+ "grade": grade,
69
+ }
70
  )
71
  new_ds.push_to_hub(repo_id)
72
+ return f"Your responses have been submitted to the Hub! Final grade: {grade:.1%}"
73
 
74
 
75
  def handle_quiz(question_idx, user_answers, selected_answer, is_start):
 
105
 
106
  # If we've reached the end, show final results
107
  if question_idx >= len(quiz_data):
108
+ correct_count = sum(1 for answer in user_answers if answer["is_correct"])
109
+ grade = correct_count / len(user_answers)
110
+ results_text = (
111
+ f"**Quiz Complete!**\n\n"
112
+ f"Your score: {grade:.1%}\n"
113
+ f"Passing score: {float(EXAM_PASSING_SCORE):.1%}\n\n"
114
+ f"Your answers:\n\n{user_answers}"
115
+ )
116
  return (
117
  "", # question_text becomes blank
118
  gr.update(choices=[], visible=False),
119
+ f"{'✅ Passed!' if grade >= float(EXAM_PASSING_SCORE) else '❌ Did not pass'}",
120
  question_idx,
121
  user_answers,
122
  start_btn_update,
123
+ gr.update(value=results_text, visible=True), # show final_markdown
124
  )
125
  else:
126
  # Otherwise, show the next question