import gradio as gr
from openai import OpenAI
import os
ACCESS_TOKEN = os.getenv("HF_TOKEN")
client = OpenAI(
base_url="https://api-inference.huggingface.co/v1/",
api_key=ACCESS_TOKEN,
)
def generate_study_material(
topic,
difficulty,
question_type,
focus_areas,
anxiety_level,
num_questions
):
# Customize prompt based on anxiety level and learning focus
anxiety_prompts = {
"High": "Create a gradual, confidence-building set of questions. Start with easier concepts and progressively increase difficulty. Include encouraging notes.",
"Medium": "Balance challenge with achievability. Include hints for tougher questions and positive reinforcement.",
"Low": "Focus on comprehensive concept testing while maintaining an encouraging tone."
}
focus_prompt = {
"concept_understanding": "Emphasize questions that test deep understanding rather than memorization.",
"problem_solving": "Include scenario-based questions that require analytical thinking.",
"quick_recall": "Focus on key definitions and fundamental concepts.",
"practical_application": "Create questions based on real-world applications."
}
base_prompt = f"""
Act as an expert educational psychologist and subject matter expert creating an exam preparation guide.
Topic: {topic}
Difficulty: {difficulty}
Question Type: {question_type}
Number of Questions: {num_questions}
Special Considerations:
- Anxiety Level: {anxiety_level}
{anxiety_prompts[anxiety_level]}
- Learning Focus: {focus_areas}
{focus_prompt[focus_areas]}
Generate questions following these guidelines:
1. Start with a brief confidence-building message
2. Include clear, unambiguous questions
3. Provide detailed explanations for each answer
4. Add study tips relevant to the topic
5. Include a "Remember" section with key points
Format:
- For Multiple Choice: Include 4 options with explanations for each
- For Short Answer: Provide structure hints and model answers
- For Descriptive: Break down marking criteria and include outline points
Additional Requirements:
- Include think-aloud strategies for problem-solving
- Add time management suggestions
- Highlight common misconceptions to avoid
- End with a positive reinforcement message
"""
try:
messages = [
{"role": "system", "content": "You are an expert educational content generator."},
{"role": "user", "content": base_prompt}
]
response = client.chat.completions.create(
model="Qwen/QwQ-32B-Preview",
messages=messages,
max_tokens=2048,
temperature=0.7,
top_p=0.9
)
return response.choices[0].message.content
except Exception as e:
return f"An error occurred: {str(e)}\nPlease try again with different parameters."
def create_interface():
with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue")) as iface:
gr.Markdown("""
#
📚 Exam Preparation Assistant
Welcome to your personalized exam preparation assistant! This tool is designed to help you:
- Build confidence through practiced learning
- Understand concepts deeply
- Reduce exam anxiety through structured practice
Remember: Every practice session brings you closer to mastery! 🌟
""")
with gr.Row():
with gr.Column():
topic = gr.Textbox(
label="Topic or Subject",
placeholder="Enter the topic you want to study (e.g., 'Python Lists and Tuples', 'Chemical Bonding')",
lines=2
)
difficulty = gr.Radio(
choices=["Beginner", "Intermediate", "Advanced"],
label="Difficulty Level",
value="Intermediate",
info="Choose based on your current understanding"
)
question_type = gr.Radio(
choices=["Multiple Choice", "Short Answer", "Descriptive"],
label="Question Type",
value="Multiple Choice",
info="Select the format that best helps your learning"
)
focus_areas = gr.Radio(
choices=[
"concept_understanding",
"problem_solving",
"quick_recall",
"practical_application"
],
label="Learning Focus",
value="concept_understanding",
info="What aspect do you want to improve?"
)
anxiety_level = gr.Radio(
choices=["High", "Medium", "Low"],
label="Current Anxiety Level",
value="Medium",
info="This helps us adjust the difficulty progression"
)
num_questions = gr.Slider(
minimum=3,
maximum=10,
value=5,
step=1,
label="Number of Questions"
)
submit_btn = gr.Button(
"Generate Study Material",
variant="primary"
)
with gr.Column():
output = gr.Textbox(
label="Your Personalized Study Material",
lines=20,
show_copy_button=True
)
# Example scenarios
gr.Examples(
examples=[
[
"Python Functions and Basic Programming",
"Beginner",
"Multiple Choice",
"concept_understanding",
"High",
5
],
[
"Data Structures - Arrays and Linked Lists",
"Intermediate",
"Short Answer",
"problem_solving",
"Medium",
5
],
[
"Advanced Algorithms - Dynamic Programming",
"Advanced",
"Descriptive",
"practical_application",
"Low",
3
]
],
inputs=[
topic,
difficulty,
question_type,
focus_areas,
anxiety_level,
num_questions
],
outputs=output,
fn=generate_study_material,
cache_examples=True
)
# Usage tips
gr.Markdown("""
### 💡 Tips for Best Results
1. **Be Specific** with your topic - instead of "Math", try "Quadratic Equations"
2. **Match the Difficulty** to your current understanding
3. **Vary Question Types** to improve overall understanding
4. **Be Honest** about your anxiety level - it helps us provide better support
### 🎯 Learning Focus Options
- **Concept Understanding**: Deep grasp of fundamental principles
- **Problem Solving**: Analytical and application skills
- **Quick Recall**: Key definitions and core concepts
- **Practical Application**: Real-world usage and examples
### 🌟 Remember
- Take regular breaks
- Practice consistently
- Focus on understanding, not just memorizing
- Each practice session improves your knowledge!
""")
submit_btn.click(
fn=generate_study_material,
inputs=[
topic,
difficulty,
question_type,
focus_areas,
anxiety_level,
num_questions
],
outputs=output
)
return iface
if __name__ == "__main__":
iface = create_interface()
iface.launch()