Agendex SDK
Resource-Level Governance for AI Agents - Dynamic task-scoped access control, parameter inspection, and tamper-evident audit trails.
What Makes Agendex Different
| Traditional IAM | Agendex |
|---|---|
| "Agent can use payment tool" | "Agent doing vendor_payment task can call payments API if amount < $1000" |
| Static permissions | Dynamic, task-scoped |
| No parameter inspection | Full body/query inspection |
| Tool-level control | Resource-level control |
Installation
pip install agendex
With framework extras:
pip install agendex[langchain] # LangChain integration
pip install agendex[crewai] # CrewAI integration
pip install agendex[all] # All integrations
Quick Start: Resource-Level Governance (~30 lines)
from agendex import AgendexClient, GovernedDBClient, GovernedS3Client, GovernedHTTPSession
from agendex.errors import DeniedError, PendingApprovalError
# 1. Create client (reads config from env vars)
client = AgendexClient()
# 2. Create governed resource clients
db = GovernedDBClient(client, task="monthly_report")
s3 = GovernedS3Client(client, task="monthly_report")
http = GovernedHTTPSession(client, task="monthly_report")
# 3. Use in your tools - governance happens automatically
def fetch_revenue(month: str) -> str:
try:
result = db.query("monthly_revenue", {"month": month})
return json.dumps(result.get("rows", []))
except DeniedError as e:
return f"[DENIED] {e.reason}"
except PendingApprovalError as e:
return f"[APPROVAL REQUIRED] ID: {e.approval_id}"
def initiate_payment(amount: float, vendor: str) -> str:
try:
result = http.post(
"https://payments.api/v1/pay",
json={"amount": amount, "vendor": vendor}
)
return json.dumps(result)
except DeniedError as e:
return f"[DENIED] {e.reason}" # e.g., "amount > 5000"
Environment Variables
| Variable | Description | Default |
|---|---|---|
AGENDEX_URL |
Proxy URL | http://localhost:8000 |
AGENDEX_AGENT_ID |
Agent identifier | required |
AGENDEX_TOKEN |
Bearer token | required |
How It Works
+-----------------------------------------------------------------+
| Agent Process |
| |
| Tool: fetch_revenue("2025-01") |
| | |
| v |
| GovernedDBClient.query("monthly_revenue", {month: "2025-01"}) |
| | |
+---------+--------------------------------------------------------+
|
v
+-----------------------------------------------------------------+
| Agendex Proxy |
| |
| /evaluate: { |
| action: "db.query.run", |
| params: {query_id: "monthly_revenue"}, |
| task: "monthly_report" |
| } |
| | |
| v |
| Policy: Allow db.query.run IF query_id=monthly_revenue |
| AND task IN [monthly_report, demo] |
| | |
| v |
| /invoke -> DBQueryAdapter -> SQLite -> rows |
| |
+-----------------------------------------------------------------+
Policy Examples
agents:
finance_bot:
allow:
# DB: Only specific queries, scoped by task
- action: "db.query.run"
resources:
- type: db_query
query_id: "monthly_revenue"
tasks: ["monthly_report", "demo"]
# S3: Only specific buckets/prefixes
- action: "s3.reports.fetch"
resources:
- type: s3
bucket: "reports-bucket"
key_prefix: "monthly/"
# HTTP: Parameter-aware decisions
- action: "http.service.call"
condition: "body.amount < 1000"
- action: "http.service.call"
condition: "1000 <= body.amount <= 5000"
require_approval: true
# CRM: Scoped to lookup only
- action: "crm.lookup"
tasks: ["support"]
deny:
- action: "http.service.call"
condition: "body.amount > 5000"
Resource Clients
| Client | Action | What It Governs |
|---|---|---|
GovernedDBClient |
db.query.run |
Query ID, parameters |
GovernedS3Client |
s3.reports.fetch |
Bucket, key prefix |
GovernedHTTPSession |
http.service.call |
Domain, path, method, body |
GovernedCRMClient |
crm.lookup, crm.update |
Account ID, status changes |
GovernedTool |
any custom action | Arbitrary params |
GovernedTool: Custom Actions
For actions that don't fit a built-in client, use GovernedTool:
from agendex import GovernedTool
# Wrap any action
slack = GovernedTool(client, action="slack.post", task="alerts")
slack.invoke(channel="#ops", message="System alert!")
# Or call it directly
email = GovernedTool(client, action="email.send", task="notifications")
email(to="admin@co.com", subject="Report ready")
Configuration
Override default action names globally:
from agendex import configure_actions
configure_actions(
db_query="database.execute", # db.query -> database.execute
http_request="api.call", # http.request -> api.call
crm_lookup="salesforce.lookup", # crm.lookup -> salesforce.lookup
)
Integration Overhead
~31 lines to add Agendex to an existing agent:
- 2 lines: imports
- 3 lines: config
- 3 lines: tool signatures
- 18 lines: error handling (6 per tool)
- 5 lines: initialization
Documentation
- Quickstart Guide - Step-by-step integration
- API Reference - Complete SDK docs
License
MIT
Release files for agendex 0.2.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agendex-0.2.6.tar.gz | 56.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agendex-0.2.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 110.1 kB
Release files / agendex-0.2.6.tar.gz
| Download URL | agendex-0.2.6.tar.gz |
|---|---|
| Size | 56.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
49af5f49608da0d22e5fa8e80d2b34526ae24b8eb6702ee76d16d25200fa4f36
|
|
BLAKE2b-256 checksum How to use checksums |
7c2e2eab7d1dd347e1ac34106f5cd74ed8bd807bbd9de3bcb490ef82f8557fe5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 23, 2026.
Transparency logRelease files / agendex-0.2.6-py3-none-any.whl
| Download URL | agendex-0.2.6-py3-none-any.whl |
|---|---|
| Size | 53.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
418b5edbab0997d96c031afda3eaff340aaff4387e0d2d0fd9e43f570f9538cb
|
|
BLAKE2b-256 checksum How to use checksums |
07821613e7e17757a6ec928940dc53ac24c6a7e6417ec266b635cd311a7aa30f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 23, 2026.
Transparency log