Dr. Claw
Full-stack research workspace. From idea to paper with AI agents.
AEMS helps university instructors mark STEM exams, homeworks, and lab reports faster. Built for handwritten work, with full support for typed and printed submissions. Upload the rubric, review draft m
EducationJavaScript · PythonGitHub @aems-appOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Schema-driven PDF annotation engine for AEMS — verdict markers, page-anchored highlights, and LLM-output payload contract.
Taken from the repository README
Loading the full README.
Read the full README ↗Schema-driven PDF annotation engine for AEMS — the Assisted Exam Marking System.
A small, focused library that takes a structured annotation payload (LLM output, rubric verdicts, page-anchored highlights) and draws it onto a PDF using PyMuPDF. It powers the annotated marker PDFs that AEMS returns to instructors.
Key surfaces:
PDFAnnotation, BBox, AnnotationBatch — typed models for the annotation payload (Pydantic v2).payload_to_annotations(), feedback_items_to_annotations() — convert AEMS LLM output (the "annotation contract") into typed annotation objects.PDFAnnotator, apply_annotations(), apply_annotation_batch() — open a PDF, draw the annotations, save.pip install aems-pdf-annotator
Or from source:
pip install git+https://github.com/aems-app/aems-pdf-annotator
Requires Python 3.10+.
from aems_pdf_annotator import (
PDFAnnotation, BBox, AnnotationColor, AnnotationType,
apply_annotations,
)
annotations = [
PDFAnnotation(
page=1,
bbox=BBox(x=0.10, y=0.20, width=0.40, height=0.04),
annotation_type=AnnotationType.HIGHLIGHT,
color=AnnotationColor.GREEN,
content="Correct identification of the boundary condition.",
is_verdict=False,
),
PDFAnnotation(
page=1,
bbox=BBox(x=0.80, y=0.20, width=0.03, height=0.03),
annotation_type=AnnotationType.STAR,
color=AnnotationColor.GREEN,
content="PASS",
is_verdict=True,
),
]
apply_annotations(
input_pdf_path="input.pdf",
output_pdf_path="annotated.pdf",
annotations=annotations,
)
Coordinates are normalised (0.0–1.0) with (0, 0) at the top-left of the page; the renderer converts to PDF bottom-left internally.
The LLM-output payload format follows a versioned contract. Current values are exported as CURRENT_CONTRACT_VERSION and CURRENT_COORDINATE_SPACE. payload_to_annotations() validates the incoming payload's contract version against SUPPORTED_CONTRACT_VERSIONS and raises ContractValidationError on a mismatch.
AGPL-3.0-or-later. See LICENSE.
This package wraps PyMuPDF, which is itself licensed under AGPL-3.0. Any program that imports aems_pdf_annotator in-process inherits the AGPL combined-work obligations. If that does not fit your distribution model, commercial PyMuPDF licensing is available from Artifex.