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.3.0.tar.gz (26.4 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.3.0-py3-none-any.whl (24.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for quizforge-0.3.0.tar.gz
Algorithm Hash digest
SHA256 038773fccfcebb7957c03e07f13bae1860a7be98fdc2d875afa6edc5927453af
MD5 6f9409dc6264a41af568c7af35b02e0f
BLAKE2b-256 b7288a053344ca176cd639de98fa2af11729dae5cd92b09e8950c8f6089e7f19

See more details on using hashes here.

Provenance

The following attestation bundles were made for quizforge-0.3.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.3.0-py3-none-any.whl.

File metadata

  • Download URL: quizforge-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 24.5 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.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7a225f33731ba64d1d114e2b6663b8099d137f195d48bff9276e7305c3034f31
MD5 441a4809f2e2a2da6354aa4d1b0239c0
BLAKE2b-256 b2dbe4c0fb0e48c612624ddab3b0edc6372de26272c89c91f44521d94ea9613e

See more details on using hashes here.

Provenance

The following attestation bundles were made for quizforge-0.3.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