作者记录了一次 Agent 失控消费事件——60 秒内 21 次 API 调用烧掉 2800 美元,随即设计了一套交易级实时预算控制系统,在每笔请求前拦截而非事后报警。系统包含异步预算管道的工程实现细节。
上周二凌晨 3 点,我构建的一个 AI Agent 向一个高级 LLM 端点发送了 21 次 API 调用。每次调用费用 133 美元。在 60 秒内,2800 美元就这么消失了——而我正在睡觉。
预算预警邮件在早上 6 点 14 分到达。彼时,Agent 已经继续执行下一个任务了,浑然不知已经造成的损失。
这就是自主 AI Agent 的阴暗面。它们强大、快速、不知疲倦——它们可以在你醒来之前就耗尽你的预算。
在构建自己的解决方案之前,我尝试了所有方法:
API 速率限制触发得太晚了。当提供商的速率限制器启动时,21 次调用中的 18 次已经发出去了。速率限制的设计目的是保护提供商的基础设施,而不是保护你的钱包。
预算预警邮件在损失发生数小时后才到达。电子邮件本质上是异步的——用它来做实时成本控制是不对的。
手动监控无法扩展。我当时在 3 个项目中运行着 7 个 Agent。每小时检查一次仪表盘不是系统,而是一份工作。
根本问题在于:这些工具都不会在每次交易执行前对其进行评估。它们是被动的,而不是预防性的。
我围绕 5 种可组合的规则类型构建了 AgentShield(引擎支持 7 种,包括 2 种最常见的别名)。每条规则按优先级顺序对每笔交易进行评估。首次匹配生效。
阻止任何超过最大金额的单笔交易。
{
"type": "transaction_limit",
"params": {"max_amount": 500.00},
"action": "BLOCK"
}
这是防止失控支出的第一道防线。如果单次 API 调用费用超过 500 美元,它会在执行前被阻止。
追踪每个 Agent 每天的累计支出。当日总额超过上限时,所有后续交易都会被阻止。
{
"type": "daily_total",
"params": {"max_daily": 2000.00},
"action": "BLOCK"
}
这防止了积少成多的场景——单笔交易虽小,但累计支出却巨大的情况。
在滚动时间窗口内计算交易数量。如果 Agent 在短时间内发出过多调用,它会被标记。
{
"type": "velocity",
"params": {"window_minutes": 60, "max_count": 10},
"action": "FLAGGED"
}
速率限制可以捕捉到 60 秒内消耗 2800 美元的场景。你可以将它设置为 FLAG 而不是 BLOCK——让交易通过,但提醒你进行调查。
仅允许与已批准商户进行交易。其他所有交易都会被阻止。
{
"type": "merchant_allowlist",
"params": {"allowed": ["openai-api", "anthropic-api", "stripe-api"]},
"action": "BLOCK"
}
如果你的 Agent 只应该与 OpenAI 和 Anthropic 通信,任何对 unknown-proxy.com 的调用都会立即被阻止。
完全阻止特定类别的支出。
{
"type": "category_block",
"params": {"blocked": ["crypto_exchange", "adult_content", "gambling"]},
"action": "BLOCK"
}
规则按优先级顺序评估。数字越小优先级越高。首次匹配生效。这意味着你可以分层防御:
优先级 1:交易限额(每次最多 500 美元)
优先级 2:日累计限额(每天最多 2000 美元)
优先级 3:速率限制(每小时最多 10 次调用)
优先级 4:商户白名单(仅允许已批准的 API)
优先级 5:类别阻止(禁止加密/赌博)
如果一笔交易违反多条规则,优先级最高的规则先触发。这给你提供了可预测、可调试的行为。
为了证明引擎的有效性,我构建了一个包含 50 个场景的测试套件,覆盖真实世界的 Agent 行为:
边界情况正是引擎证明其正确性的地方:
金额恰好在限额上(500.00 美元 vs 500 限额)→ APPROVED(不是严格大于)
金额超出限额 0.01 美元(500.01 美元 vs 500 限额)→ BLOCKED
缺失金额字段 → FLAGGED(优雅降级)
空规则列表 → APPROVED(合法使用失败开放)
两条规则优先级相同 → 列表中前者获胜(确定性)
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ AI Agent │────▶│ AgentShield │────▶│ API Provider │
│ │ │ Engine │ │ (OpenAI etc) │
└──────────────┘ └──────┬───────┘ └──────────────┘
│
┌──────▼───────┐
│ Rule Store │
│ (SQLite WAL)│
└──────┬───────┘
│
┌──────▼───────┐
│ Dashboard │
│ (SSE feed) │
└──────────────┘
每笔交易在到达提供商之前都会流经引擎。引擎在 1 毫秒内根据账户的规则对其进行评估,记录决策,并通过 Server-Sent Events 将阻止/标记的事件广播到仪表板。
关键设计决策:
纯 Python 3.11 标准库——服务器上不需要 pip install。整个引擎、存储、认证和 API 都运行在标准库上。
SQLite WAL 模式——线程安全、零配置存储。多租户隔离在查询级别强制执行(每个查询都按 account_id 范围限定)。
Decimal 处理货币——绝不使用 float 进行货币运算。引擎全程使用 decimal.Decimal。
离线授权——HMAC-SHA256 签名的许可证密钥在本地验证。许可证检查不依赖服务器。
风险计算器 → — 30 秒内查看你的 Agent 支出风险画像。无需注册。
仪表板 → — 注册免费账户并配置你自己的规则。
核心引擎是开源的,运行在 Python 3.11 标准库上。无依赖。无框架。只有规则,快速评估。
AgentShield:AI Agent 支出的防火墙。构建它的原因是预算预警不应该通过电子邮件到达。