Runtime authorization for AI agents — Python SDK
Project description
useveto
Runtime authorization for AI agents — Python SDK.
What is Veto?
Veto intercepts every tool call your AI agent makes, evaluates it against your policies, and decides: allow, deny, or escalate. Sub-10ms. Default deny.
- Default deny — no matching policy = blocked
- Full audit trail — every decision logged
- Edge-first — powered by Cloudflare Workers
- Sync + async — both clients included
Install
pip install useveto
Quick Start
from veto import VetoClient
client = VetoClient(api_key="veto_...")
# Check if an agent can perform an action
result = client.authorize("agent-uuid", "file.write", {"path": "/etc/passwd"})
if not result.allowed:
print(f"Blocked: {result.reason}")
Async
from veto import AsyncVetoClient
async with AsyncVetoClient(api_key="veto_...") as client:
result = await client.authorize("agent-uuid", "send_email", {
"to": "user@example.com",
"subject": "Refund confirmation",
})
LangChain Integration
from veto import VetoClient, VetoError
veto = VetoClient(api_key="veto_...")
def veto_tool_wrapper(tool_func, tool_name: str, agent_id: str):
"""Wrap any LangChain tool with Veto authorization."""
def wrapper(*args, **kwargs):
result = veto.authorize(agent_id, tool_name, kwargs)
if not result.allowed:
return f"Authorization denied: {result.reason}"
return tool_func(*args, **kwargs)
wrapper.__name__ = tool_func.__name__
wrapper.__doc__ = tool_func.__doc__
return wrapper
CrewAI Integration
from veto import VetoClient
veto = VetoClient(api_key="veto_...")
def before_tool_callback(agent_id: str):
def callback(tool_name: str, tool_input: dict) -> bool:
result = veto.authorize(agent_id, tool_name, tool_input)
return result.allowed
return callback
API Reference
VetoClient / AsyncVetoClient
client = VetoClient(
api_key="veto_...", # required
endpoint="https://api.veto.tools", # optional
timeout=5.0, # optional, seconds
)
Authorization
client.authorize(agent_id, tool_name, parameters={}) -> AuthorizationResult
Agents
client.create_agent(CreateAgentInput(name="Bot", description="...")) -> Agent
client.list_agents() -> List[Agent]
client.get_agent(agent_id) -> Agent
client.delete_agent(agent_id) -> None
Policies
client.create_policy(CreatePolicyInput(
agent_id="...",
name="Allow reads",
rules=[PolicyRule(type="tool_allowlist", tools=["file.read"])],
priority=10,
)) -> Policy
client.list_policies(agent_id=None) -> List[Policy]
client.get_policy(policy_id) -> Policy
client.update_policy(policy_id, UpdatePolicyInput(name="New name")) -> Policy
client.delete_policy(policy_id) -> None
Audit Logs
client.query_audit_log(
agent_id=None,
tool_name=None,
result=None, # "allowed" | "denied" | "escalated"
limit=100,
offset=0,
) -> PaginatedAuditLogResponse
Error Handling
from veto import VetoError, UnauthorizedError, RateLimitError
try:
result = client.authorize("agent", "tool")
except RateLimitError as e:
print(f"Retry after {e.retry_after_ms}ms")
except UnauthorizedError:
print("Invalid API key")
except VetoError as e:
print(f"{e.code}: {e}")
Context Manager
# Sync
with VetoClient(api_key="veto_...") as client:
result = client.authorize("agent-1", "file.read")
# Async
async with AsyncVetoClient(api_key="veto_...") as client:
result = await client.authorize("agent-1", "file.read")
Links
- Website: veto.tools
- Dashboard: app.veto.tools
- API Docs: docs.veto.tools
- GitHub: github.com/useveto/python
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
useveto-0.1.1.tar.gz
(9.4 kB
view details)
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 useveto-0.1.1.tar.gz.
File metadata
- Download URL: useveto-0.1.1.tar.gz
- Upload date:
- Size: 9.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
63cc3e3cc8430da96f35c490be57448dea069265164923196ee78ce12783e5cf
|
|
| MD5 |
b4ebedd3fe94e4c2973b2999e0d3f5c5
|
|
| BLAKE2b-256 |
ced46095012d3d9e18da96edb9f4845b41c69c3faa844ff573e312f713eb2125
|
File details
Details for the file useveto-0.1.1-py3-none-any.whl.
File metadata
- Download URL: useveto-0.1.1-py3-none-any.whl
- Upload date:
- Size: 9.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3206c8132bc8af78406b602684293c460623c633625bee614b791ddc8304fee3
|
|
| MD5 |
e708bd98f9694a4caf781625f71459bd
|
|
| BLAKE2b-256 |
cab92758b8cdfe690acf6fb551883af9ea193911c469366e20804813e48501dc
|