跳到正文

devlog/token-math/budget-alerts-and-habits-that-keep-api-spend-predictable-66.md

预算告警与日常习惯:把 API 开销控制在预期内

先给 API 开销划出两条预算线

写代码时,最容易忽略的不是单次请求价格,而是后台代理持续执行、失败重试,以及越来越长的上下文。我更愿意每天花一分钟看账,而不是月底猜测钱花在哪里。下面做一个本地预算检查器:每天录入当天累计费用,到达阈值就让终端明确报警。

Fluxo 用一个密钥和一个基础地址 https://api.fluxorelay.com 接入多家模型,兼容 Claude Code、Codex、Gemini CLI 和 OpenAI SDK。调用入口统一以后,也要给不同工具保留清晰的用量记录,否则一个总金额很难解释。

先执行以下命令。这里把月预算设为 300、日预算设为 15,金额单位始终与账单一致;这些数字只是预算示例,不是模型报价。

mkdir -p "$HOME/.config/fluxo-budget"

export BUDGET_MONTH=300 BUDGET_DAY=15 — 这两个环境变量只对当前终端及其子进程生效。换终端或配置定时任务时,需要重新设置。日预算也不必简单等于月预算除以天数:集中开发和周末停工,可以有不同节奏。

用当天累计费用生成终端告警

下面的命令只使用 Python 标准库。把末尾的 9.40 替换成账单中当天已经产生的累计费用。重复执行会覆盖当天记录,避免把同一笔费用重复相加。

python3 -c 'import datetime,json,os,pathlib,sys; from decimal import Decimal as D; amount=D(sys.argv[1]); assert amount.is_finite() and amount>=0, "费用必须是非负有限数"; p=pathlib.Path.home()/".config/fluxo-budget/daily.json"; data=json.loads(p.read_text()) if p.exists() else {}; today=datetime.date.today().isoformat(); data[today]=str(amount); p.write_text(json.dumps(data,indent=2)); month=sum((D(v) for k,v in data.items() if k.startswith(today[:7])),D("0")); daily_limit=D(os.environ["BUDGET_DAY"]); monthly_limit=D(os.environ["BUDGET_MONTH"]); assert daily_limit>0 and monthly_limit>0, "预算必须大于零"; stop=amount>=daily_limit or month>=monthly_limit; warn=amount>=daily_limit*D("0.8") or month>=monthly_limit*D("0.8"); print("超出预算" if stop else "预算预警" if warn else "预算正常"); print("今日累计:",amount,"本月已录入:",month); sys.exit(2 if stop else 1 if warn else 0)' 9.40

达到任一预算的 80% 时,命令返回状态码 1;达到预算时返回 2;否则返回 0。运行后紧接着执行下面这条命令,可以查看状态码。

echo $?

这是本地提醒,不会自动停止 API 请求。月累计只包含已经录入的日期;第一次使用时,必须补齐本月记录,才能把它当作月预算依据。

补齐历史记录,统一账单日期

补录时可以执行下面的命令,替换日期与当天累计费用。每个日期只保留一个最终金额;跨月后,检查器会按当前月份自动汇总。

python3 -c 'import datetime,json,pathlib,sys; from decimal import Decimal as D; day=datetime.date.fromisoformat(sys.argv[1]).isoformat(); amount=D(sys.argv[2]); assert amount.is_finite() and amount>=0; p=pathlib.Path.home()/".config/fluxo-budget/daily.json"; data=json.loads(p.read_text()) if p.exists() else {}; data[day]=str(amount); p.write_text(json.dumps(data,indent=2))' 2026-01-01 8.20

脚本按电脑本地日期记账。如果账单采用其他时区,就在双方日期一致的时间录入,或者调整脚本日期规则。账单存在延迟时,次日再校正前一天金额。没有录入的数据,检查器无法替你发现。

把模型选择和任务规模一起记录

我会先用 DeepSeek V4 Flash 处理范围明确的小修改,再用 Claude Sonnet 5.5 对照验证复杂任务。这里不预设谁一定更省:完成一次有效修改的总费用,比单次请求便宜更有意义。

  • 每次长任务开始之前,先写下目标文件、验收命令和停止条件,减少代理反复探索。
  • 遇到连续失败的工具调用时,先检查报错与权限,再决定是否允许下一轮重试。
  • 比较两个模型的成本时,同时记录完成质量、请求次数和实际扣费,避免只比较输出长度。

把缓存读写也纳入每日检查

Fluxo 没有月费,按实际 Token 用量计费,缓存读取和写入也计入其中。因此,看到缓存命中并不等于这次调用免费。查看费用明细时,要把普通输入、输出、缓存读取和缓存写入一起核对。

  • 整理上下文时,优先保留当前任务需要的文件和错误信息,避免每轮都附上整个仓库。
  • 复用稳定的任务说明时,保持公共前缀一致,并通过实际用量确认缓存是否带来收益。
  • 执行批量任务之前,先跑一个小样本,再按实际费用估算整批任务所需的预算。

让每日收工检查成为固定动作

收工前更新当天金额,检查是否触发预警,再决定明天继续哪些任务。达到预算后,先暂停自己启动的后台代理,检查未完成请求和自动重试;关闭终端不一定代表后台工作已经结束。

如果想把这套习惯用在统一的模型入口上,可以创建一个 Fluxo 账户,从一个小任务开始记录真实费用。

邀请他人付费产生的推荐分成,单独记录为收入,不要提前抵扣调用预算。预算是否可持续,仍然用实际消耗判断。坚持几天之后,你就能从“今天好像调用很多”,变成明确知道哪类任务值得继续投入。

缓冲区里的下一篇

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