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
Release files for ledgix-python 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ledgix_python-0.4.0.tar.gz | 54.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ledgix_python-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 94.9 kB
Release files / ledgix_python-0.4.0.tar.gz
| Download URL | ledgix_python-0.4.0.tar.gz |
|---|---|
| Size | 54.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
80f786e9504310f57607588b2579c61e4ab6b2093bce2ab97e1de022002d1a60
|
|
BLAKE2b-256 checksum How to use checksums |
3a1f3215e709504464e4bf8c7b547558fb60d237e3981d0016324da6f310a59e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.4
|
Release files / ledgix_python-0.4.0-py3-none-any.whl
| Download URL | ledgix_python-0.4.0-py3-none-any.whl |
|---|---|
| Size | 40.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
02d1dd899539d960f102c9c84ba3a8e4b765b1e716cc8e186028a5c1ddadd098
|
|
BLAKE2b-256 checksum How to use checksums |
60eb210469c9c0015efde2f6ebcc16f608e381a02df2d931751fc819872a9124
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.4
|