Tối ưu chi phíHướng dẫn
Theo dõi chi tiêu API theo dự án và nhận cảnh báo ngân sách bằng Python
Một script Python ngắn biến log sử dụng của bạn thành báo cáo chi phí theo dự án và cảnh báo ở mức 50, 75, 95 và 100% ngân sách hàng tháng.

Trên trang này
Thêm một dòng JSON vào một tệp sau mỗi lần gọi API, gắn thẻ tên dự án cho nó, và để một script Python 30 dòng biến tệp đó thành báo cáo chi phí theo từng dự án cùng cảnh báo ở mức 50, 75, 95 và 100% ngân sách hàng tháng của bạn. Đây chính là góc nhìn mà Anthropic vừa cung cấp cho các nhóm Claude Enterprise, được dựng từ log của chính bạn.
Giả sử một số dư nuôi một agent, một script soạn thảo blog và một bot hỗ trợ nhỏ. Cuối tháng đến, số dư thấp hơn bạn mong đợi, và không có gì cho bạn biết cái nào trong ba cái đã gây ra chuyện đó. Đây là khoảng trống mà bài này lấp đầy.
Anthropic đã ra mắt gì, và bạn có thể sao chép gì#
Thông báo của Anthropic (28 tháng 10 năm 2026) bao gồm báo cáo thông minh, khảo sát trong ứng dụng và ngân sách nhóm dùng chung, chỉ khả dụng chung trên các gói Claude Enterprise (nguồn). Hai phần quan trọng ở đây. Một báo cáo nhóm công việc của một nhóm thành các workstream và hiển thị chi tiêu của từng workstream. Ngân sách dùng chung là một con số hàng tháng chia sẻ, và quản trị viên thanh toán nhận email ở mức 50%, 75%, 95% và 100% của nó. Anthropic nói thêm rằng các báo cáo dùng để lập kế hoạch đầu tư, không phải để đánh giá từng cá nhân.
Bạn không cần gói enterprise để có cùng hình dạng đó. Một workstream chỉ là một nhãn bạn tự chọn, và bốn ngưỡng là một danh sách trong code. Hãy nhóm theo dự án, không theo người, vì lý do Anthropic đưa ra.
Kiểm tra nhanh
Số dư trả trước của bạn đã chặn yêu cầu ở mức không. Tại sao thêm cảnh báo ở 50% và 75%?
Hiện đáp án
Trả lời: Vì không là quá muộn: bạn muốn nhận ra một vòng lặp chạy hoang khi vẫn còn tiền để điều tra
Số dư là điểm dừng cứng, không phải chuông báo. Các ngưỡng sớm biến một bất ngờ ở 100% thành một câu hỏi vào ngày thứ chín.
Log: một dòng mỗi yêu cầu#
Mỗi phản hồi chat completion đều mang một đối tượng usage với prompt_tokens và completion_. Đó là tất cả những gì báo cáo cần, cộng thêm một nhãn dự án bạn tự thêm. Wrapper này gửi yêu cầu và nối thêm một dòng vào tệp hàng tháng (tên tệp thay đổi mỗi tháng, nên tháng mới bắt đầu từ không):
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?"}])Dùng id model đầy đủ từ tài liệu CheapTokens (deepseek-, zai-); các tên ngắn từ bảng giá không được API chấp nhận. Key lấy từ biến môi trường, không bao giờ từ tệp.

Script: chi phí theo dự án và cảnh báo ngưỡng#
Lưu cái này thành report.py. Giá là chỗ giữ chỗ: hãy sao chép giá hiện tại từ bảng giá (cả hai model dùng chung một giá ví dụ ở đây chỉ để giữ phép tính dễ đọc).
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]))Bốn dòng cuối là phần người ta hay quên. Không có tệp trạng thái nhỏ, script sẽ hét "đã vượt 50%" mỗi lần chạy trong suốt phần còn lại của tháng. Có nó, mỗi mức chỉ kích hoạt một lần.
Chạy nó và đọc kết quả#
Lấy một log đồ chơi bốn dòng (log thật có một dòng mỗi yêu cầu, tức hàng nghìn):
{"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}Với giá ví dụ và ngân sách 10, python report.py in ra:
agent $ 4.20 65%
blog $ 1.60 25%
bot $ 0.70 11%
total $ 6.50 of $10.00 (65%)
WARNING: budget passed 50%Agent chiếm gần hai phần ba hóa đơn, và cảnh báo đến ở 50%, không phải ở cuối. Chạy lại và cảnh báo im lặng cho đến khi tổng đạt 75%.

Để việc này chạy hàng tháng, bạn cần ba bước:
Từng bước một
Nối nó lại trong ba bước
Ghi log mọi lần gọi
Định tuyến mọi lần gọi qua ask(project, model, messages) và chọn một nhãn dự án ngắn, ổn định. Đổi tên nhãn giữa tháng sẽ tách một dự án thành hai dòng.
Đặt giá và ngân sách
Đưa giá hiện tại từ bảng giá vào PRICES, và export giới hạn của bạn: export BUDGET_.
Chạy theo lịch
Một dòng cron hàng giờ là đủ: 0 * * * * cd ~/. Gửi đầu ra đến lệnh mail hoặc chat nếu bạn muốn cảnh báo được đẩy đến bạn.
Một tháng trông thế nào trên các model rẻ#
Số liệu trở nên hữu ích khi chúng là số của bạn. Giả sử agent từ log đồ chơi trung bình 30.000 token đầu vào và 2.000 token đầu ra mỗi bước, 20 bước mỗi tác vụ, hai tác vụ mỗi ngày. Một bước trên DeepSeek-V4-Flash tốn $0.00065; trên GLM-5.3-Flash, $0.00068. Một ngày là 40 bước, một tháng là 1.200. Kéo các thanh trượt cho khớp với agent của chính bạn:
Máy tính chi phí
Một ngày của agent: số bước mỗi tác vụ nhân số tác vụ mỗi ngày
Token đầu vào mỗi yêu cầu: 30.000 · Token đầu ra mỗi yêu cầu: 2.000 · Số yêu cầu mỗi ngày: 40
| Mô hình | Mỗi ngày | Mỗi tháng |
|---|---|---|
| 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 |
Và cả tháng ở 1.200 bước, tính gộp đầu vào và đầu ra:
| Mô hình | Đầu vào $/1M | Đầu ra $/1M | Mỗi yêu cầu | 1.200 yêu cầu | OpenRouter, 1.200 yêu cầu |
|---|---|---|---|---|---|
| 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 token đầu vào và 2.000 token đầu ra mỗi yêu cầu. Giá trên 1 triệu token là giá hiện hành và thay đổi cùng với biểu phí của chúng tôi; cột OpenRouter hiển thị giá tham chiếu cho cùng khối lượng công việc.
Tổng cộng, tính gộp đầu vào và đầu ra, cả hai model đều rẻ hơn giá tham chiếu của OpenRouter trong bảng đó, với một mức giá ở mọi giờ và không phụ thu phí giờ cao điểm. DeepSeek-V4-Flash cũng cho phép tối đa 32.768 token đầu ra mỗi câu trả lời và ngữ cảnh 380K; GLM-5.3-Flash có ngữ cảnh 390K. Khi báo cáo cho thấy dự án nào là dự án nặng, việc đổi chuỗi model chỉ của dự án đó là thay đổi một dòng, và một số dư bao trùm mọi model. Về số token một yêu cầu thực sự dùng, xem một yêu cầu API dùng bao nhiêu token; về dừng một lần chạy agent giữa chừng, xem theo dõi chi phí token của AI agent. Giá và model có trên trang model của CheapTokens.
Chỗ này sai ở đâu#
- Một model thiếu trong
PRICES. Script dừng với mộtKeyErrornêu tên model. Hãy thêm nó; đừng mặc định về không, nếu không dự án trông như miễn phí. - Lệnh gọi streaming. Chunk cuối chỉ mang usage nếu bạn yêu cầu (
stream_trong OpenAI SDK). Nếu không, log của bạn có lỗ hổng.options={"include_ usage": True} - Yêu cầu thất bại. Chỉ ghi log những phản hồi có đối tượng
usage; một yêu cầu bị lỗi không có gì để đếm. - Báo cáo theo người. Giữ nhãn là tên dự án hoặc agent. Một báo cáo về con người mời gọi những kết luận sai.



