Subaybayan ang API spend bawat project at makakuha ng budget alerts sa Python
Ang isang maikling Python script ay ginagawang cost-per-project report ang iyong usage log at nagbababala sa 50, 75, 95 at 100% ng buwanang budget.

Sa pahinang ito
Magdagdag ng isang linya ng JSON sa isang file pagkatapos ng bawat API call, lagyan ito ng project name, at hayaan ang isang 30-linyang Python script na gawing cost-per-project report ang file na iyon at magbigay ng babala sa 50, 75, 95 at 100% ng iyong buwanang budget. Ito ang parehong view na ibinigay lang ng Anthropic sa Claude Enterprise teams, na binuo mula sa sarili mong log.
Sabihin nating isang balanse ang nagpapakain sa isang agent, isang blog-drafting script at isang maliit na support bot. Dumating ang katapusan ng buwan, mas mababa ang balanse kaysa inaasahan mo, at walang nagsasabi kung alin sa tatlo ang kumain nito. Iyon ang agwat na sinasara nito.
Ano ang inilabas ng Anthropic, at ano ang maaari mong kopyahin#
Ang anunsyo ng Anthropic (28 Oktubre 2026) ay sumasaklaw sa smart reports, in-app surveys at pooled group budgets, na karaniwang available lamang sa Claude Enterprise plans (source). Dalawang bahagi ang mahalaga dito. Ang isang report ay nagpapangkat ng trabaho ng isang team sa mga workstream at ipinapakita ang gastos ng bawat isa. Ang pooled budget ay isang shared na buwanang numero, at ang billing admins ay nakakatanggap ng email sa 50%, 75%, 95% at 100% nito. Idinagdag ng Anthropic na ang mga report ay para sa pagpaplano ng investment, hindi para sa paghusga sa indibidwal na tao.
Hindi mo kailangan ng enterprise plan para sa parehong hugis. Ang workstream ay isang label na pinipili mo lang, at ang apat na threshold ay isang listahan sa code. Ipangkat ayon sa project, hindi ayon sa tao, para sa dahilang binanggit ng Anthropic.
Mabilisang pagsusuri
Ang iyong prepaid balance ay humihinto na sa mga request sa zero. Bakit magdagdag ng mga babala sa 50% at 75%?
Ipakita ang sagot
Sagot: Dahil huli na ang zero: gusto mong mapansin ang isang runaway loop habang may pera pa para imbestigahan ito
Ang balanse ay isang hard stop, hindi isang alarm. Ang maagang thresholds ay ginagawang tanong sa ika-siyam na araw ang isang sorpresa sa 100%.
Ang log: isang linya bawat request#
Bawat chat completion response ay may dalang usage object na may prompt_tokens at completion_. Iyon lang ang kailangan ng report, kasama ang project label na ikaw mismo ang nagdadagdag. Ang wrapper na ito ay nagpapadala ng request at nagdadagdag ng isang linya sa isang buwanang file (nagbabago ang pangalan ng file bawat buwan, kaya ang bagong buwan ay nagsisimula sa zero):
import json, os, time
from openai import OpenAI
client = OpenAI(base_url="https://api.cheaptokens.dev/v1",
api_key=os.environ["CHEAPTOKENS_API_KEY"])
def ask(project, model, messages):
r = client.chat.completions.create(model=model, messages=messages)
with open(time.strftime("usage-%Y-%m.jsonl"), "a") as f:
f.write(json.dumps({"project": project, "model": model,
"prompt_tokens": r.usage.prompt_tokens,
"completion_tokens": r.usage.completion_tokens}) + "\n")
return r
ask("support-bot", "zai-org/GLM-5.3-Flash",
[{"role": "user", "content": "Where is my order?"}])Gamitin ang buong model id mula sa CheapTokens docs (deepseek-, zai-); ang mga maikling pangalan mula sa price tables ay hindi tinatanggap ng API. Ang key ay nagmumula sa isang environment variable, hindi kailanman mula sa file.

Ang script: gastos bawat project at mga alerto sa threshold#
I-save ito bilang report.py. Ang mga presyo ay placeholder: kopyahin ang mga kasalukuyan mula sa pricing table (parehong may isang halimbawang presyo ang dalawang modelo dito para lang maging madaling basahin ang aritmetika).
import json, os, sys, time
from collections import defaultdict
LOG = time.strftime("usage-%Y-%m.jsonl")
BUDGET = float(os.environ.get("BUDGET_USD", "10")) # example, substitute your own
STATE = LOG + ".alert"
LEVELS = [50, 75, 95, 100]
PRICES = { # USD per 1M tokens (input, output): example, substitute current prices
"deepseek-ai/DeepSeek-V4-Flash-0731": (1.0, 2.0),
"zai-org/GLM-5.3-Flash": (1.0, 2.0),
}
spend = defaultdict(float)
with open(LOG) as f:
for line in f:
r = json.loads(line)
p_in, p_out = PRICES[r["model"]]
spend[r["project"]] += (r["prompt_tokens"] * p_in
+ r["completion_tokens"] * p_out) / 1_000_000
total = sum(spend.values())
if total == 0:
sys.exit("log is empty")
for name, usd in sorted(spend.items(), key=lambda kv: -kv[1]):
print(f"{name:<8} ${usd:6.2f} {usd / total:5.0%}")
print(f"{'total':<8} ${total:6.2f} of ${BUDGET:.2f} ({total / BUDGET:.0%})")
last = int(open(STATE).read()) if os.path.exists(STATE) else 0
crossed = [l for l in LEVELS if total >= BUDGET * l / 100 and l > last]
if crossed:
print(f"WARNING: budget passed {crossed[-1]}%")
open(STATE, "w").write(str(crossed[-1]))Ang huling apat na linya ang bahaging nakakalimutan ng mga tao. Kung wala ang maliit na state file, sisigaw ang script ng "passed 50%" sa bawat run sa natitirang bahagi ng buwan. Sa pagkakaroon nito, isang beses lang magfi-fire ang bawat antas.
Patakbuhin ito at basahin ang resulta#
Kumuha ng toy log na may apat na linya (ang totoo ay may isang linya bawat request, kaya libu-libo):
{"project": "agent", "model": "deepseek-ai/DeepSeek-V4-Flash-0731", "prompt_tokens": 2400000, "completion_tokens": 300000}
{"project": "agent", "model": "deepseek-ai/DeepSeek-V4-Flash-0731", "prompt_tokens": 1000000, "completion_tokens": 100000}
{"project": "blog", "model": "zai-org/GLM-5.3-Flash", "prompt_tokens": 800000, "completion_tokens": 400000}
{"project": "bot", "model": "zai-org/GLM-5.3-Flash", "prompt_tokens": 500000, "completion_tokens": 100000}Sa mga halimbawang presyo at budget na 10, ang python report.py ay nagpi-print ng:
agent $ 4.20 65%
blog $ 1.60 25%
bot $ 0.70 11%
total $ 6.50 of $10.00 (65%)
WARNING: budget passed 50%Ang agent ay halos dalawang-katlo ng bill, at ang babala ay dumating sa 50%, hindi sa dulo. Patakbuhin muli at mananatiling tahimik ang babala hanggang umabot ang total sa 75%.

Para gumana ito bawat buwan, kailangan mo ng tatlong hakbang:
Hakbang-hakbang
I-wire ito sa tatlong hakbang
I-log ang bawat call
I-route ang lahat ng iyong call sa pamamagitan ng ask(project, model, messages) at pumili ng maikli at stable na project label. Ang pagpapalit ng pangalan ng label sa kalagitnaan ng buwan ay naghahati sa isang project sa dalawang row.
Itakda ang mga presyo at budget
Ilagay ang kasalukuyang presyo mula sa pricing table sa PRICES, at i-export ang iyong limit: export BUDGET_.
Patakbuhin ito sa isang schedule
Sapat na ang isang hourly cron line: 0 * * * * cd ~/. Ipadala ang output sa isang mail o chat command kung gusto mong itulak sa iyo ang babala.
Ano ang hitsura ng isang buwan sa mga murang modelo#
Nagiging kapaki-pakinabang ang mga numero kapag sila na ang iyong mga numero. Ipagpalagay na ang agent mula sa toy log ay may average na 30,000 input at 2,000 output tokens bawat hakbang, 20 hakbang bawat gawain, dalawang gawain bawat araw. Ang isang hakbang sa DeepSeek-V4-Flash ay nagkakahalaga ng $0.00065; sa GLM-5.3-Flash, $0.00068. Ang isang araw ay 40 hakbang, ang isang buwan ay 1,200. Ilipat ang mga slider para tumugma sa sarili mong agent:
Calculator ng gastos
Isang araw ng agent: mga hakbang bawat gawain times mga gawain bawat araw
Mga input token bawat kahilingan: 30,000 · Mga output token bawat kahilingan: 2,000 · Mga kahilingan bawat araw: 40
| Modelo | Bawat araw | Bawat buwan |
|---|---|---|
| GLM-5.3-Flash$0.02$0.04 | $0.0272 | $0.816 |
| DeepSeek-V4-Flash$0.015$0.10 | $0.026 | $0.78 |
| MiniMax-M2.7$0.05$0.15 | $0.072 | $2.16 |
At ang buwan sa 1,200 hakbang, na pinagsama ang input at output:
| Modelo | Input $/1M | Output $/1M | Bawat kahilingan | 1,200 mga kahilingan | OpenRouter, 1,200 mga kahilingan |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.00068 | $0.816 | $1.41 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.00065 | $0.78 | $2.86 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.0018 | $2.16 | $25.92 |
30,000 input at 2,000 output na token bawat kahilingan. Ang mga presyo kada 1M token ay kasalukuyan at nagbabago kasabay ng aming mga taripa; ang column ng OpenRouter ay nagpapakita ng reference na presyo para sa parehong workload.
Sa kabuuan, na pinagsama ang input at output, ang parehong modelo ay mas mura kaysa sa reference prices ng OpenRouter sa table na iyon, na may isang presyo sa anumang oras at walang peak surcharge. Pinapayagan din ng DeepSeek-V4-Flash ang hanggang 32,768 output tokens bawat sagot at isang 380K context; ang GLM-5.3-Flash ay may 390K context. Kapag ipinakita na ng report kung aling project ang mabigat, ang pagpapalit lamang ng model string ng project na iyon ay isang linyang pagbabago, at isang balanse ang sumasaklaw sa bawat modelo. Para sa kung gaano karaming token ang aktwal na ginagamit ng isang request, tingnan ang how many tokens an API request uses; para sa paghinto ng isang agent run sa kalagitnaan, tingnan ang tracking AI agent token cost. Ang mga presyo at modelo ay nasa CheapTokens models page.
Saan ito nagkakamali#
- May model na kulang sa
PRICES. Humihinto ang script na mayKeyErrorna nagpapangalan sa modelo. Idagdag ito; huwag i-default sa zero, o magmumukhang libre ang project. - Streaming calls. Ang huling chunk ay may dalang usage kung hihilingin mo (
stream_sa OpenAI SDK). Kung hindi, may mga puwang ang iyong log.options={"include_ usage": True} - Mga nabigong request. I-log lamang ang mga response na may
usageobject; ang request na nag-error ay walang mabibilang. - Per-person reports. Panatilihin ang label sa pangalan ng project o agent. Ang report tungkol sa mga tao ay nag-aanyaya ng maling konklusyon.



