cascade
Guard LLM tool calls with rules, scoring, and audit trails.
cascade is a lightweight governance layer for AI agent tool calls. It sits
between your LLM and tool execution — evaluate every tool call against rules,
rank survivors by strategy, and audit every decision.
Quick Start
from cascade import DecisionPipeline
pipe = DecisionPipeline()
result = pipe.guard(
tool_calls=[
{"id": "1", "name": "search", "confidence": 0.92},
{"id": "2", "name": "delete", "confidence": 0.15},
],
rules=[
{"field": "confidence", "op": "gte", "value": 0.5},
{"field": "name", "op": "nin", "value": ["delete"]},
],
strategy="softmax",
top_k=1,
)
if result["selected"]:
safe = result["selected"][0]
print(f"Safe: {safe['name']} ({safe['confidence']})")
Installation
pip install cascade
Zero external dependencies. Optional extras extend the feature set:
pip install cascade[openai] # OpenAI SDK adapter
pip install cascade[anthropic] # Anthropic SDK adapter
pip install cascade[langchain] # LangChain adapter
pip install cascade[crewai] # CrewAI adapter
pip install cascade[gemini] # Gemini SDK adapter
pip install cascade[autogen] # AutoGen adapter
pip install cascade[yaml] # YAML policy files + cascade policy lint
Adapters
Framework-specific adapters let you plug cascade governance into your existing agent code with minimal changes. Each adapter is a thin (<80 lines) layer — zero impact on the core codebase.
# OpenAI — auto-govern every chat.completions.create
from openai import OpenAI
from cascade import DecisionPipeline
from cascade.adapters.openai import wrap_openai_client
client = wrap_openai_client(
OpenAI(),
pipeline=DecisionPipeline(),
rules=[{"field": "name", "op": "nin", "value": ["delete_file", "exec"]}],
)
# LangChain — post-process agent output
from cascade.adapters.langchain import guard_agent_output
result = agent.invoke({"input": "search for papers on AI safety"})
result = guard_agent_output(result, pipeline=pipe, rules=[...])
Why cascade?
- Zero dependencies — pure Python, no pip wars
- Plugs into any LLM framework — OpenAI, LangChain, or custom
- Audit built in — every
guard()auto-writes JSONL audit trails - 5 selection strategies — softmax / linear / uniform / threshold / ucb1
- Self-emergence — C₃↔C₄ closed loop learns from outcomes
- Composite rules —
all_of/any_of/not_for complex policies - Actions —
block/redirect/transformfor automated remediation
Policies
Define governance rules in YAML for repeatable, audit-friendly policies.
# policy.yaml
name: strict-tools
description: Block dangerous tools
rules:
- field: name
op: nin
value: [delete_file, exec, rm]
- field: confidence
op: gte
value: 0.7
- all_of:
- field: name
op: eq
value: code_interpreter
- field: confidence
op: gte
value: 0.9
strategy: softmax
top_k: 1
cascade policy lint policy.yaml
cascade check --tool-calls @tools.json --policy policy.yaml
Composite rules (all_of / any_of / not_), @import directives, and
full schema validation are supported.
Audit chain integrity
Every guard() decision is recorded in a SHA-256 hash-chained JSONL audit
trail. Each entry links to its predecessor via prev_hash, making the log
tamper-evident.
cascade audit verify
from cascade._audit import AuditTrail
trail = AuditTrail()
result = trail.verify() # {'valid': True, 'entries': 42, ...}
C1–C4 Architecture
C1 (Gate) : Rule engine — 11 operators + AND/OR/NOT composition
C2 (Trigger) : Event triggers — condition callbacks + state machine
C3 (Selector) : Selection pressure — uniform/linear/softmax/threshold ranking
C4 (Feedback) : Feedback loop — binary/proportional/threshold reward
Linkage : C₃↔C₄ closed loop — rewards adjust future selection
Docs
| File | What it covers |
|---|---|
| docs/usage.md | guard() API, DecisionPipeline, AuditTrail |
| docs/rules.md | Leaf rules, rule presets, composite rules (all_of/any_of/not_) |
| docs/strategies.md | Selection strategies and when to use each |
| docs/cli.md | cascade check / policy lint / audit verify CLI reference |
| docs/owasp.md | OWASP Agentic Top 10 compliance mapping |
| CHANGELOG.md | Version history |
Integrations
| Framework | Adapter | Lines | Install |
|---|---|---|---|
| OpenAI SDK | wrap_openai_client() / guard_openai_response() |
~70 | cascade[openai] |
| Anthropic SDK | guard_anthropic_response() / wrap_anthropic_client() |
~70 | cascade[anthropic] |
| LangChain | guard_agent_output() |
~55 | cascade[langchain] |
| CrewAI | guard_crew_output() / wrap_crew() |
~65 | cascade[crewai] |
| Gemini SDK | guard_gemini_response() / wrap_genai_client() |
~80 | cascade[gemini] |
| AutoGen | guard_agent_reply() / wrap_agent() |
~120 | cascade[autogen] |
| MCP Server | guarded_tool() / MCPServerGuard |
~100 | zero-dep (core) |
Each adapter is opt-in — the core stays zero-dependency. All adapters
live in src/cascade/adapters/ and import only what they need at runtime.
For custom framework integrations, use pipe.guard() directly:
response = client.chat.completions.create(..., tools=my_tools)
result = pipe.guard(
tool_calls=[{"id": t.id, "name": t.function.name, ...}],
rules=[{"field": "name", "op": "nin", "value": BLOCKED_TOOLS}],
)
Release files for agent-armour 0.8.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agent_armour-0.8.0.tar.gz | 53.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agent_armour-0.8.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size:102.3 kB
Release files / agent_armour-0.8.0.tar.gz
| Download URL | agent_armour-0.8.0.tar.gz |
|---|---|
| Size | 53.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
15bd288848ac17c54b4df70b75067720dc98bccfa66158f27326dac20b370007
|
|
BLAKE2b-256 checksum How to use checksums |
455b5dd8d014ae5ccb5a3a8d544c3ce1da1a044c9109091428a550d8229ee7ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Release files / agent_armour-0.8.0-py3-none-any.whl
| Download URL | agent_armour-0.8.0-py3-none-any.whl |
|---|---|
| Size | 49.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
09a001e513924d709a502b99f12c8a55acfcf7940f68b9c08d63b6cc80bbddbe
|
|
BLAKE2b-256 checksum How to use checksums |
e4a06582cda2eb7e57eb62595ea0ca4a809e9a756e20a47a0bd78c032bd58309
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|