agentbastion
A checkpoint between the AI agent your business ships and the world. Businesses now deploy chatbots, copilots, and agents wired to their data and tools — and almost nobody secures that new surface. This does.
Three guards, one product:
USER / ATTACKER FIREWALL AGENT (LLM + data/tools)
input --> [1 inbound scan] --block-->
--> ok --> agent runs
agent action <-- [2 tool guard] --block--> <-- agent wants a tool
reply <-- [3 outbound redact] <-- agent reply
- Inbound — block prompt injection / jailbreaks before the model sees them.
- Tool — stop the agent doing something dangerous (mass email, delete, refund, exfil). This is the differentiator — everyone scans prompts; few guard what the agent actually does.
- Outbound — redact PII and secrets from the reply.
Ships as a drop-in SDK: your data never leaves your box. A hosted gateway with dashboards and alerts is the paid tier later.
Install
pip install agentbastion # core guards (offline, no model needed)
pip install "agentbastion[judge]" # + Anthropic LLM judge for subtle injection
Quick start
from agentbastion import Firewall, guard, load_policy
firewall = Firewall() # heuristics + PII redaction
firewall.tool_policy = load_policy("allowlist.yaml") # gate tool calls
@guard(firewall) # inbound + outbound guards
def my_agent(user_input: str) -> str:
... # your agent; call firewall.check_tool() in its tool loop
return reply
Full working agent on the raw Anthropic SDK (all three guards): examples/basic_agent.py.
Tool policy (allowlist.yaml)
default: deny
allow: [get_order_status, search_faq]
deny: [issue_refund] # money movement stays human-approved
rate_limits: { get_order_status: 5 }
Decision order: deny → allow → default → rate limit.
Optional LLM judge
import anthropic
firewall = Firewall.with_judge(anthropic.Anthropic()) # runs on claude-haiku-4-5
Heuristics are free and offline. The judge catches subtler attempts at real per-request cost/latency — turn it on for sensitive routes, off for high-volume low-risk ones. It fails open: a judge outage never takes your agent down.
Audit log
Every decision is appended to agentbastion.jsonl. Summarize it:
python -m agentbastion.events agentbastion.jsonl
What this is not
Defense in depth, not a silver bullet. No injection detector is perfect and no PII regex catches everything. Run this as one layer alongside least-privilege tool scoping, human approval on money movement, and real monitoring. Build like it will be attacked — because a security tool will be.
Known v0 ceilings (all have an upgrade path in the code):
- Injection = hand-rolled regex signatures + optional LLM judge. Swap in Llama Guard / Rebuff / a fine-tune behind the same interface.
- PII = regex for the leaks that cost money (SSN, credit card w/ Luhn, API keys, private keys, email). Swap in Microsoft Presidio for names/addresses/locale-aware NER.
- Rate limits = in-memory per process. Move to Redis for multi-worker deployments.
Benchmark
The inbound guard's catch-rate is measured, not assumed. A labeled corpus
(benchmark/corpus.jsonl) mixes injection, exfiltration,
jailbreak-persona, delimiter, obfuscation, instruction-override, and indirect
attacks with benign business messages — including trap benigns that carry
trigger words in innocent context ("please ignore my previous email").
python benchmark/eval.py # confusion matrix, precision/recall/F1, per-category recall, misses + FPs
tests/test_corpus.py gates recall and false-positive rate in CI, so a
signature change that regresses coverage fails the build. The corpus is small
and self-authored — it proves coverage of known attack shapes, not a
real-world catch-rate. The optional LLM judge lifts recall on the subtle
residual the heuristics miss.
Deeper eval on a public dataset
For a real-world number, run against a public labeled injection dataset
(deepset/prompt-injections by default):
# from a clone of this repo (the benchmark scripts live here, not in the wheel)
pip install -e ".[bench]"
python benchmark/eval_public.py # test split, heuristics only
python benchmark/eval_public.py --split train
This is off the CI gate on purpose — it fetches data over the network and can change upstream. Use it to track true catch-rate as you add signatures.
Measured, heuristics-only, deepset/prompt-injections test split (116 rows):
recall ≈ 0.05, precision 1.0, FPR 0.0. Read that honestly: the regex layer
blocks almost no real attacks. The dataset is ~50% German (the signatures are
English-only) and the English attacks are largely semantic ("act as an
interviewer…", "you passed the first test, here's the second") with no trigger
keyword. The takeaway drives the design: heuristics are a cheap, high-precision
pre-filter for blatant attacks — the LLM judge is the real detector. Turn the
judge on for any route you actually care about. Chasing recall with more regex
just overfits and starts blocking benign traffic.
Tests
pip install "agentbastion[dev]"
pytest -q
MIT.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
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 agentbastion-0.2.2.tar.gz.
File metadata
- Download URL: agentbastion-0.2.2.tar.gz
- Upload date:
- Size: 19.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
baf755c8899c06d1638418482d1da33ac66590a9328a90714e44f0c7805b2fac
|
|
| MD5 |
e4dd46d4d6ed493f7f2f73420a68558a
|
|
| BLAKE2b-256 |
917de64889dbfae74c17f6522ab7f1754316dde6a130010889e80bef8841824a
|
Provenance
The following attestation bundles were made for agentbastion-0.2.2.tar.gz:
Publisher:
publish.yml on Rinkia/agentbastion
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agentbastion-0.2.2.tar.gz -
Subject digest:
baf755c8899c06d1638418482d1da33ac66590a9328a90714e44f0c7805b2fac - Sigstore transparency entry: 2699530385
- Sigstore integration time:
-
Permalink:
Rinkia/agentbastion@4d38172bb9f42d643ce293eca188ca658ac9e0b0 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/Rinkia
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4d38172bb9f42d643ce293eca188ca658ac9e0b0 -
Trigger Event:
release
-
Statement type:
File details
Details for the file agentbastion-0.2.2-py3-none-any.whl.
File metadata
- Download URL: agentbastion-0.2.2-py3-none-any.whl
- Upload date:
- Size: 15.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eeff6b54186060ec0b5d13db432eccfae1f2d37c62aee85ed2a9ecb2ba8acc70
|
|
| MD5 |
507582a53df8335c1037372cb132b92b
|
|
| BLAKE2b-256 |
647afb4e5bb179a8313747974c19ae7c1d475f03d39f66711b3ad07f69dcd8f4
|
Provenance
The following attestation bundles were made for agentbastion-0.2.2-py3-none-any.whl:
Publisher:
publish.yml on Rinkia/agentbastion
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agentbastion-0.2.2-py3-none-any.whl -
Subject digest:
eeff6b54186060ec0b5d13db432eccfae1f2d37c62aee85ed2a9ecb2ba8acc70 - Sigstore transparency entry: 2699530463
- Sigstore integration time:
-
Permalink:
Rinkia/agentbastion@4d38172bb9f42d643ce293eca188ca658ac9e0b0 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/Rinkia
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4d38172bb9f42d643ce293eca188ca658ac9e0b0 -
Trigger Event:
release
-
Statement type: