Agent-agnostic compliance shim for SOX 404 policy enforcement via the ALCV Vault
Project description
Ledgix ALCV — Python SDK
Agent-agnostic compliance shim for SOX 404 policy enforcement. Intercepts AI agent tool calls, validates them against your policies via the ALCV Vault, and ensures only approved actions receive a cryptographically signed A-JWT (Agentic JSON Web Token).
Quick Start
pip install ledgix-python
# ledgix.yaml
# enforce:
# - tool: "stripe_*"
# policy_id: "financial-high-risk"
# - tool: "*"
# policy_id: "default"
import tools
import ledgix_python as ledgix
ledgix.configure(agent_id="payments-agent")
ledgix.auto_instrument(tools)
result = tools.stripe_refund(45, "Late package")
print(result)
auto_instrument() reads ledgix.yaml, ledgix.yml, or ledgix.json from the current working directory by default, wraps matching functions in place, and leaves unmatched functions alone.
Configuration
Set environment variables (prefix: LEDGIX_):
| Variable | Default | Description |
|---|---|---|
LEDGIX_VAULT_URL |
http://localhost:8000 |
Vault server URL |
LEDGIX_VAULT_API_KEY |
"" |
API key for Vault auth |
LEDGIX_VAULT_TIMEOUT |
30.0 |
Request timeout (seconds) |
LEDGIX_VERIFY_JWT |
true |
Verify A-JWT signatures |
LEDGIX_JWT_ISSUER |
alcv-vault |
Expected A-JWT issuer |
LEDGIX_JWT_AUDIENCE |
ledgix-sdk |
Expected A-JWT audience |
LEDGIX_AGENT_ID |
default-agent |
Agent identifier |
Or pass a VaultConfig directly:
from ledgix_python import LedgixClient, VaultConfig
config = VaultConfig(vault_url="https://vault.mycompany.com", vault_api_key="sk-...")
client = LedgixClient(config=config)
Manifest-driven auto-instrumentation
import tools
import ledgix_python as ledgix
ledgix.configure(agent_id="payments-agent")
# Auto-discover ledgix.yaml / ledgix.yml / ledgix.json from the CWD
wrapped = ledgix.auto_instrument(tools)
# Or pass an inline manifest
ledgix.auto_instrument(
tools,
manifest={"enforce": [{"tool": "stripe_*", "policy_id": "financial-high-risk"}]},
)
YAML manifests require pyyaml:
pip install ledgix-python[yaml]
Escape hatch
@ledgix.tool
def special_refund(amount: float):
return ledgix.current_token()
@ledgix.tool(policy_id="override-policy")
def stripe_charge(amount: float):
return ledgix.current_token()
Framework Adapters
LangChain
pip install ledgix-python[langchain]
from ledgix_python.adapters.langchain import LedgixCallbackHandler, LedgixTool
# Option 1: Callback handler (intercepts ALL tool calls)
handler = LedgixCallbackHandler(client)
agent = create_agent(callbacks=[handler])
# Option 2: Wrap individual tools
guarded_tool = LedgixTool.wrap(client, my_tool, policy_id="refund-policy")
LlamaIndex
pip install ledgix-python[llamaindex]
from ledgix_python.adapters.llamaindex import wrap_tool
guarded_tool = wrap_tool(client, my_function_tool, policy_id="refund-policy")
CrewAI
pip install ledgix-python[crewai]
from ledgix_python.adapters.crewai import LedgixCrewAITool
guarded_tool = LedgixCrewAITool.wrap(client, my_tool, policy_id="refund-policy")
Context Manager
from ledgix_python import VaultContext
with VaultContext(client, "stripe_refund", {"amount": 45}) as ctx:
print(ctx.clearance.token) # Use the A-JWT
# Async
async with VaultContext(client, "stripe_refund", {"amount": 45}) as ctx:
print(ctx.clearance.token)
Error Handling
from ledgix_python import ClearanceDeniedError, VaultConnectionError, TokenVerificationError
try:
result = process_refund(amount=5000, reason="...")
except ClearanceDeniedError as e:
print(f"Blocked: {e.reason} (request: {e.request_id})")
except VaultConnectionError:
print("Cannot reach Vault — fail-closed")
except TokenVerificationError:
print("A-JWT signature invalid")
Development
git clone https://github.com/ledgix-dev/python-sdk.git
cd python-sdk
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest tests/ -v --cov
Demo
python demo.py
License
MIT
Project details
Release history Release notifications | RSS feed
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 ledgix_python-0.3.0.tar.gz.
File metadata
- Download URL: ledgix_python-0.3.0.tar.gz
- Upload date:
- Size: 50.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7edd55a839694bef8df9aea4840cdd1c0f0db7ed7625338da444dd2493f2d6c1
|
|
| MD5 |
9422e69b79e2d5d09a4655e81780ab9f
|
|
| BLAKE2b-256 |
f7e2c7322c0224139c0b6eec8784de3d15dd2b863a3e90facac496eab0fc1706
|
File details
Details for the file ledgix_python-0.3.0-py3-none-any.whl.
File metadata
- Download URL: ledgix_python-0.3.0-py3-none-any.whl
- Upload date:
- Size: 38.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9ee62dcd9f977c678495137094fddf09da2e2ec26992048ffc75f76d777757d
|
|
| MD5 |
fc1ad629a02fc26ad1ca4c0b7e688ece
|
|
| BLAKE2b-256 |
7a8612a38dc4910269920896cc43eb4e37695fcf99e72580f9f19061fb9a9553
|