Skip to main content

Redact PII and secrets from AI prompts, traces and tool-call arguments before they reach your loggers.

Project description

traceredact

PyPI Python CI License: Apache-2.0 Website

traceredact

Redact PII and secrets from AI prompts, agent traces and tool-call arguments before they reach your loggers / observability backend.traceredact.com

LLM apps log everything — prompts, agent traces, tool-call arguments — into Langfuse / Helicone / Datadog / your own DB. Customer PII and API keys leak into those traces. traceredact is a small, dependency-light library that detects and redacts that data deterministically, in-process, before it leaves you.

It is content-based: it catches a sk-… key or a credit-card number even when it sits under an innocuous JSON key — not just well-known field names.

A missed secret is a real incident, so detection is treated as safety-critical: bounded (ReDoS-safe) patterns, entropy fallback, Luhn/IBAN validation, and adversarial evasion fixtures.

Install

pip install traceredact          # or: uv add traceredact

Usage (3 lines)

from traceredact import redact

result = redact({"args": {"email": "a@b.com", "key": "sk-1234567890abcdefABCDEFGH"}})
print(result.value)      # {'args': {'email': '[REDACTED:pii]', 'key': '[REDACTED:secret]'}}
print(result.findings)   # [Finding(detector_id='pii.email', json_path='args.email', ...), ...]

redact() accepts a string, dict, list, or any nested mix. The input is never mutated; result.value is a redacted copy and result.findings lists every hit with its detector_id, category, confidence, json_path and span.

CLI (CI-gateable)

traceredact scan ./logs/            # report findings as a table; exit 1 if any
traceredact scan trace.json -f json # machine-readable output for CI
traceredact redact trace.json -o redacted.json

scan exits non-zero when anything is found, so you can gate a CI job on it.

SDK integrations

from openai import OpenAI
from traceredact.integrations.openai import wrap_openai

client = wrap_openai(OpenAI())   # prompts + completions now redacted in-flight

Also: traceredact.integrations.anthropic.wrap_anthropic(client) and traceredact.integrations.langchain.RedactingCallbackHandler().

Async clients are supported via wrap_async_openai / wrap_async_anthropic.

Streaming

Redact a stream of text deltas without buffering the whole response — a secret spanning chunk boundaries is still caught (carry-over window):

from traceredact import redact_stream
for piece in redact_stream(token_deltas):   # also: redact_stream_async(...)
    log(piece)

# OpenAI async streams:
from traceredact.integrations.openai import redact_content_stream
async for safe_text in redact_content_stream(await client.chat.completions.create(..., stream=True)):
    ...

Structured objects

pydantic models, dataclasses and attrs instances are traversed automatically (redacted to dicts). Disable with Policy(traverse_objects=False).

Encoded payloads (opt-in)

Policy(decode_payloads=True) base64-decodes blobs one layer and, if the decoded text contains a high-confidence secret, redacts the whole blob.

Examples

Runnable, heavily-commented scenarios live in examples/: a drop-in logging.Filter, FastAPI/ASGI middleware, streaming, redacting traces before your DB/Langfuse, custom policies, and a CI gate.

Policy file (traceredact.yml)

Drop a traceredact.yml in your repo root (auto-discovered) or pass --policy:

entropy_threshold: 4.0
min_entropy_len: 20
disabled_detectors:
  - pii.phone
allowlist:
  - "noreply@example.com"
allow_patterns:
  - ".*@example\\.com"
placeholder: "[REDACTED:{category}]"
hash_correlation: false        # set true + hash_key to emit correlation tags
custom_patterns:
  - id: custom.internal_user_id
    category: pii
    regex: "ACME-USR-[0-9]{8}"
    confidence: 0.95

See traceredact.yml in this repo for a fully-commented example.

Detectors

Secrets: secrets.openai_key, secrets.anthropic_key, secrets.aws_access_key, secrets.github_token, secrets.slack_token, secrets.slack_webhook, secrets.discord_webhook, secrets.google_api_key, secrets.stripe_key, secrets.sendgrid_key, secrets.twilio_key, secrets.huggingface_token, secrets.npm_token, secrets.pypi_token, secrets.azure_storage_key, secrets.jwt, secrets.private_key, secrets.pgp_private_key, secrets.basic_auth_url, secrets.bearer_token, secrets.env_assignment, secrets.high_entropy.

PII: pii.email, pii.credit_card (Luhn), pii.iban (mod-97), pii.ipv4, pii.phone, pii.us_ssn.

Secret pattern hits are deterministic (confidence 1.0); fuzzy heuristics (entropy, phone, IP) carry lower confidence so policy thresholds can gate them.

Design & safety

  • Deterministic, no data retained. Pure functions; nothing is stored.
  • Copy, never mutate. Your objects are untouched.
  • ReDoS-safe. Cheap literal prefilters gate bounded regexes; no nested quantifiers; input length is capped.
  • Fail-closed. Hash correlation without a key, or exceeding max_depth, raises rather than silently leaking.

Detectors were hardened against adversarial evasion cases (see tests/test_evasion.py).

License

Apache-2.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

traceredact-0.2.3.tar.gz (122.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

traceredact-0.2.3-py3-none-any.whl (33.9 kB view details)

Uploaded Python 3

File details

Details for the file traceredact-0.2.3.tar.gz.

File metadata

  • Download URL: traceredact-0.2.3.tar.gz
  • Upload date:
  • Size: 122.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for traceredact-0.2.3.tar.gz
Algorithm Hash digest
SHA256 d83c64fb3d373184aca34dd742888a06580926f14dc3aeb8fe254c9260d26f63
MD5 b636f5cb3e8b8182abced9ce3addfcc5
BLAKE2b-256 08842dd6ade1ec5b0174907069ae4188f870bdd9a77a401dc5eaebfb27e4e41a

See more details on using hashes here.

Provenance

The following attestation bundles were made for traceredact-0.2.3.tar.gz:

Publisher: release.yml on traceredact/traceredact

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file traceredact-0.2.3-py3-none-any.whl.

File metadata

  • Download URL: traceredact-0.2.3-py3-none-any.whl
  • Upload date:
  • Size: 33.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for traceredact-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 7a04a6ebf3d2b078d8c8e365fb71cf60d1e18115701ea44182d7ab3d9afe897d
MD5 e4ee6da89e402bd7c3a5e942c9a048d7
BLAKE2b-256 40dbd8cd8766e2ab31a63fb567c9177bfe5a80cac9f5abcc0d66bb96e2c12552

See more details on using hashes here.

Provenance

The following attestation bundles were made for traceredact-0.2.3-py3-none-any.whl:

Publisher: release.yml on traceredact/traceredact

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page