Zero-dependency Python client for the raxIT runtime governance engine (permit / defer / deny on every tool call)
Project description
raxit — thin Python client for the raxIT governance daemon
Govern every agent tool call with permit / defer / deny, before it executes.
pip install raxit # zero runtime dependencies (stdlib only); or: uv add raxit
Docs: docs.raxit.ai.
Platforms: the launcher resolves/downloads engine binaries for
darwin/linux only. On Windows, run raxit from WSL — there is no
native Windows engine build.
Zero-code governance (raxit run)
The fastest path is no SDK calls at all. raxit run boots the daemon on
localhost:8181, sets the child environment, and preloads the auto-patcher
(via sitecustomize) so every tool call is governed. raxit init scans your
repo and generates the .raxit/ policy workspace first — raxit run
fail-closes without it:
raxit init # scan -> generate .raxit/
raxit run -- python agent.py # inherits the agent id from .raxit/security.yaml
Under the hood this sets RAXIT_AUTOLOAD=1 and puts the raxit
sitecustomize dir on PYTHONPATH, so the auto-patcher fires at Python
startup and patches the tool-dispatch choke point of each detected
framework:
| Framework | How it's governed |
|---|---|
| LangChain | Auto-patched (importable) |
| LangGraph | Auto-patched |
| CrewAI | Auto-patched |
| AutoGen | Auto-patched |
| OpenAI Agents SDK | Auto-patched |
| Pydantic AI | Auto-patched |
| Google ADK | Auto-patched |
| LlamaIndex | Auto-patched |
| Strands Agents | Auto-patched |
| smolagents | Auto-patched |
| Haystack | Auto-patched |
| Agno | Auto-patched |
| Claude Agent SDK | Auto-patched (injects a PreToolUse hook) |
| Microsoft Agent Framework | Auto-patched (injects a FunctionMiddleware) |
| DSPy | Auto-patched (Tool.__call__/.acall for dspy.ReAct, plus ToolCalls.ToolCall.execute for native tool calling — two independent surfaces) |
| CAMEL-AI | Auto-patched (FunctionTool.__call__/.async_call — the chokepoint every ChatAgent tool call, sync or async, normalizes through) |
| Agency Swarm | Auto-patched (inherited — tool dispatch, incl. its own SendMessage, flows through OpenAI Agents SDK's already-patched chokepoint; no dedicated patcher) |
A blocked call raises RaxitDenied; a MODIFY verdict runs the tool on the
engine's transformed arguments; a permit runs it unchanged. raxit.agent
also exposes governed / governed_tool as a manual, per-tool escape hatch
when auto-patch doesn't fit.
Programmatic client
from raxit import RaxitClient
client = RaxitClient("http://localhost:8181", agent_id="my-agent")
d = client.govern(resource="db.read", args={"query": "select 1"})
if d.deferred:
d = client.govern.approve_wait(d) # blocks until a human approves
if d.denied:
raise RuntimeError(f"{d.reason_code}: {d.hint}")
result = run_tool() # only runs on permit
client.output.record(result, car=d.car) # feeds output governance + taint
LangChain (no langchain import required by this package):
from raxit.langchain import RaxitCallbackHandler
handler = RaxitCallbackHandler(client) # raises RaxitDenied on deny
agent.run("...", callbacks=[handler])
Fail-closed by default: if the daemon is unreachable, govern() returns
deny (deny.daemon_unreachable). Pass fail_open=True for dev only.
RAXIT_GOVERNANCE
Governed by default. RAXIT_GOVERNANCE=off is the kill-switch for
contrast/before-after demos — the client then bypasses the daemon entirely
and every call synthesizes permit. Only two values are accepted (after
strip().lower()): on and off; unset defaults to on. Any other value —
1/true/yes/0/false/no, or a typo — raises ValueError at client
construction, before any network call, rather than silently guessing.
Audit — verify the tamper-evident decision log
client.audit.verify() checks the hash-chained Decision Provenance log; pass
signatures=True with one or more pinned Ed25519 public keys to also verify
record signatures offline against a trusted key (not the daemon's own
config):
client = RaxitClient("http://localhost:8181", operator_token="<operator token>")
report = client.audit.verify(
signatures=True,
require_signed=True,
pubkeys=["<base64 raw-32-byte Ed25519 pubkey>"],
)
assert report["signatures_verified"] and report["signed_count"] > 0
Operator-gated (Authorization: Bearer <operator_token>). For fully offline,
adversarial-grade verification use the CLI:
raxit audit verify --signatures --pubkey <key>.
Budget — read the session/principal budget projection
client.budget.get() is a strictly read-only projection of the engine's budget
accountant — never a reservation. It reports used/remaining against each
configured cap (call budget, per-session and per-day token/cost caps):
client = RaxitClient("http://localhost:8181", operator_token="<operator token>")
snap = client.budget.get(agent_id="payments-bot", session_id="sess-1")
for b in snap.budgets:
print(b.name, b.used, "/", b.limit, b.unit, f"({b.window})")
Operator-gated (Authorization: Bearer <operator_token>). Fails closed: an
unreachable daemon raises GovernanceError — it is never read as an empty
or infinite budget. An empty snap.budgets means genuinely no cap configured.
Warrants — inspect the loaded standing grants
client.warrants.list() / client.warrants.get(id) are a read-only view of the
warrants loaded at raxit serve startup. There is no create/revoke — minting
stays the operator-controlled load path.
client = RaxitClient("http://localhost:8181", operator_token="<operator token>")
for w in client.warrants.list():
print(w.id, w.agent_id, w.tool_pattern, w.status, "expires", w.expires_at)
Operator-gated. Fails closed (raises GovernanceError when unreachable, so
"none" is never confused with "unreachable"). Warrants carry no credentials and
the attested intent-baseline text is never projected.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file raxit-0.0.3.tar.gz.
File metadata
- Download URL: raxit-0.0.3.tar.gz
- Upload date:
- Size: 185.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b0febd3d39c620efd618354aa4b7fcedeec2778b393f916f2a6b0dd23cb3fbf0
|
|
| MD5 |
7cfb493a6f45226b3001bfc1cd35ff35
|
|
| BLAKE2b-256 |
f8bd38b45e87895c44740a068d27624be720b871aeb31a68af55080e8b629555
|
Provenance
The following attestation bundles were made for raxit-0.0.3.tar.gz:
Publisher:
publish.yml on raxITlabs/runtime-security-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
raxit-0.0.3.tar.gz -
Subject digest:
b0febd3d39c620efd618354aa4b7fcedeec2778b393f916f2a6b0dd23cb3fbf0 - Sigstore transparency entry: 2188139669
- Sigstore integration time:
-
Permalink:
raxITlabs/runtime-security-core@58a7bfeef7d9b27a5c160ea6f045381cf8d2d12c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/raxITlabs
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@58a7bfeef7d9b27a5c160ea6f045381cf8d2d12c -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file raxit-0.0.3-py3-none-any.whl.
File metadata
- Download URL: raxit-0.0.3-py3-none-any.whl
- Upload date:
- Size: 126.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b490db3f6184757fcdb1f6e37d5718a3ade369cd5cd7f76859cb42ee141c71a9
|
|
| MD5 |
0f3c855d289705f06d3c6f8f4e7c968c
|
|
| BLAKE2b-256 |
5835ee4e37c7fefb6a91d9685dce05a6d3c673f99be537363e8317e3af0f9a7e
|
Provenance
The following attestation bundles were made for raxit-0.0.3-py3-none-any.whl:
Publisher:
publish.yml on raxITlabs/runtime-security-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
raxit-0.0.3-py3-none-any.whl -
Subject digest:
b490db3f6184757fcdb1f6e37d5718a3ade369cd5cd7f76859cb42ee141c71a9 - Sigstore transparency entry: 2188139671
- Sigstore integration time:
-
Permalink:
raxITlabs/runtime-security-core@58a7bfeef7d9b27a5c160ea6f045381cf8d2d12c -
Branch / Tag:
refs/heads/main - Owner: https://github.com/raxITlabs
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@58a7bfeef7d9b27a5c160ea6f045381cf8d2d12c -
Trigger Event:
workflow_dispatch
-
Statement type: