跳到正文

devlog/token-math/avoiding-surprise-spend-from-runaway-agent-loops-708.md

终端里的代理还没停:2026 年防止循环烧钱的实战清单

终端里的代理还没停:2026 年防止循环烧钱的实战清单

我最警惕的不是一次昂贵的请求,而是终端里不断刷新的“再试一次”:测试失败,代理修改文件,测试仍然失败,然后重新读取整个仓库。去倒杯咖啡的时间,同一份上下文已经被发送多轮。2026 年,把代理接进日常开发流程之后,费用控制应该像超时和重试策略一样,成为默认配置,而不是月底看账单时才补上的功能。

先给每个任务一份可执行的预算

不要只在提示词里写“请节省令牌”。模型可以理解要求,却不应该负责执行财务边界。我会在启动脚本里设置任务金额上限、累计令牌上限、模型请求次数和最长运行时间;任何一项触线,就停止调度新请求,并保存当前补丁与失败原因。

  • 给单次修复设置独立预算,并让所有子代理共享同一个任务账本。
  • 每次请求前预留输入与最大输出的预计费用,避免并发请求同时穿透余额检查。
  • 预算不足时先暂停任务并要求人工确认,而不是自动充值或偷偷换用其他密钥。

本地估算只能作为保护线,最终仍要对账实际用量。取消请求也不代表费用立即归零:已经处理的令牌,以及尚未响应取消的请求,都可能继续产生费用。硬性金额封顶需要计费侧支持;没有这种保证时,就保留安全余量。

把“没有进展”变成明确的停止条件

代理循环往往不是无限运行,而是有限动作的无限重复。我的停止规则会检查进展:连续三轮出现相同测试错误、两轮没有产生有效文件变更,或者同一个工具以相同参数重复调用,就暂停并输出诊断。这里的次数只是起点,应按仓库和任务调整。

  • 为工具名称、规范化参数和关键结果生成指纹,识别换个措辞却重复执行的动作。
  • 分别记录网络故障与业务失败,只对适合重试的临时错误采用带抖动的退避。
  • 遇到权限不足、预算耗尽或确定性的参数错误时立即停止,不让代理反复碰壁。

控制读取范围,比反复压缩提示词更直接

修一个解析器,不需要每轮读取全部测试快照。先让代理定位相关文件,再限制单次工具输出、日志行数和搜索范围。测试失败时返回错误摘要及必要堆栈,把完整日志留在本地;上下文接近阈值时,保存结构化检查点,包含已改文件、已验证事实和下一步动作。

缓存也要进入预算。命中缓存不等于免费,写入缓存也可能产生费用;频繁变化的前缀还会降低复用效果。把稳定规则放在前面,把本轮日志和临时结果放在后面,并以实际返回的用量字段判断收益,不要仅凭响应变快就认定成本下降。

给模型升级和并行子代理设置闸门

可以先让 Claude Haiku 4.5 做文件分类或错误归纳,确实需要复杂推理时再交给 Claude Sonnet 5.5,但不要把“更小”直接等同于“总价更低”。便宜的一轮若导致十轮返工,未必划算。模型切换前重新估算剩余预算,并限制升级次数;并行调查也要限制同时运行数量,避免一个任务扇出成十份重复上下文。

统一 API 入口之后,费用账本仍要自己盯住

在 Fluxo 上,一个密钥和一个基础 URL:https://api.fluxorelay.com,就能接入 Claude、GPT、Gemini、DeepSeek、Kimi、GLM、Qwen、Grok 等系列;它可配合 Claude Code、Codex、Gemini CLI 和任何 OpenAI SDK 使用。入口统一方便切换,但不代表各客户端拥有相同的停止逻辑,仍需逐个验证超时、重试和取消行为。

Fluxo 按实际令牌计费,包含缓存读取与写入,没有月费。因此,账本至少要保留任务标识、模型、输入输出用量、缓存用量和实际费用,再按任务汇总,而不是只看单次调用。邀请他人后,对方付费可带来推荐分成,但这不应成为放宽任务预算的理由。如果你想把这些保护措施接到现有终端工作流里,可以创建一个 Fluxo 账户,从低预算任务开始验证。

合并代理脚本前,先演练一次失控

我会故意制造持续失败的测试、超长工具输出和重复超时,检查任务是否按预期停下,并确认重启后不会丢失累计预算。每天结束前,再查看费用最高的几个任务:哪一步开始重复,哪份上下文被多次搬运,哪个子代理没有贡献结果。真正可靠的代理不是永远继续尝试,而是在继续尝试不再值得时,能带着可恢复的现场停下来。

缓冲区里的下一篇

一分钟注册,赠送额度足够把文中提到的模型都试一遍。 注册 →