Skip to main content

A guardrail system that intercepts and validates AI agent tool calls

Project description

Veto

A guardrail system for AI agent tool calls. Veto intercepts and validates tool calls made by AI models before execution.

How It Works

  1. Initialize Veto.
  2. Wrap your tools using veto.wrap().
  3. Pass the wrapped tools to your AI agent/model.

When the AI model calls a tool, Veto automatically:

  1. Intercepts the call.
  2. Validates arguments against your rules (via YAML & LLM).
  3. Blocks or Allows execution based on the result.

The AI model remains unaware of the guardrail - the tool interface is preserved.

Installation

pip install veto

For a complete bank transfer escalation example, see the HITL guide.

For LLM provider support:

pip install veto[openai]      # OpenAI support
pip install veto[anthropic]   # Anthropic support
pip install veto[gemini]      # Google Gemini support
pip install veto[all]         # All providers

Quick Start

1. Initialize Veto

Run the CLI to create configuration:

veto init

This creates a veto/ directory with veto.config.yaml and default rules.

2. Wrap Your Tools

from veto import Veto

# 1. Define your tools normally
my_tools = [
    {"name": "my_tool", "handler": my_handler, ...},
    # ...
]

# 2. Initialize Veto
veto = await Veto.init()

# 3. Wrap tools (Validation logic is injected)
wrapped_tools = veto.wrap(my_tools)

# 4. Pass to your Agent/LLM
agent = create_agent(
    tools=wrapped_tools,
    # ...
)

3. Configure Rules

Edit veto/rules/financial.yaml (example):

rules:
  - id: limit-transfers
    name: Limit large transfers
    action: block
    tools:
      - transfer_funds
    conditions:
      - field: arguments.amount
        operator: greater_than
        value: 1000

Configuration

veto.config.yaml

version: "1.0"

# Operating mode
mode: "strict" # "strict" blocks calls, "log" only logs them

# Validation Backend
validation:
  mode: "custom" # "api" or "custom"

# Custom Provider (if mode is custom)
custom:
  provider: "gemini" # or openai, anthropic
  model: "gemini-3-flash-preview"

# Logging
logging:
  level: "info"

# Rules
rules:
  directory: "./rules"
  recursive: true

API Reference

Veto.init(options?)

Initialize Veto. Loads configuration from ./veto by default.

veto = await Veto.init()

veto.wrap(tools)

Wraps an array of tools. The returned tools have Veto validation injected into their execution handler.

wrapped_tools = veto.wrap(my_tools)

veto.wrap_tool(tool)

Wraps a single tool instance.

safe_tool = veto.wrap_tool(my_tool)

veto.get_history_stats()

Returns statistics about allowed vs blocked calls.

stats = veto.get_history_stats()
print(stats)
# {"total_calls": 5, "allowed_calls": 4, "denied_calls": 1, ...}

veto.clear_history()

Resets the history statistics.

veto.clear_history()

veto.export_decisions(format)

Exports decision history as JSON or CSV.

json_audit = veto.export_decisions("json")
csv_audit = veto.export_decisions("csv")

CLI Commands

Command Description
veto init Initialize Veto in current directory
veto version Show version

License

MIT

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

veto-0.8.0.tar.gz (95.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

veto-0.8.0-py3-none-any.whl (77.1 kB view details)

Uploaded Python 3

File details

Details for the file veto-0.8.0.tar.gz.

File metadata

  • Download URL: veto-0.8.0.tar.gz
  • Upload date:
  • Size: 95.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for veto-0.8.0.tar.gz
Algorithm Hash digest
SHA256 592b650b4ea7f2e1a07f1bc6dc177506f80c0c131989f901ed64356eeceef133
MD5 a4c445e351bc4ce9eb2424e37ff3bad6
BLAKE2b-256 3cd251e8fcda68c289ca16506b70c3f01269740cdc8aba23bfab1be4f10f1d9f

See more details on using hashes here.

File details

Details for the file veto-0.8.0-py3-none-any.whl.

File metadata

  • Download URL: veto-0.8.0-py3-none-any.whl
  • Upload date:
  • Size: 77.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for veto-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ca3f3e33dbb70e9906dffa53a7591ad35c517005ab0b89da5d7daef7a14c5fbb
MD5 c296bf5ba46882bdd3c5314e94e30cf5
BLAKE2b-256 cbe67c9bac5d83e31873804dc62578c044a8887df635050e35d0e9eeca01346a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page