先说结论:半夜烧光你余额的,基本不是模型笨,是「重试」这个默认动作。据 OpenRouter 的教程与文档,四个开关调好,agent 自己循环烧钱这事就能拦住。我被它救过一次,所以这篇是经验,不是科普。

先说结论
四个开关,一层堵一个窟窿。前两层管它怎么判断「这是不是同一个动作」,第三层管一切意外,第四层管你自己忘了关。缺一层,就有一条路能绕过去。
我的判断是,这事的根子不在技术,在心态。你以为 AI 转完这一圈就会自己停,它根本不会,只会转到你余额不够为止。我见过太多人,模型一跑起来就撒手不管,跟把灶台点着火就出门一个样。
另一条判断更扎心:只开第一层,等于门锁上了钥匙还插在锁孔里。参数改一个空格,同一个循环就进出自如,白装一趟。这种假安全最坑人,它让你以为自己防住了,于是再也不看第二眼。
说白了,要么四层齐活,要么就当自己在赌。赌赢一次不算本事,赌输一次账单能教你做人,学费从来不便宜。

循环是怎么开始的
agent 调工具的时候,工具反复失败,或者返回得似是而非,模型就会一直重试。没有刹车,它就一直转到模型不再请求工具为止,账单跟着一圈一圈往上转。这种循环最阴的地方是它不报错,界面一切正常,只有后台在计费。
我脑补得出那画面:凌晨三点,你在群里刚说完「这个 agent 真稳」,那边一个循环已经跑了八个小时。手机弹窗一亮,你从床上坐起来的速度比闹钟还快。然后盯着那串数字,开始回忆自己到底哪一步没锁门。
说句公道话,真不是模型蠢。重试是它被训练出来的默认反应,跟人看到报错就下意识再点一次「重试」是一个道理。区别是它不困、不心疼钱、也不会手软。
我也交过这种智商税。所以现在听见谁夸 agent 稳,我第一句先问:你刹车装了吗。没装的,我劝他先把配置补齐,省下的是几十块的配置,赔进去的是几千块的额度。

四层防护分别管什么
第一层叫 doomLoop 检测,管的是「同样一招反复使」,按阶梯处理:observe@2 第二次相同调用开始观察,block@3 第三次直接拦,stop@6 第六次就结束这次运行。旁边还有文本重复检测,参数是 minRepeats,一样的车轱辘话来回说也算重复。这两个一起上,才勉强把「重复」这一大类堵住。
被停掉的运行会记下原因 doom_loop,没跑完的工具调用拿到一个干净的报错,会话能保下来接着跑,不至于整段白烧。他们实测:开了检测之后,一个 GPT-6 Luna 的运行在第四次连续重复时被止损,一共花了 0.0002 美元。就一丢丢钱,连早餐都买不起,但拦住的可能是你半个月的额度,这买卖怎么算都划算。
第二层 loopKey 管假差异。它先把参数归一化,忽略那些没意义的差异、把参数排序,然后再判重。不然它随手改个空格就换张脸过安检,你以为检测在干活,其实人家绕过去了——归一化这步看着琐碎,实际是把检测从「看着能用」变成「真能用」。
第三层 stopWhen 是兜底,同时设步数上限和成本上限,不管循环因为什么冒出来,到线就截断,不讲道理只看数字。第四层给 API key 设信用额度,超额直接返回 402,报错里写明限额来自 key 自身。这是整条链上唯一不依赖程序判断的一环,程序会看走眼,额度不会。
我踩过的坑
我当年就只开了第一层,活该交学费。检测能被一个参数空格糊弄过去,账单照翻不误。第二天我盯着那串数字,第一反应不是心疼,是这三个字:这也行。
一层只够堵一个洞,别指望它全能。这是我花真金白银换来的结论,也是我现在劝人别省这点配置的原因。省下的配置钱,回头都进了账单。
我还犯过一个错:拿额度当日常刹车。额度是先扣后补的兜底,靠它挡循环等于先失血再输血,钱早出去了,你只是晚一点知道。
所以建议很朴素:四层全开,阶梯照文档设,成本上限按「这一单我最多能亏多少」来写,别照月预算填整份,填十分之一就够。宁可误杀几个正经调用,也别让一个循环把你钱包掏空。再按单次任务给个硬上限,把 key 的总额度写小一点,留足余量。
最后一句
看完账单那一刻我就定了,这辈子都不赌 AI 会自己踩刹车。它连困都不困,凭什么替你省钱。
所以别把这篇当科普看,当成一个交过学费的倒霉蛋写的备忘单。四个开关配完用不了十分钟,配完你才敢把它挂到生产上。
反转是:真把这四个开关装上以后,我反倒敢把权限开得更大了。能让它放肆跑的,从来是底下那道兜得住的底。