Skip to content

Thin core plus per-Provider packages, managed as a uv workspace

The monorepo publishes many packages, not one. latence-core holds the data contracts, Capability protocols, the Pipeline model, the local Runner, and the Storage seam — pure-Python with near-zero dependencies. Each Provider is its own installable package owning its heavy dependencies (e.g. latence-parser-paddle → paddle, latence-ner-gliner → gliner/torch, latence-graph → rdflib), discovered via entry points. Adopters install only what they use (pip install latence-core latence-ner-gliner); a latence-framework meta-package bundles the CPU demo set for one-command onboarding. A uv workspace develops and versions them together. This is the proven plugin-ecosystem shape (pytest, Airflow, LlamaIndex) and it protects the CPU-first "runs on a laptop" promise (ADR-0007) — no adopter pulls PaddleOCR + torch + rdflib unless they ask for it. Rejected: single package with extras (all providers' deps in one pyproject; inter-provider version conflicts become the core's problem), core + one fat providers bundle (recreates the fat-install and can't isolate conflicting model libs), and monolith-for-now (the split gets much harder once import paths and released versions exist, and the fat install breaks laptop-first immediately).