Skip to main content

Python SDK for Senthex AI Firewall — secure your LLM API calls

Project description

senthex

Python SDK for the Senthex AI Firewall proxy — one line of code to secure your LLM API calls.

Install

pip install senthex

Quick start

from senthex import SenthexOpenAI, InjectionBlocked

client = SenthexOpenAI(senthex_key="sx-...", api_key="sk-...")

try:
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": "Hello"}],
    )
    print(resp.senthex.shield_status)    # "pass" | "warn" | "block"
    print(resp.senthex.injection_score)  # 0.0 – 1.0
except InjectionBlocked as e:
    print(f"Injection blocked (score={e.score:.2f}, patterns={e.patterns})")

Supported providers

Pass the provider argument to route to a different LLM backend:

# OpenAI (default — X-Senthex-Provider header not sent)
client = SenthexOpenAI(senthex_key="sx-...", api_key="sk-...")

# Anthropic
client = SenthexOpenAI(senthex_key="sx-...", api_key="sk-ant-...", provider="anthropic")

# Mistral
client = SenthexOpenAI(senthex_key="sx-...", api_key="...", provider="mistral")

# Google
client = SenthexOpenAI(senthex_key="sx-...", api_key="...", provider="google")

# OpenRouter
client = SenthexOpenAI(senthex_key="sx-...", api_key="...", provider="openrouter")

Per-agent and per-session tracking

client = SenthexOpenAI(
    senthex_key="sx-...",
    api_key="sk-...",
    agent_id="my-agent-v2",     # track trust level per agent
    session_id="sess-abc123",   # track injection risk across turns
)

Shield metadata

Every response carries a .senthex attribute with analysis results:

resp = client.chat.completions.create(...)
m = resp.senthex

print(m.shield_status)            # "pass" | "warn" | "block"
print(m.injection_score)          # float 0.0–1.0
print(m.pii_found)                # ["EMAIL", "CREDIT_CARD", ...]
print(m.intent_risk)              # "none" | "low" | "medium" | "high"
print(m.intent_category)          # e.g. "data_exfiltration"
print(m.trust_level)              # "normal" | "reduced" | "low" | "blocked"
print(m.data_classification)      # "PUBLIC" | "INTERNAL" | "CONFIDENTIAL" | "RESTRICTED"
print(m.data_types)               # ["EMAIL", ...]
print(m.toxicity_score)           # float 0.0–1.0
print(m.toxicity_category)        # e.g. "hate_speech"
print(m.budget_warning)           # bool — approaching budget limit
print(m.budget_remaining_hour)    # float USD remaining this hour
print(m.tokens_remaining)         # int tokens left in budget
print(m.canary_triggered)         # bool — canary token was triggered
print(m.prompt_status)            # "verified" | "mutated" | "new"
print(m.prompt_drift)             # float — drift score vs registered prompt
print(m.session_injection_score)  # float — cumulative session risk
print(m.session_turn_count)       # int — number of turns in session
print(m.hardening)                # "off" | "standard" | "strict"
print(m.content_sources)          # ["text", "file"]
print(m.file_scanned)             # bool
print(m.latency_ms)               # float — Senthex overhead in ms
print(m.request_id)               # str — unique request ID

Exception handling

All Senthex-specific errors are typed exceptions that inherit from SenthexError:

from senthex import (
    InjectionBlocked,
    IntentBlocked,
    AgentBlocked,
    DataRoutingBlocked,
    BudgetExceeded,
    RateLimited,
    AuthenticationError,
    SenthexError,
)

try:
    resp = client.chat.completions.create(...)
except InjectionBlocked as e:
    # e.score    — float injection score
    # e.patterns — list of matched patterns
    print(f"Injection score={e.score}, patterns={e.patterns}")

except IntentBlocked as e:
    # e.intent_score — float
    # e.category     — str e.g. "data_exfiltration"
    print(f"Dangerous intent: {e.category} (score={e.intent_score})")

except AgentBlocked as e:
    # e.trust_level — "low" | "blocked"
    # e.duration    — retry_after_seconds (int)
    print(f"Agent blocked for {e.duration}s (trust={e.trust_level})")

except DataRoutingBlocked as e:
    # e.classification    — "RESTRICTED" | ...
    # e.allowed_providers — list of allowed providers
    print(f"Data class {e.classification} not allowed here")

except BudgetExceeded as e:
    # e.limit       — float USD limit
    # e.current     — float USD consumed
    # e.retry_after — ISO 8601 reset timestamp
    print(f"Budget {e.current:.2f}/{e.limit:.2f} USD")

except RateLimited as e:
    # e.retry_after — int seconds
    print(f"Rate limited, retry in {e.retry_after}s")

except AuthenticationError:
    print("Invalid or missing X-Senthex-Key")

except SenthexError as e:
    # Catch-all: e.code, e.message, e.details, e.metadata
    print(f"Senthex error [{e.code}]: {e.message}")

Every exception also exposes .metadata (a ShieldMetadata instance) when the proxy includes X-Senthex-* headers in the error response.

Management API

from senthex import SenthexManagement

mgmt = SenthexManagement(senthex_key="sx-...")

# Infrastructure
mgmt.health()
mgmt.usage()          # defaults to "24h", also accepts "7d", "30d"
mgmt.capabilities()

# Policy
mgmt.get_policy()
mgmt.update_policy(pii_mode="block", injection_threshold=0.7)

# Budget
mgmt.get_budget()
mgmt.set_budget(daily_usd=20.0)

# Per-agent trust
mgmt.get_trust("my-agent")
mgmt.reset_trust("my-agent")

# Prompts and sessions
mgmt.get_prompts()
mgmt.get_sessions()

# Security events
mgmt.events(severity="high", limit=20)

The management client supports use as a context manager:

with SenthexManagement(senthex_key="sx-...") as mgmt:
    print(mgmt.health())

License

MIT

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

senthex-0.1.0.tar.gz (19.2 kB view details)

Uploaded Source

Built Distribution

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

senthex-0.1.0-py3-none-any.whl (14.0 kB view details)

Uploaded Python 3

File details

Details for the file senthex-0.1.0.tar.gz.

File metadata

  • Download URL: senthex-0.1.0.tar.gz
  • Upload date:
  • Size: 19.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for senthex-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f626bc0d65ad50d25c3eaf388456da3c1041bc5e34101eaa0d7cbc753aba0c0e
MD5 d7cc90e9b1a29598b9a1b251ca2ec481
BLAKE2b-256 98d958df19a032a65b7ee7d759a67303ff9af4fa6d53badaa67d8d02fba84325

See more details on using hashes here.

File details

Details for the file senthex-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: senthex-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 14.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for senthex-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6adf1b3291045a61600ce60859d80486a66c841e0c1ce275f5e7fb046c036d8d
MD5 ac658db9d35f28019098281e59751edb
BLAKE2b-256 c0f66d2f1a3243e2b71986f70a58095651770d673a140042d12a223414df58ef

See more details on using hashes here.

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