groundmark
PDF to Markdown conversion and quote-to-bbox resolution.
What it does
- Convert: Send PDF pages to a vision-capable LLM (via Pydantic AI) to produce clean Markdown with
<!--page-->markers between pages. - Resolve: Given verbatim quote strings, locate them in the source PDF and return bounding box coordinates. Uses pypdfium2 for per-character bbox extraction and seq-smith for Smith-Waterman alignment.
Quick Start
import asyncio
from groundmark import DocumentIndex
from groundmark.convert import Config, ModelConfig, convert
async def main():
pdf_bytes = open("document.pdf", "rb").read()
# PDF -> Markdown (requires pydantic-ai, install with e.g. groundmark[bedrock])
model = ModelConfig(name="bedrock:au.anthropic.claude-sonnet-4-6")
result = await convert(pdf_bytes, Config(model=model))
print(result.markdown[:500])
# Resolve verbatim quotes to PDF bounding boxes
doc = DocumentIndex(pdf_bytes)
resolved = doc.resolve(["the patient presented with"])
# -> {"the patient presented with": [(page, BBox(top, left, bottom, right)), ...]}
# The DocumentIndex can be reused for multiple resolve calls against the same PDF
more = doc.resolve(["another quote from the same paper"])
if __name__ == "__main__":
asyncio.run(main())
Installation
# Resolve only (no LLM dependencies)
uv add groundmark
# With LLM provider extra(s) for conversion
uv add groundmark --extra anthropic,bedrock,google,openai
Configuration
Timeouts
The LLM call for PDF-to-Markdown conversion can take several minutes for large documents, especially with Opus on Bedrock. Timeout defaults by provider:
| Provider | Default | Environment Variable |
|---|---|---|
| Bedrock (boto3) | 300s | AWS_READ_TIMEOUT |
| Anthropic (httpx) | 600s | — (use ModelSettings(timeout=...)) |
For Bedrock with Opus, 300s may not be enough. Set a higher timeout:
export AWS_READ_TIMEOUT=600
License
This project is licensed under the MIT License - see the LICENSE file for details.
Metadata
Release files for groundmark 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| groundmark-0.6.0.tar.gz | 212.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| groundmark-0.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 227.2 kB
Release files / groundmark-0.6.0.tar.gz
| Download URL | groundmark-0.6.0.tar.gz |
|---|---|
| Size | 212.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d46fbe112247fb2d530c5c2425c327e770746f80a8bf2bdda9cad69f4743bb76
|
|
BLAKE2b-256 checksum How to use checksums |
3aa6e2e62fd31687940ad52c6815a018a9430b9b39cd111b3282887b313cc746
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 21, 2026.
Transparency logRelease files / groundmark-0.6.0-py3-none-any.whl
| Download URL | groundmark-0.6.0-py3-none-any.whl |
|---|---|
| Size | 14.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c014d062dd523bd10ef662afcf48c4d6d74093243416ffc2061ff2a275e32cd5
|
|
BLAKE2b-256 checksum How to use checksums |
37f5c9e3ada975973525e30bb52c66723fedf06a4c95f7007e43ce4a53229501
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 21, 2026.
Transparency log