Six libraries. One problem each.
Each solves one production problem and works entirely on its own. Installed together, they cover the lifecycle of a production LLM call — cooperating through one event bus, never through imports.
…all riding cendor-core: the instrument() seam + the event bus.
Pack prioritized blocks into a token budget, evict by rule, get an honest receipt of what was kept, shrunk, or dropped. Deterministic.
Content-aware, deterministic compression for JSON, logs, code, prose — no LLM, and every original restores byte-for-byte.
Pre-flight block or downgrade before a token is spent, plus per-feature / per-user cost attribution for free.
Whole-run capture — LLM and tool calls — replayed offline, deterministically, with no API key.
Offline PII/secret detection + a policy that blocks, redacts, or flags — then a tamper-evident, verifiable decision log with compliance evidence packs.
Types, token counting, offline prices, the instrument() seam, and the event bus every tool rides. Zero hard dependencies.
Two ways they plug in.
You call them as you build the request
contextkit (pack to budget) and squeeze (compress oversized blocks — usually invoked by contextkit).
They ride the instrumented call
tokenguard (pre-flight cap, post-flight record), cassette (record/replay), acttrace (detect & enforce a policy, append to the audit log).
gen_ai.* OpenTelemetry spans feed core.otel.ingest() and the wrap-around tools keep working. See the full call lifecycle →CendorCallbackHandler (recording-only); use the provider SDK with instrument() for enforcement. See Frameworks — the honest split & matrix →Use one, or all.
the whole stack, version-pinned — Python or TypeScript — or any single piece: each pulls only cendor-core / @cendor/core.