🛡️ AgentLoopGuard
Detect and kill infinite AI agent loops before they burn your API budget.
The Problem
AI agents get stuck in loops. Your agent calls the same tool 50 times. Or it generates nearly identical outputs over and over. Or it oscillates between two states forever.
Meanwhile, your API bill climbs: $0.12... $1.50... $15.00... $47.00... $412.00.
You wake up to a surprise bill because your agent ran all night doing nothing useful.
The Solution
from agentloopguard import LoopGuard
guard = LoopGuard(
max_iterations=50,
max_cost_usd=10.00,
max_duration_seconds=300,
)
with guard.session() as session:
for step in my_agent.run():
session.record({
"tool_name": step.tool,
"tool_args": step.args,
"output": step.result,
"model": "gpt-4o",
"input_tokens": step.input_tokens,
"output_tokens": step.output_tokens,
})
# LoopGuard watches every call.
# Loops die. Your budget lives.
Installation
pip install agentloopguard
Four Detection Engines
| Engine | What It Catches | Default Threshold |
|---|---|---|
| Exact Repeat | Same tool call repeated consecutively | 3 repeats |
| Semantic Similarity | Near-identical outputs (TF-IDF cosine sim) | 92% similarity, 3 calls |
| Cost Velocity | Spending money too fast | $2/minute |
| Oscillation | A→B→A→B going nowhere | 3 cycles |
All four run automatically on every session.record() call. Zero configuration needed.
Usage
As a Context Manager
from agentloopguard import LoopGuard
guard = LoopGuard(max_iterations=100, max_cost_usd=5.00)
with guard.session() as session:
for i in range(200): # Will be killed at iteration 100
session.record({
"tool_name": "search",
"tool_args": {"query": "same thing"},
"output": "same result",
"model": "gpt-4o",
"input_tokens": 100,
"output_tokens": 50,
})
As a Decorator
from agentloopguard import LoopGuard
guard = LoopGuard(max_cost_usd=10.00)
@guard.watch
def run_agent(prompt: str) -> str:
# Your agent logic here
...
Custom Alert Handling
def my_alert_handler(detection_result):
send_slack_notification(f"Loop detected: {detection_result.description}")
guard = LoopGuard(
max_iterations=50,
on_alert="callback",
alert_callback=my_alert_handler,
)
Budget Tracking Only
from agentloopguard import BudgetTracker
tracker = BudgetTracker(max_cost_usd=20.00, max_tokens=1_000_000)
tracker.record(model="gpt-4o", input_tokens=500, output_tokens=200)
print(tracker.summary())
# {'total_cost_usd': 0.0055, 'total_tokens': 700, 'iterations': 1, ...}
Supported Models
Built-in pricing for:
- OpenAI: gpt-4o, gpt-4o-mini, gpt-4-turbo, gpt-3.5-turbo
- Anthropic: claude-3.5-sonnet, claude-3-haiku, claude-3-opus
- Google: gemini-1.5-pro, gemini-1.5-flash, gemini-2.0-flash
Configuration
| Parameter | Type | Default | Description |
|---|---|---|---|
max_iterations |
int |
None |
Maximum number of agent steps |
max_cost_usd |
float |
None |
Maximum total cost in USD |
max_tokens |
int |
None |
Maximum total tokens (input + output) |
max_duration_seconds |
float |
None |
Maximum wall-clock time |
on_alert |
str |
"raise" |
Action on detection: "raise", "log", "callback" |
alert_callback |
callable |
None |
Custom function called on detection |
detectors |
list |
all four | Which detection engines to use |
Performance
- <1ms overhead per
record()call - Zero external dependencies — stdlib only
- Thread-safe — works in async and multi-threaded agents
- No network calls — everything runs locally
License
MIT — free forever. Use it in production. Use it in your startup. Use it everywhere.
Links
Built by developers who got a $400 surprise API bill.
Metadata
Release files for agentloopguard-sdk 0.1.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 | |
|---|---|---|---|
| agentloopguard_sdk-0.1.0.tar.gz | 9.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agentloopguard_sdk-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 20.1 kB
Release files / agentloopguard_sdk-0.1.0.tar.gz
| Download URL | agentloopguard_sdk-0.1.0.tar.gz |
|---|---|
| Size | 9.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9211d2b86aec50830afc180da86397846055466f127c0955cc9f3e1e789aaab1
|
|
BLAKE2b-256 checksum How to use checksums |
b8fd03299bd869c04db944ed14baa81db7831f69736880c5668f8348966bb24c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.7
|
Release files / agentloopguard_sdk-0.1.0-py3-none-any.whl
| Download URL | agentloopguard_sdk-0.1.0-py3-none-any.whl |
|---|---|
| Size | 11.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7a3228e0934ae55ccccd0157e8825c94f25464114524458fcb909800bc297521
|
|
BLAKE2b-256 checksum How to use checksums |
284da8c328b196c849e5a776ed7448fddb4b8ce1f6f9a65006214af61fee02b2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.7
|