A simple, elegant Python framework for creating and running interactive quizzes
Project description
Quizy
Overview
A lightweight, API-first Python quiz framework for creating interactive quizzes and assessments. Features async execution, timers, partial credit, shuffling, and AI-powered question generation.
Key Features:
- Async/await support with
execute_async() - Real-time countdown timers with visual feedback
- Partial credit for flexible grading
- Question option shuffling and randomization
- Interactive CLI with color-coded results
- AI-powered question generation via OpenAI
Installation
pip install quizy # comes with OpenAI
API Service
FastAPI Web Service
Create instant REST APIs for quiz management with built-in Swagger documentation:
pip install quizy[api]
from quizy.api import QuizyAPI
# Create API instance
app = QuizyAPI(prefix="/api/v1")
# Run server
app.run(host="0.0.0.0", port=8000)
Features:
- Complete quiz CRUD operations
- Manual and AI question management
- Real-time quiz execution
- Interactive Swagger docs at
/docs - Customizable API prefixes and CORS
See docs/API.md. for detailed documentation.
MCP Server Integration
Use Quizy with GitHub Copilot via the Model Context Protocol (MCP). This allows AI to generate, validate, and analyze quizzes directly.
pip install quizy[mcp]
Then configure the MCP server in VS Code and use Copilot Chat:
@quizy Generate a Python quiz with 5 hard questions
Available MCP Tools:
generate_quiz- Create AI-powered questionsvalidate_question- Check question qualitycreate_quiz_from_questions- Build quiz objectsanalyze_difficulty- Analyze question distribution
For detailed setup instructions, see docs/MCP_SETUP.md.
Python Module
Adding Manual Questions
Create different question types:
from quizy import Quiz, MultipleChoiceQuestion, MatchingQuestion
quiz = Quiz(title="My Quiz", time_limit=60)
# Multiple Choice
quiz.add_question(MultipleChoiceQuestion(
text="What is the capital of France?",
options=["London", "Berlin", "Paris", "Madrid"],
correct_answer="Paris",
shuffle_options=True,
time_limit=10
))
# Matching
quiz.add_question(MatchingQuestion(
text="Match programming terms",
pairs={
"def": "Function definition",
"class": "Class definition",
"async": "Asynchronous function"
},
shuffle_answers=True,
allow_partial_credit=True,
time_limit=15
))
# Define a synchronous answer provider for terminal input
def your_answer_provider(question, idx):
print(f"\nQuestion {idx+1}: {question.text}")
# Show options if available
options = question.get_options()
if options:
for i, opt in enumerate(options, 1):
print(f"{i}. {opt}")
# Get user input
user_input = input("> ")
# Convert input to correct option if needed
if options:
try:
choice = int(user_input)
return question.get_option_by_index(choice)
except:
return user_input.strip()
return user_input.strip()
# Run the quiz synchronously (if you use in the terminal)
result = quiz.execute(your_answer_provider)
print(f"Score: {result.score_percentage:.1f}%")
Adding AI-Generated Questions
Generate quiz questions automatically using OpenAI and test it on terminal using QuizCLI:
from quizy import Quiz, QuestionType
from quizy.ai_generator import AIQuestionGenerator
import time
# Initialize AI generator
generator = AIQuestionGenerator()
# Generate questions (synchronously)
questions = generator.generate_questions_set(
topic="Python Programming",
num_questions=5,
question_types=[
QuestionType.MULTIPLE_CHOICE,
QuestionType.TRUE_FALSE,
QuestionType.MULTIPLE_SELECT,
QuestionType.SHORT_TEXT,
QuestionType.MATCHING,
],
difficulty="medium"
)
# Create the quiz
quiz = Quiz(title="AI-Generated Python Quiz")
for q in questions:
if q:
quiz.add_question(q)
# Define a synchronous answer provider for terminal input
def your_answer_provider(question, idx):
print(f"\nQuestion {idx+1}: {question.text}")
# Show options if available
options = question.get_options()
if options:
for i, opt in enumerate(options, 1):
print(f"{i}. {opt}")
# Get user input
user_input = input("> ")
# Convert input to correct option if needed
if options:
try:
choice = int(user_input)
return question.get_option_by_index(choice)
except:
return user_input.strip()
return user_input.strip()
# Run the quiz synchronously (if you use in the terminal)
result = quiz.execute(your_answer_provider)
# Show results
print(f"\nQuiz completed! Score: {result.score_percentage:.1f}%")
print(f"Correct answers: {result.correct_answers}/{result.total_questions}")
Running Interactive Quizzes
Use the CLI for formatted output with timers and progress:
from quizy import QuizCLI
# Run with timer display
QuizCLI.run_interactive(quiz, show_timer=True)
# Get detailed results breakdown
QuizCLI.display_detailed_results(result)
Question Types
- MultipleChoiceQuestion: Single correct answer
- MultipleSelectQuestion: Select all correct answers (supports partial credit)
- MatchingQuestion: Match items to descriptions (supports partial credit)
- TrueFalseQuestion: Binary choice
- ShortTextQuestion: Free-form text answers
Future Enhancements (v0.5+)
- Web-based UI components
- Database integration for result persistence
- Advanced analytics and reporting
- Real-time leaderboards
- Support for more AI providers (Claude, Gemini, etc.)
- More partial credit options
- Fine-tuning for domain-specific questions
Support
GitHub: https://github.com/rustampy/quizy | Issues: https://github.com/rustampy/quizy/issues
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file quizy-0.4.9b0.tar.gz.
File metadata
- Download URL: quizy-0.4.9b0.tar.gz
- Upload date:
- Size: 32.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51cffad029f99280bf54f4131ec078203d0a740a9fd5ba9e25e9c2b482d0e2bd
|
|
| MD5 |
786e96809e7e1b50d69036b4b137c05a
|
|
| BLAKE2b-256 |
4f9636c8722198dd45fd0f1cd24780122d6d351324a731aa10373494dde2999b
|
File details
Details for the file quizy-0.4.9b0-py3-none-any.whl.
File metadata
- Download URL: quizy-0.4.9b0-py3-none-any.whl
- Upload date:
- Size: 24.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3deff3788f812fee2baf5fae047955b6e77c0752239bb8b2129f5151c05719ea
|
|
| MD5 |
14356fa490dcd0074e21686e06ebf03e
|
|
| BLAKE2b-256 |
5ad4f4ff310132c5998f5a67a22505d55816fbf7dad04db94a73bb05ab0276b9
|