Fra150's picture
Update app.py
0fe3545 verified
import os
from datetime import datetime
import random
import gradio as gr
from datasets import load_dataset, Dataset
from huggingface_hub import whoami
# Dataset corretto
EXAM_DATASET_ID = "huggingface-course/chapter_1_exam"
EXAM_MAX_QUESTIONS = 10
EXAM_PASSING_SCORE = 0.7
# Caricamento e mescolamento delle domande
ds = load_dataset(EXAM_DATASET_ID, split="train")
quiz_data = ds.to_pandas().to_dict("records")
random.shuffle(quiz_data)
quiz_data = quiz_data[:EXAM_MAX_QUESTIONS]
def on_user_logged_in(token):
if token is not None:
return [
gr.update(visible=False), gr.update(visible=True), gr.update(visible=False),
gr.update(visible=False), "", [],
"Click 'Start' to begin the quiz", 0, [], "", token
]
else:
return [
gr.update(visible=True), gr.update(visible=False), gr.update(visible=False),
gr.update(visible=False), "", [], "", 0, [], "", None
]
def push_results_to_hub(user_answers, token):
if token is None:
gr.Warning("Please log in to Hugging Face before pushing!")
return
correct_count = sum(1 for a in user_answers if a["is_correct"])
total_questions = len(user_answers)
grade = correct_count / total_questions if total_questions > 0 else 0
if grade < EXAM_PASSING_SCORE:
gr.Warning(f"Score {grade:.1%} below passing threshold of {EXAM_PASSING_SCORE:.1%}")
return f"You scored {grade:.1%}. Please try again to achieve at least {EXAM_PASSING_SCORE:.1%}"
gr.Info("Submitting answers to the Hub. Please wait...", duration=2)
user_info = whoami(token=token.token)
repo_id = f"{EXAM_DATASET_ID}_student_responses"
submission_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
new_ds = Dataset.from_list(user_answers)
new_ds = new_ds.map(lambda x: {
"username": user_info["name"],
"datetime": submission_time,
"grade": grade
})
new_ds.push_to_hub(repo_id)
return f"Your responses have been submitted to the Hub! Final grade: {grade:.1%}"
def handle_quiz(question_idx, user_answers, selected_answer, is_start):
if not is_start and question_idx < len(quiz_data):
current_q = quiz_data[question_idx]
correct_key = f"answer_{current_q['correct_answer']}".lower()
is_correct = selected_answer == current_q[correct_key]
user_answers.append({
"question": current_q["question"],
"selected_answer": selected_answer,
"correct_answer": current_q[correct_key],
"is_correct": is_correct,
"correct_reference": correct_key
})
question_idx += 1
if question_idx >= len(quiz_data):
correct_count = sum(1 for a in user_answers if a["is_correct"])
grade = correct_count / len(user_answers)
results_text = f"**Quiz Complete!**\n\nYour score: {grade:.1%}\nPassing score: {EXAM_PASSING_SCORE:.1%}\n"
return [
"", gr.update(choices=[], visible=False),
f"{'✅ Passed!' if grade >= EXAM_PASSING_SCORE else '❌ Did not pass'}",
question_idx, user_answers,
gr.update(visible=False), gr.update(visible=False), gr.update(visible=True),
results_text
]
q = quiz_data[question_idx]
return [
f"## Question {question_idx + 1}\n### {q['question']}",
gr.update(choices=[q["answer_a"], q["answer_b"], q["answer_c"], q["answer_d"]], value=None, visible=True),
"Select an answer and click 'Next' to continue.",
question_idx, user_answers,
gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), ""
]
def success_message(response):
return f"{response}\n\n**Success!**"
with gr.Blocks() as demo:
demo.title = f"Dataset Quiz for {EXAM_DATASET_ID}"
question_idx = gr.State(value=0)
user_answers = gr.State(value=[])
user_token = gr.State(value=None)
gr.Markdown(f"## Welcome to the {EXAM_DATASET_ID} Quiz")
gr.Markdown("Log in first, then click 'Start' to begin. Answer each question, click 'Next', and finally click 'Submit'.")
question_text = gr.Markdown("")
radio_choices = gr.Radio(choices=[], label="Your Answer", scale=1.5, visible=False)
status_text = gr.Markdown("")
final_markdown = gr.Markdown("")
login_btn = gr.LoginButton(visible=True)
start_btn = gr.Button("Start ⏭️", visible=True)
next_btn = gr.Button("Next ⏭️", visible=False)
submit_btn = gr.Button("Submit ✅", visible=False)
login_btn.click(
fn=on_user_logged_in,
inputs=None,
outputs=[login_btn, start_btn, next_btn, submit_btn, question_text, radio_choices,
status_text, question_idx, user_answers, final_markdown, user_token]
)
start_btn.click(
fn=handle_quiz,
inputs=[question_idx, user_answers, gr.State(""), gr.State(True)],
outputs=[question_text, radio_choices, status_text, question_idx, user_answers,
start_btn, next_btn, submit_btn, final_markdown]
)
next_btn.click(
fn=handle_quiz,
inputs=[question_idx, user_answers, radio_choices, gr.State(False)],
outputs=[question_text, radio_choices, status_text, question_idx, user_answers,
start_btn, next_btn, submit_btn, final_markdown]
)
submit_btn.click(
fn=push_results_to_hub,
inputs=[user_answers, user_token],
outputs=[final_markdown]
)
if __name__ == "__main__":
demo.launch()