One decorator, @foxy.audit(). That's the whole SDK.
No rearchitecting, no proxy, no rewriting your model calls. Add one line and each call becomes a content-blind commitment, graded and chained through a durable local queue.
$ pip install foxy-audit
$ export FOXY_API_KEY="YOUR_API_KEY"
$ export FOXY_BACKEND_URL="https://app.foxyaudit.tech"
from foxy_audit import audit
@audit(policy="soc2")
def ask_model(prompt):
return llm.generate(prompt)
The decorator wraps your function transparently. In the default best-effort mode, the SDK saves a record of the call to a local spool on your own thread, which normally takes milliseconds, and a background thread sends it to Foxy Audit. Critical services can enable audit_required=True to fail closed when evidence cannot be delivered.
What actually leaves your machine
- An HMAC commitment of the prompt and response, never the raw text. It is keyed with a key the SDK makes and keeps on your machine, which Foxy Audit never sees.
- The token count, the model name and the policy tag you set. No time leaves with them: the ledger stamps each record when it arrives.
- In
blockorredactmode, the local decision and the ids of the rules that fired. The judge's verdict is not among them: the judge grades this metadata on the server, after the record arrives.
Built to stay out of your way
- Two delivery modes: best-effort background capture or
audit_requiredfail-closed capture. - Default mode is best-effort: telemetry errors stay out of your app;
audit_requiredintentionally fails closed. - Survives outages: records queue locally and sync when the backend is reachable again.
Learn it step by step
The SDK manual explains every feature, setting and command, starting with a first run that needs no account.
Wrap your first call today.
Book a demo and we'll get the SDK recording a real call on your stack in minutes.
Book a demo
Foxy Audit