Skip to main content

Generate a deep, mixed-format question bank from source material and grade it — deterministic where it can, LLM where it must. Bring your own chat model.

Project description

quizforge

Generate a deep, mixed-format question bank from any source material, then grade it — deterministic where it can, LLM where it must. Bring your own chat model.

quizforge is the engine behind a training/readiness feature: it drafts far more questions than any single test shows (multiple choice, fill-in-the-blank, match-the-following, short answer, and free-response scenarios), samples a fresh shuffled test on each attempt — so two learners rarely see the same one — and grades every format. MC/fill/match are graded instantly with no model call; open-ended answers are scored 0–1 with coaching feedback by an LLM you provide.

  • Model-agnostic — pass any LangChain-style chat model (with_structured_output). No SDK is bundled.
  • Deep bank, anti-sharing sampling — unseen-first, difficulty-spread draws per a configurable blueprint.
  • Cheap grading — only open-ended answers cost a model call; everything else is local and free.
  • Plain dicts in, plain dicts out — YAML/JSON-friendly, easy to store and template.

Install

pip install quizforge

Bring a chat model from whichever provider you use, e.g.:

pip install langchain-openai   # or langchain-anthropic, etc.

Quickstart

Generate a bank

from quizforge import generate_bank
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4.1", temperature=0.4)

material = open("citrix_lesson.md").read()
new_questions = generate_bank(
    material, llm,
    targets={"mc": 40, "fill_blank": 20, "match": 12, "short": 16, "freetext": 12},
    existing=[],                       # pass your current bank to top it up
    coverage="At least half should be applied incident-response scenarios.",
)
# -> list of dicts with id/type/difficulty + per-format fields. Store as you like.

generate_bank only produces the shortfall to reach targets, validates each question, and never duplicates an existing prompt — safe to re-run to grow a bank.

Sample a test

from quizforge import sample_test, DEFAULT_BLUEPRINT

test = sample_test(bank, blueprint=DEFAULT_BLUEPRINT, seen_ids=already_seen)
# DEFAULT_BLUEPRINT draws mc8 / fill4 / match2 / short4 / freetext2 = 20, shuffled.

Grade

from quizforge import grade_fill_blank, grade_match, grade_open_answer

grade_fill_blank(q, "ICA")                 # {"score": 1.0, "correct": True, ...}
grade_match(q, {"0": "RDP", "1": "ICA"})   # per-pair partial credit
grade_open_answer(q, learner_text, llm)    # QuizGrade(score, verdict, feedback, ...) or None

grade_open_answer returns None if the model was unavailable — exclude that question from the attempt's max score rather than penalizing the learner.

Question shapes

Each question is a dict with id, type, difficulty, prompt, plus:

  • mcchoices: [str], answer_idx: int, explanation: str
  • fill_blankaccepted_answers: [str], explanation: str
  • matchpairs: [{left, right}], explanation: str
  • short / freetextmodel_answer: str, rubric: [str]

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

quizforge-0.1.0.tar.gz (23.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

quizforge-0.1.0-py3-none-any.whl (22.3 kB view details)

Uploaded Python 3

File details

Details for the file quizforge-0.1.0.tar.gz.

File metadata

  • Download URL: quizforge-0.1.0.tar.gz
  • Upload date:
  • Size: 23.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for quizforge-0.1.0.tar.gz
Algorithm Hash digest
SHA256 34aef5836c9579a91f5168e9378a3c71c0f6e383c92c13a202282b6a9e9bfb75
MD5 289ab8d4125cd37e6fec07b6b9a539e6
BLAKE2b-256 5b728c9dd26fdbe6b6a3358deecc8dfce2faa1001eca51c3bdcb11437508439c

See more details on using hashes here.

Provenance

The following attestation bundles were made for quizforge-0.1.0.tar.gz:

Publisher: publish.yml on vinayvobbili/quizforge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file quizforge-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: quizforge-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 22.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for quizforge-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f9142aafcdd729cfa7a55b740dd5a9f02903cb279f317b4f6ffc3809c920ad28
MD5 50bb9e8868ca693f4a011b2691b9bf12
BLAKE2b-256 20d6382102c9ec1d59065e2c233974704a08fbd9133e47c115be93013c64d30d

See more details on using hashes here.

Provenance

The following attestation bundles were made for quizforge-0.1.0-py3-none-any.whl:

Publisher: publish.yml on vinayvobbili/quizforge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page