Metadata-Version: 2.4
Name: taedri
Version: 0.3.1
Summary: Import 50+ oracle-verified capability primitives as plain Python — the deterministic integration surface for Taedri (this already exists, don't rebuild it).
License: MIT
Project-URL: Homepage, https://taedri.dev
Keywords: primitives,reuse,entity-resolution,data-cleaning,llm,agents
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Provides-Extra: full
Requires-Dist: phonenumbers>=8.13; extra == "full"
Requires-Dist: python-dateutil>=2.8; extra == "full"
Requires-Dist: email-validator>=2.0; extra == "full"
Requires-Dist: usaddress>=0.5; extra == "full"
Requires-Dist: cleanco>=2.1; extra == "full"
Requires-Dist: python-slugify>=8; extra == "full"
Requires-Dist: Unidecode>=1.3; extra == "full"
Requires-Dist: jellyfish>=0.11; extra == "full"
Requires-Dist: nameparser>=1.1; extra == "full"
Requires-Dist: pycountry>=22; extra == "full"
Requires-Dist: tldextract>=3; extra == "full"
Requires-Dist: price-parser>=0.3; extra == "full"

# taedri

**Import verified capability primitives as plain Python.** The deterministic integration surface for
[Taedri](https://taedri.dev) — *this already exists, don't rebuild it.*

Instead of an LLM downloading, reading, or rewriting an implementation, it writes an import and a call:

```python
import taedri

taedri.normalize_phone("(415) 555-1234")     # '+14155551234'
taedri.parse_date("March 7, 2026")            # '2026-03-07'
taedri.pipe("split_compound_name > normalize_person_name")("john & mary o'brien")
#   -> ["John O'Brien", "Mary O'Brien"]
taedri.clean_record({"name": "...", "company": "...", "address": "...", "phone": "...", "email": "..."})
```

The whole "recipe" the model emits is the import plus a call — the fewest possible tokens, deterministic,
and model-independent. No 80k-line body ever reaches the model.

Every primitive is **oracle-verified**. Package-backed ones (`normalize_phone`, `validate_email`,
`parse_date`, `parse_address`) delegate to battle-tested libraries (`phonenumbers`, `email-validator`,
`python-dateutil`, `usaddress`); `import taedri` always works via the bundled canonical fallback, and
`pip install taedri[full]` upgrades to the real libraries.

`taedri.pipe("A > B > C")` composes primitives by their typed edges (a list result maps the next step);
`taedri.get(name)` returns any primitive as a callable. Governance: every result is a `candidate`
(`serves_truth=false`) until Taedri's promotion gates verify it.
