The libraries

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.

contextkit
assemble
squeeze
compress
tokenguard
budget
cassette
test
acttrace
audit

…all riding cendor-core: the instrument() seam + the event bus.

How they compose

Two ways they plug in.

Inbound

You call them as you build the request

contextkit (pack to budget) and squeeze (compress oversized blocks — usually invoked by contextkit).

Wrap-around

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).

Don't own the loop? Managed runtimes' gen_ai.* OpenTelemetry spans feed core.otel.ingest() and the wrap-around tools keep working. See the full call lifecycle →
Using LangChain or LangGraph? Record usage, reasoning, tools & run-correlation via CendorCallbackHandler (recording-only); use the provider SDK with instrument() for enforcement. See Frameworks — the honest split & matrix →
Starting fresh, with no framework to plug under? That's Cendor's other door — cendor-sdk, a governed agent loop built on these six libraries. Same primitives, so you can mix both or move between them without a migration.
Get started

Use one, or all.

$ pip install cendor-libs
$ npm i @cendor/libs

the whole stack, version-pinned — Python or TypeScript — or any single piece: each pulls only cendor-core / @cendor/core.