Spaces:
Running
Running
import gradio as gr | |
from groq import Groq | |
import os | |
from PIL import Image, ImageDraw, ImageFont | |
from datetime import datetime | |
import json | |
import tempfile | |
# Initialize Groq client | |
client = Groq( | |
api_key=os.getenv("GROQ_API_KEY") | |
) | |
class QuizApp: | |
def __init__(self): | |
self.current_questions = [] | |
self.user_data = {} | |
def generate_questions(self, text, num_questions): | |
prompt = f"""Create {num_questions} multiple choice questions based on this text: | |
{text} | |
Each question should: | |
1. Have a clear, concise question text | |
2. Have exactly 4 options | |
3. Have only one correct answer | |
4. Be educational and test understanding | |
Return in this exact JSON format: | |
[ | |
{{ | |
"question": "What is the main topic discussed?", | |
"options": [ | |
"Correct answer", | |
"Wrong answer 1", | |
"Wrong answer 2", | |
"Wrong answer 3" | |
], | |
"correct_answer": 0 | |
}} | |
]""" | |
try: | |
response = client.chat.completions.create( | |
messages=[ | |
{"role": "system", "content": "You are a quiz generator that creates clear, single-choice questions."}, | |
{"role": "user", "content": prompt} | |
], | |
model="llama-3.2-3b-preview", | |
temperature=0.5, | |
max_tokens=2048 | |
) | |
response_text = response.choices[0].message.content.strip() | |
response_text = response_text.replace("```json", "").replace("```", "").strip() | |
questions = json.loads(response_text) | |
self.current_questions = questions | |
return questions | |
except Exception as e: | |
print(f"Error generating questions: {e}") | |
return [] | |
def calculate_score(self, answers): | |
try: | |
if not answers or not self.current_questions: | |
return 0 | |
total = len(self.current_questions) | |
correct = sum(1 for q, a in zip(self.current_questions, answers) | |
if a is not None and q['correct_answer'] == a) | |
return (correct / total) * 100 | |
except Exception as e: | |
print(f"Error calculating score: {e}") | |
return 0 | |
# Certificate generation method remains the same | |
def create_quiz_interface(): | |
quiz_app = QuizApp() | |
def create_question_blocks(questions): | |
blocks = [] | |
if not questions: | |
return blocks | |
for i, q in enumerate(questions, 1): | |
with gr.Group(visible=True) as group: | |
gr.Markdown(f"### Question {i}") | |
gr.Markdown(q["question"]) | |
radio = gr.Radio( | |
choices=q["options"], | |
label=f"Select your answer for Question {i}", | |
interactive=True | |
) | |
blocks.append(radio) | |
return blocks | |
def generate_and_display_questions(text, num_questions): | |
try: | |
questions = quiz_app.generate_questions(text, num_questions) | |
if not questions: | |
return [], gr.Markdown("Failed to generate questions. Please try again."), [], 0 | |
blocks = create_question_blocks(questions) | |
return blocks, gr.Markdown(""), questions, 1 | |
except Exception as e: | |
print(f"Error in generate_and_display_questions: {e}") | |
return [], gr.Markdown("An error occurred. Please try again."), [], 0 | |
def submit_answers(answers, questions): | |
try: | |
score = quiz_app.calculate_score(answers) | |
return score, 2 | |
except Exception as e: | |
print(f"Error in submit_answers: {e}") | |
return 0, 2 | |
with gr.Blocks(title="CertifyMe AI", theme=gr.themes.Soft()) as demo: | |
# State management | |
current_tab = gr.State(0) | |
stored_questions = gr.State([]) | |
# Header | |
gr.Markdown(""" | |
# 🎓 CertifyMe AI | |
### Transform Your Knowledge into Recognized Achievements | |
""") | |
# Tabs | |
with gr.Tabs() as tabs: | |
# Step 1: Profile Setup | |
with gr.Tab("📋 Step 1: Profile Setup", id=0) as tab1: | |
with gr.Row(): | |
name = gr.Textbox(label="Full Name", placeholder="Enter your full name") | |
email = gr.Textbox(label="Email", placeholder="Enter your email") | |
text_input = gr.Textbox( | |
label="Learning Content", | |
placeholder="Enter the text content you want to be assessed on", | |
lines=10 | |
) | |
num_questions = gr.Slider( | |
minimum=1, | |
maximum=5, | |
value=3, | |
step=1, | |
label="Number of Questions" | |
) | |
with gr.Row(): | |
company_logo = gr.Image(label="Company Logo (Optional)", type="filepath") | |
participant_photo = gr.Image(label="Your Photo (Optional)", type="filepath") | |
generate_btn = gr.Button("Generate Assessment", variant="primary", size="lg") | |
# Step 2: Take Assessment | |
with gr.Tab("📝 Step 2: Take Assessment", id=1) as tab2: | |
error_message = gr.Markdown("") | |
question_container = gr.Group() | |
with question_container: | |
question_blocks = [] | |
submit_btn = gr.Button("Submit Assessment", variant="primary", size="lg") | |
# Step 3: Get Certified | |
with gr.Tab("🎓 Step 3: Get Certified", id=2) as tab3: | |
score_display = gr.Number(label="Your Score") | |
course_name = gr.Textbox( | |
label="Certification Title", | |
value="Professional Assessment Certification" | |
) | |
certificate_display = gr.Image(label="Your Certificate") | |
# Event handlers | |
generate_btn.click( | |
fn=generate_and_display_questions, | |
inputs=[text_input, num_questions], | |
outputs=[ | |
question_container, | |
error_message, | |
stored_questions, | |
current_tab | |
] | |
).then( | |
fn=lambda tab: gr.update(selected=tab), | |
inputs=[current_tab], | |
outputs=[tabs] | |
) | |
submit_btn.click( | |
fn=submit_answers, | |
inputs=[question_container, stored_questions], | |
outputs=[score_display, current_tab] | |
).then( | |
fn=lambda tab: gr.update(selected=tab), | |
inputs=[current_tab], | |
outputs=[tabs] | |
) | |
score_display.change( | |
fn=lambda score, user_name, course, logo, photo: ( | |
quiz_app.generate_certificate(user_name, score, course, logo, photo) | |
if score >= 80 else None | |
), | |
inputs=[score_display, name, course_name, company_logo, participant_photo], | |
outputs=certificate_display | |
) | |
return demo | |
if __name__ == "__main__": | |
if not os.getenv("GROQ_API_KEY"): | |
print("Please set your GROQ_API_KEY environment variable") | |
exit(1) | |
demo = create_quiz_interface() | |
demo.launch() |