Quickstart

1. Install

Python 3.13 or newer. The core package pulls only pydantic and pyyaml; the heavy stages sit behind extras. The full pipeline needs detector, gliner, and llm; add pdf to read .pdf inputs.

2. Configure

One file, tacit_deid.yaml, that you own. Credentials are not in it: LiteLLM reads them from the environment or disk.
The endpoint gate runs when the LLM client is constructed, before any Protected Health Information (PHI) is sent. A model whose resolved host is not on the list raises EndpointNotAllowedError. See Configuration for every field.

3. Check the input

No model client is built and nothing is sent. The report names the format, the size against the cap, anything that would be refused at load, and any keep value that matches nothing. Exit 2 when a record would be refused. See Feeding it transcripts.

4. Run

On success the artifact is written owner-only and the exit code is 0. On a refusal the command prints REFUSED: <reason> and exits 2; no artifact exists and nothing was sent. By default the run also writes runs/<id>/ with the local ledger and every model call; that folder holds real identifiers and stays inside your boundary (--no-trace skips it). A directory, a JSON Lines file, or a CSV runs as a batch with --out-dir: one engine build, one artifact per record, and an owner-only manifest.json.

5. Send, regenerate, pull

send, pull, and roundtrip read TACIT_API_URL and TACIT_API_KEY from a key file or the environment. The key is an ak_ key from an org you administer.
send re-validates the file against the wire contract first, so a ledger or a transcript can never be sent by mistake. See The Tacit side.

As a library

build_deps wires one LiteLLMClient for extraction and one LLMJudge for the loop, both behind the same endpoint gate, plus the configured detectors and the base-rate provider. Pass a TraceCollector as on_trace to keep every model call in the returned ledger.