Catalog PyPI
PACKAGE EXPLORERView in registry

actiongate

PyPI

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

agent-frameworkai-agentsllmrate-limitingthrottling
Versions collected1
Direct dependencies5From release 0.3.0
Last observed20 Oct, 18:32 UTC

README

Version 0.3.0 documentation

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.

Storep50p95p99Throughput
MemoryStore~2μs~3μs~5μs~400k ops/s
RedisStore (localhost)~200μs~300μs~500μs~4k ops/s

API Reference

TypePurpose
EngineCore gating logic
GateAction identity tuple
PolicyRate limit configuration
DecisionEvaluation result with full context
Result[T]Wrapper for guard_result
BlockedException from guard
MemoryStoreSingle-process backend
RedisStoreDistributed backend
EnumValues
ModeHARD, SOFT
StoreErrorModeFAIL_CLOSED, FAIL_OPEN
StatusALLOW, BLOCK
BlockReasonRATE_LIMIT, COOLDOWN, STORE_ERROR

License

Apache License 2.0. See LICENSE for the full text.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.3.017 Mar 20265

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
actiongate-oss/actiongate

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 18:32 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:1e9e4d991088e6a66ec51d2d5d9df920e07083c5d88202fbacbff7c996ee9ee4