The first substantive public release. langres is a composable entity-resolution framework: zero-label dedupe()/link() verbs, a swappable judge seam (string / embedding / LLM), and a label-harvesting flywheel that turns an out-of-the-box LLM judge into a tuned, cheaper resolver for your own data.
Highlights
- The flywheel, paved:
examples/flywheel_min.pyruns the whole loop at $0 — dedupe with zero labels → log every judgement → review the uncertain margin via CSV → harvest labels → derive a data-driven threshold → re-run (precision 0.600 → 1.000 on the demo). The loop's full API is root-importable. - The judgement contract:
PairwiseJudgementseparates deciding from ranking; abstention is a first-class "I don't know", never a fabricated verdict; optional earnedconfidence. - A deterministic keyless contract for
judge="auto": no key →NoJudgeAvailableError;LANGRES_OFFLINE=1forces offline; documented key-discovery order; every LLM judge spend-capped ($1 default). - The evaluation instrument: benchmark registry (Fodors-Zagat, Abt-Buy, Amazon-Google, DBLP, Walmart-Amazon, WDC, FEBRL), bring-your-own-data
evaluate(), and the $0 self-contained HTMLEvalReporttearsheet — quality and dollars side by side. - Paper replication: the Peeters et al. LLM-EM protocol replays offline at $0 and reproduces the published F1 exactly from the authors' archived answers; live runs agree on 99.25% of pairs for $0.28 total.
- Slimmer package: the wheel drops 5.7 MB → 0.57 MB (large third-party benchmark corpora are git-checkout-only).
- Docs site: https://grafdavid.com/langres/
Full details in CHANGELOG.md. Apache-2.0.