8.0
热点
AI SCORE
编程提效2026-10-08 11:38
10 行 Python 守卫防止 AI Agent 耗尽预算
dev.to · AI#Python#AI Agent#成本控制
Editor brief · 编辑速览
通过一个只依赖标准库的守卫函数,在每次 API 调用前检查累计消费,若本次调用会导致超预算则主动抛出异常并附带详细消费报告,防止失控重试耗尽月度额度。
我运行着一小群自主 AI 智能体——它们写代码、发内容、在模拟市场上交易、交付小产品。整个操作靠预算运行:每月总共 25 美元的 LLM API 额度。
上周一个智能体遇到了一个 bug:重试循环没有上限。如果让它继续跑下去,不到一小时就会把这 25 美元的额度全部耗尽——一次糟糕的响应,反复重试,每次重试都要花掉几美分。
但没有发生这种情况,因为这个智能体集群中的每次调用都先经过一个 10 行的守卫函数。以下是完整代码,纯标准库,无任何依赖:
import time, json, os
BUDGET_USD = 25.0
STATE_FILE = "budget_state.json"
def _load():
if os.path.exists(STATE_FILE):
with open(STATE_FILE) as f:
return json.load(f)
return {"spent": 0.0, "calls": 0}
def _save(state):
with open(STATE_FILE, "w") as f:
json.dump(state, f)
def guarded_call(cost_estimate, fn, *args, **kwargs):
state = _load()
if state["spent"] + cost_estimate > BUDGET_USD:
raise RuntimeError(
f"Budget guard: ${state['spent']:.2f} already spent, "
f"next call (${cost_estimate:.3f}) would exceed the ${BUDGET_USD} cap. Stopping."
)
result = fn(*args, **kwargs)
state["spent"] += cost_estimate
state["calls"] += 1
_save(state)
return result
就这样。不要直接调用 LLM/API 客户端,而是用守卫函数包裹调用:
response = guarded_call(0.012, call_llm, prompt="summarize this")
如果运行中的累计花费即将超过上限,它会在网络请求发生之前就抛出异常——而不是等你收到账单之后。没有静默的失控循环,没有凌晨三点 Slack 上那条 400 美元账单告警。
如果你要真正上线这个方案,我建议再加两个功能:
循环断路器——统计同一次运行中的连续调用次数,即使预算还没用完,在达到 N 次后也主动退出(一个卡住的循环可以快速轰炸,依然会超过你设定的速率上限)。
每日重置——按滚动 24 小时窗口重置已消费金额,而不是让它无限累积,这样糟糕的一天不会堵住第二天正经的工作。
我们把完整版本(预算上限 + 循环断路器 + 运行日志)打包成了免费、纯标准库的实现,如果你不想自己写可以直接用:https://renevibe76.gumroad.com/l/kwgtni
有没有一个失控的智能体或脚本曾经用 API 账单让你大吃一惊——或者类似这样的守卫机制及时拦住了它?你的停止条件是什么?