Skip to main content

Deterministic, pre-execution gating for semantic actions (e.g. tool calls) in agent systems.

Project description

ActionGate

Deterministic, pre-execution gating for semantic actions (e.g. tool calls) in agent systems.

Source of Truth

The canonical source is github.com/actiongate-oss/actiongate. PyPI distribution is a convenience mirror—verify against the repo if provenance matters to you.

Install

pip install actiongate            # PyPI
pip install actiongate[redis]     # with Redis support
pip install -e .                  # from source

Vendoring encouraged. This is a small, stable primitive. Copy it into your codebase, fork it, reimplement it in Rust/Go/whatever. See SEMANTICS.md for the behavioral contract if you reimplement.


Quick Start

from actiongate import Engine, Gate, Policy, Blocked

engine = Engine()

@engine.guard(
    Gate("api", "search", "user:123"),
    Policy(max_calls=5, window=60)
)
def search(query: str) -> list[str]:
    return api.search(query)

try:
    results = search("hello")
except Blocked as e:
    print(f"Rate limited: {e.decision.message}")

Core Concepts

Gate

Identifies what's being rate-limited:

Gate(namespace, action, principal)

Gate("billing", "refund", "user:123")    # per-user
Gate("support", "escalate", "agent:42")  # per-agent  
Gate("api", "search", "global")          # global limit

Policy

Policy(
    max_calls=5,        # allow N calls per window
    window=60,          # rolling window (seconds)
    cooldown=2,         # min seconds between calls
    mode=Mode.HARD,     # HARD raises, SOFT returns Result
    on_store_error=StoreErrorMode.FAIL_CLOSED
)

Two Decorator Styles

@engine.guard(gate, policy)        # returns T, raises Blocked
@engine.guard_result(gate, policy) # returns Result[T], never raises

Scope & Non-Goals

ActionGate does:

  • Pre-execution rate limiting (allow N, block N+1)
  • Cooldown enforcement (min time between calls)
  • Atomic check-and-reserve for correctness under concurrency
  • Deterministic decisions with full explainability

ActionGate does not:

  • Make LLM calls or consume tokens
  • Do semantic/intent analysis
  • Manage cost, budgets, or billing
  • Orchestrate multi-agent workflows
  • Provide authentication or authorization
  • Replace circuit breakers, retries, or backpressure

See SEMANTICS.md for the formal behavioral contract.


Distributed: Redis Backend

import redis
from actiongate import Engine, RedisStore

client = redis.Redis(host='localhost', port=6379, decode_responses=True)
engine = Engine(store=RedisStore(client))
  • Atomic via Lua script
  • Keys auto-expire at max(window, cooldown) × 1.5
  • Member format {timestamp}:{nonce} prevents collision

Observability

engine.on_decision(lambda d: logger.info(f"{d.status}: {d.gate}"))

Every decision includes: status, reason, gate, policy, calls_in_window, time_since_last. See examples.py for Prometheus/StatsD patterns.


Benchmarks

python -m actiongate.bench
python -m actiongate.bench --redis localhost:6379

Results from local benchmark on Apple M1, Python 3.12. Run to reproduce on your hardware.

Store p50 p95 p99 Throughput
MemoryStore ~2μs ~3μs ~5μs ~400k ops/s
RedisStore (localhost) ~200μs ~300μs ~500μs ~4k ops/s

API Reference

Type Purpose
Engine Core gating logic
Gate Action identity tuple
Policy Rate limit configuration
Decision Evaluation result with full context
Result[T] Wrapper for guard_result
Blocked Exception from guard
MemoryStore Single-process backend
RedisStore Distributed backend
Enum Values
Mode HARD, SOFT
StoreErrorMode FAIL_CLOSED, FAIL_OPEN
Status ALLOW, BLOCK
BlockReason RATE_LIMIT, COOLDOWN, STORE_ERROR

License

Apache License 2.0. See LICENSE for the full text.

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

actiongate-0.3.0.tar.gz (27.8 kB view details)

Uploaded Source

Built Distribution

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

actiongate-0.3.0-py3-none-any.whl (17.9 kB view details)

Uploaded Python 3

File details

Details for the file actiongate-0.3.0.tar.gz.

File metadata

  • Download URL: actiongate-0.3.0.tar.gz
  • Upload date:
  • Size: 27.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for actiongate-0.3.0.tar.gz
Algorithm Hash digest
SHA256 a95ef35f99fe9089c60673973ee4185946bdd72fcca58cbc3cf2887f875a9b87
MD5 16fb1764eb9bc6b0dc22fa61da26d2d5
BLAKE2b-256 77dc3818e2f8dfb7a5e28e55f1e9ae93337ee3489aa1e80bbd2c12d20815e2f5

See more details on using hashes here.

File details

Details for the file actiongate-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: actiongate-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 17.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for actiongate-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 37143b9da9f4205c8388216edc8f043674cbffa8dda5e9d89e44ef83d81668f6
MD5 ab0178217432bfbea6dffe3681757228
BLAKE2b-256 24a776f12d7a8b3887de5a8e32307f986ae9eac22b63ac5f1518660b963c0eb6

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