meerax
Shared ML utilities — LLM providers, evaluation metrics, visualization, and report generation.
Used as an in-house dependency across all of Sameer Maurya's ML projects and organization.
Source repo: the-forge — kept its original name;
only the installable package was renamed to meerax.
CI gates on mypy (strict = true, with 2 narrowly-scoped # type: ignore exceptions for known
third-party stub gaps) and a minimum 85% test coverage — both enforced on every PR, not just
checked locally.
Install
pip install meerax
Or pin in requirements.txt:
meerax==1.7.0
Modules
| Module | What it gives you |
|---|---|
meerax.llm |
Swap-in LLM backends — Claude, OpenAI, Ollama behind one interface, text or images |
meerax.eval.classification |
F1, AUC-ROC, precision, recall in one call |
meerax.eval.timeseries |
RMSE, MAPE, SMAPE, ADF stationarity test |
meerax.eval.text |
BLEU-4, ROUGE-L for caption / summary quality |
meerax.viz |
Dark-themed matplotlib plots (confusion matrix, ROC, forecast, decomposition) |
meerax.data |
CSV/parquet loaders with schema validation, stratified + time splits, SMOTE |
meerax.report |
Self-contained dark-themed HTML model-card report builder |
meerax.logging |
One-call structured logger factory |
meerax.vision |
Image folder dataset loader (PyTorch) + translation-grid plotting (torch or numpy/TF images) |
Scaffolding Projects
Every project in the ecosystem follows the same PROJECT_STANDARDS.md layout and depends on
meerax. The meerax CLI (installed alongside the package) generates or retrofits that layout:
# brand-new project
meerax new my-project --path ~/dev
# retrofit an existing, non-empty directory — additive only, never overwrites
cd ~/dev/my-existing-notebook-project
meerax init
meerax new creates the full src/{core,providers,services,utils,data} + tests/ + CI
skeleton, pins requirements.txt to the current meerax release, and runs git init. The
generated ci.yml calls this repo's reusable CI workflow
instead of embedding its own copy, so fixes to the shared CI logic reach every project that
uses it without needing to be manually reapplied. Also generates .github/dependabot.yml
(pip + github-actions, weekly) so dependency pins don't quietly go stale.
Both new and init accept --template llm-report, which adds a real, runnable example on
top of the bare skeleton — the "call an LLM, build an HTML report" shape that's shown up twice
already (trend-whisperer, pixel-drift). It's genuinely functional code with real tests, not
stub methods to fill in:
meerax new my-app --template llm-report
cd my-app && pip install -r requirements.txt
python -m src.app --prompt "Summarize this quarter's churn" --llm-provider ollama
meerax init fills in whatever's missing from that same layout without touching files that
already exist, and reports any top-level files it doesn't recognize (e.g. notebooks) so you can
move them into src/ by hand.
meerax doctor checks an existing project against PROJECT_STANDARDS.md — no Python version
matrix, no committed docs/specs/docs/plans, a LICENSE file, VERSION/README/CHANGELOG
consistency, Dependabot configured, and whether the project's meerax pin is current:
cd ~/dev/my-project
meerax doctor
Exits non-zero if anything fails, so it's safe to run in CI.
meerax bump <version> updates VERSION, the README version badge, and inserts a dated
CHANGELOG heading in one step — the exact multi-file edit that's caused version-badge drift
more than once across this ecosystem's history:
meerax bump 1.2.0
It doesn't write CHANGELOG content or a compare-link footer — those need someone who actually knows what changed.
Quick Start
from meerax.llm import ClaudeProvider, PromptTemplate
from meerax.eval import evaluate_classifier
from meerax.viz import apply_meerax_theme
from meerax.report import ReportBuilder, ReportSection
# LLM: swap provider without changing downstream code
llm = ClaudeProvider() # or OpenAIProvider() / OllamaProvider()
tpl = PromptTemplate("Explain {finding} to a risk manager in 3 sentences.")
response = llm.generate(tpl.render(finding="high AUC-ROC with low recall"))
# Eval
metrics = evaluate_classifier(y_true, y_pred, y_prob=probabilities)
print(metrics)
# Accuracy : 0.9823
# F1 : 0.8741
# AUC-ROC : 0.9912
# Viz + Report
apply_meerax_theme()
rb = ReportBuilder("Fraud Detection — Model Report v0.1.0")
rb.add_section(ReportSection(
title="Performance",
metrics=metrics.to_dict(),
content=response.content,
))
rb.save("reports/model_report.html")
LLM Provider Interface
All providers implement LLMProvider.generate() and .chat(). Swap with one line:
from meerax.llm import ClaudeProvider, OpenAIProvider, OllamaProvider
llm = ClaudeProvider() # needs ANTHROPIC_API_KEY
llm = OpenAIProvider() # needs OPENAI_API_KEY
llm = OllamaProvider() # needs Ollama running locally
Benchmarks
Self-contained benchmark scripts in benchmarks/:
| Script | Description |
|---|---|
kv_cache_benchmark.py |
KV caching simulation at GPT-2 Medium scale |
Project Structure
the-forge/
├── meerax/ # Installable package
│ ├── llm/ # LLM provider abstraction
│ ├── eval/ # Evaluation metrics
│ ├── viz/ # Visualization utilities
│ ├── data/ # Data loading, splitting, resampling
│ ├── report/ # HTML report builder
│ ├── scaffold/ # Project skeleton templates + create/retrofit logic
│ ├── cli.py # `meerax new` / `init` / `doctor` / `bump` command entry point
│ ├── doctor.py # PROJECT_STANDARDS.md compliance checks
│ ├── release.py # VERSION/README badge/CHANGELOG bump helper
│ ├── vision/ # Image dataset loader + translation-grid plotting
│ └── logging.py # Structured logger
├── benchmarks/ # Standalone ML benchmark scripts
├── tests/
│ ├── unit/ # 143 unit tests, zero external deps
│ └── integration/ # 4 cross-module pipeline tests
├── ARCHITECTURE.md
├── SECURITY.md
├── LICENSE
├── pyproject.toml
├── requirements.txt
└── VERSION
Release files for meerax 1.7.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 | |
|---|---|---|---|
| meerax-1.7.0.tar.gz | 27.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| meerax-1.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 59.8 kB
Release files / meerax-1.7.0.tar.gz
| Download URL | meerax-1.7.0.tar.gz |
|---|---|
| Size | 27.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
40173654356b1401114f318a4c6673c03aef2f213eb278a54166423054f7945e
|
|
BLAKE2b-256 checksum How to use checksums |
7b93ed2b26b29c102e2a3eac30d8fbd932c295d5cd8201f51bacd55163c6aa7f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Aug 28, 2026.
Transparency logRelease files / meerax-1.7.0-py3-none-any.whl
| Download URL | meerax-1.7.0-py3-none-any.whl |
|---|---|
| Size | 32.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
59e9773a2c55904a917315ebafa8d52e6b89e01c2b3a23b4e8e0f5725b341875
|
|
BLAKE2b-256 checksum How to use checksums |
a9c1949f38ad8945e8120acd6d9fb26e9f6d4e0bc710663c123b2df745e5305b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Aug 28, 2026.
Transparency log