ব্লগে ফিরে যান

খরচ অপ্টিমাইজেশনগাইড

Python-এ প্রতি প্রজেক্টে API খরচ ট্র্যাক করুন এবং বাজেট সতর্কবার্তা পান

একটি সংক্ষিপ্ত Python স্ক্রিপ্ট আপনার ব্যবহার লগকে প্রতি-প্রজেক্ট খরচের রিপোর্টে পরিণত করে এবং মাসিক বাজেটের ৫০, ৭৫, ৯৫ ও ১০০%-এ সতর্ক করে।

CheapTokens Team দ্বারাপ্রকাশিত হয়েছে 10 মিনিট পড়ার সময়

প্রতি-প্রজেক্ট খরচ রিপোর্ট এবং বাজেট সতর্কবার্তা সহ টার্মিনাল
এই পৃষ্ঠায়
  1. Anthropic যা শিপ করেছে, এবং আপনি যা কপি করতে পারেন
  2. লগ: প্রতি অনুরোধে একটি লাইন
  3. স্ক্রিপ্ট: প্রতি প্রজেক্ট খরচ এবং থ্রেশহোল্ড সতর্কবার্তা
  4. এটি চালান এবং ফলাফল পড়ুন
  5. সস্তা মডেলে একটি মাস কেমন দেখায়
  6. এটি কোথায় ভুল হয়

প্রতিটি API কলের পরে ফাইলে একটি JSON লাইন যোগ করুন, এতে একটি প্রজেক্টের নাম ট্যাগ করুন, এবং একটি ৩০ লাইনের Python স্ক্রিপ্ট দিয়ে সেই ফাইলটিকে প্রতি-প্রজেক্ট খরচের রিপোর্ট এবং আপনার মাসিক বাজেটের ৫০, ৭৫, ৯৫ ও ১০০%-এ সতর্কবার্তায় রূপান্তর করুন। এটি ঠিক সেই ভিউ যা Anthropic সম্প্রতি Claude Enterprise টিমকে দিয়েছে, তবে আপনার নিজের লগ থেকে তৈরি।

ধরুন একটি ব্যালেন্স একটি এজেন্ট, একটি ব্লগ-ড্রাফটিং স্ক্রিপ্ট এবং একটি ছোট সাপোর্ট বটকে ফিড করে। মাস শেষে ব্যালেন্স আপনার প্রত্যাশার চেয়ে কম, এবং তিনটির মধ্যে কোনটি এটি করেছে তা কিছুই বলে না। এই গ্যাপটাই এখানে বন্ধ করা হচ্ছে।

Anthropic যা শিপ করেছে, এবং আপনি যা কপি করতে পারেন#

Anthropic-এর ঘোষণা (২৮ অক্টোবর ২০২৬) স্মার্ট রিপোর্ট, ইন-অ্যাপ সার্ভে এবং পুলড গ্রুপ বাজেট কভার করে, যা সাধারণত শুধুমাত্র Claude Enterprise প্ল্যানে পাওয়া যায় (source)। এখানে দুটি অংশ গুরুত্বপূর্ণ। একটি রিপোর্ট একটি টিমের কাজকে ওয়ার্কস্ট্রিমে গ্রুপ করে এবং প্রতিটির খরচ দেখায়। একটি পুলড বাজেট হল একটি শেয়ার্ড মাসিক সংখ্যা, এবং বিলিং অ্যাডমিনরা এর ৫০%, ৭৫%, ৯৫% এবং ১০০%-এ একটি ইমেল পান। Anthropic যোগ করে যে রিপোর্টগুলি বিনিয়োগ পরিকল্পনার জন্য, ব্যক্তিগত মানুষদের বিচার করার জন্য নয়।

একই আকৃতির জন্য আপনার এন্টারপ্রাইজ প্ল্যানের প্রয়োজন নেই। একটি ওয়ার্কস্ট্রিম শুধু একটি লেবেল যা আপনি বেছে নেন, এবং চারটি থ্রেশহোল্ড কোডে একটি তালিকা। Anthropic যে কারণে দিয়েছে সেই কারণে ব্যক্তি দ্বারা নয়, প্রজেক্ট দ্বারা গ্রুপ করুন।

দ্রুত যাচাই

আপনার প্রিপেইড ব্যালেন্স ইতিমধ্যে শূন্যে অনুরোধ বন্ধ করে। তাহলে ৫০% এবং ৭৫%-এ সতর্কবার্তা কেন যোগ করবেন?

উত্তর দেখান

উত্তর: কারণ শূন্য খুব দেরি: আপনি একটি রানঅ্যাওয়ে লুপ লক্ষ্য করতে চান যখন এখনও টাকা আছে তা তদন্ত করার জন্য

ব্যালেন্স একটি হার্ড স্টপ, অ্যালার্ম নয়। প্রাথমিক থ্রেশহোল্ড ১০০%-এ একটি আশ্চর্যকে নবম দিনে একটি প্রশ্নে পরিণত করে।

লগ: প্রতি অনুরোধে একটি লাইন#

প্রতিটি চ্যাট কমপ্লিশন প্রতিক্রিয়ায় prompt_tokens এবং completion_tokens সহ একটি usage অবজেক্ট থাকে। রিপোর্টের জন্য এটুকুই যথেষ্ট, সাথে একটি প্রজেক্ট লেবেল যা আপনি নিজে যোগ করেন। এই র্যাপার অনুরোধ পাঠায় এবং একটি মাসিক ফাইলে একটি লাইন যোগ করে (ফাইলের নাম প্রতি মাসে পরিবর্তিত হয়, তাই নতুন মাস শূন্য থেকে শুরু হয়):

python
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?"}])

CheapTokens ডকস থেকে সম্পূর্ণ মডেল আইডি ব্যবহার করুন (deepseek-ai/DeepSeek-V4-Flash-0731, zai-org/GLM-5.3-Flash); প্রাইস টেবিলের সংক্ষিপ্ত নাম API গ্রহণ করে না। কীটি একটি এনভায়রনমেন্ট ভেরিয়েবল থেকে আসে, কখনও ফাইল থেকে নয়।

প্রতিটি অনুরোধ থেকে ব্যবহার লগ, প্রজেক্ট রিপোর্ট এবং সতর্কবার্তার প্রবাহ
কীভাবে একটি অনুরোধ লগে একটি লাইন হয়, তারপর একটি রিপোর্ট এবং একটি সতর্কবার্তা

স্ক্রিপ্ট: প্রতি প্রজেক্ট খরচ এবং থ্রেশহোল্ড সতর্কবার্তা#

এটি report.py হিসেবে সংরক্ষণ করুন। দামগুলি প্লেসহোল্ডার: প্রাইসিং টেবিল থেকে বর্তমানগুলি কপি করুন (উভয় মডেল এখানে শুধুমাত্র গণিত পাঠযোগ্য রাখতে একটি উদাহরণ মূল্য শেয়ার করে)।

python
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]))

শেষ চারটি লাইন হল সেই অংশ যা মানুষ ভুলে যায়। ছোট স্টেট ফাইল ছাড়া, স্ক্রিপ্টটি মাসের বাকি অংশে প্রতিটি রানে "৫০% পেরিয়েছে" বলে চিৎকার করবে। এটি দিয়ে, প্রতিটি স্তর একবার ফায়ার করে।

এটি চালান এবং ফলাফল পড়ুন#

চার লাইনের একটি খেলনা লগ নিন (একটি বাস্তব লগে প্রতি অনুরোধে একটি লাইন থাকে, তাই হাজার হাজার):

text
{"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}

উদাহরণ দাম এবং ১০-এর বাজেট সহ, python report.py প্রিন্ট করে:

text
agent    $  4.20   65%
blog     $  1.60   25%
bot      $  0.70   11%
total    $  6.50 of $10.00 (65%)
WARNING: budget passed 50%

এজেন্ট বিলের প্রায় দুই-তৃতীয়াংশ, এবং সতর্কবার্তা ৫০%-এ এসেছে, শেষে নয়। আবার চালান এবং সতর্কবার্তা শান্ত থাকে যতক্ষণ না মোট ৭৫%-এ পৌঁছায়।

প্রতি-প্রজেক্ট রিপোর্ট এবং ৫০% সতর্কবার্তা দেখানো একটি টার্মিনাল
খেলনা লগে রিপোর্ট আউটপুট: প্রতি প্রজেক্টের শেয়ার এবং প্রথম সতর্কবার্তা

প্রতি মাসে এটি কাজ করতে, আপনার তিনটি ধাপ প্রয়োজন:

ধাপে ধাপে

তিনটি ধাপে এটি ওয়্যার আপ করুন

প্রতিটি কল লগ করুন

আপনার সমস্ত কল ask(project, model, messages) এর মাধ্যমে রুট করুন এবং একটি সংক্ষিপ্ত, স্থিতিশীল প্রজেক্ট লেবেল বেছে নিন। মাসের মাঝখানে লেবেলের নাম পরিবর্তন করলে একটি প্রজেক্ট দুটি সারিতে বিভক্ত হয়।

দাম এবং বাজেট সেট করুন

প্রাইসিং টেবিল থেকে বর্তমান দাম PRICES এ রাখুন, এবং আপনার সীমা এক্সপোর্ট করুন: export BUDGET_USD=25।

একটি সময়সূচীতে এটি চালান

একটি ঘণ্টায় ক্রন লাইন যথেষ্ট: 0 * * * * cd ~/ai && python3 report.py। আপনি যদি সতর্কবার্তা আপনার কাছে পুশ করতে চান তবে আউটপুট একটি মেইল বা চ্যাট কমান্ডে পাঠান।

সস্তা মডেলে একটি মাস কেমন দেখায়#

সংখ্যাগুলি উপযোগী হয় যখন সেগুলি আপনার সংখ্যা হয়। ধরুন খেলনা লগের এজেন্ট প্রতি ধাপে গড়ে ৩০,০০০ ইনপুট এবং ২,০০০ আউটপুট টোকেন, প্রতি কাজে ২০ ধাপ, দিনে দুটি কাজ। DeepSeek-V4-Flash-এ একটি ধাপের খরচ $0.00065; GLM-5.3-Flash-এ, $0.00068। একটি দিন ৪০ ধাপ, একটি মাস ১,২০০। আপনার নিজের এজেন্টের সাথে মেলাতে স্লাইডারগুলি সরান:

খরচ ক্যালকুলেটর

এজেন্টের এক দিন: প্রতি কাজে ধাপ গুণ দিনে কাজ

প্রতি অনুরোধে ইনপুট টোকেন: ৩০,০০০ · প্রতি অনুরোধে আউটপুট টোকেন: ২,০০০ · প্রতিদিন অনুরোধ: ৪০

মডেলপ্রতিদিনপ্রতি মাসে
GLM-5.3-Flash$0.0272$0.816
DeepSeek-V4-Flash$0.026$0.78
MiniMax-M2.7$0.072$2.16

এবং ১,২০০ ধাপে মাস, ইনপুট এবং আউটপুট একসাথে গণনা করে:

মডেল প্রতি অনুরোধে ১,২০০টি অনুরোধ OpenRouter, ১,২০০টি অনুরোধ
GLM-5.3-Flash $0.00068 $0.816 $1.41
DeepSeek-V4-Flash $0.00065 $0.78 $2.86
MiniMax-M2.7 $0.0018 $2.16 $25.92

প্রতি অনুরোধে ৩০,০০০ ইনপুট এবং ২,০০০ আউটপুট টোকেন। প্রতি 1M টোকেনের দাম বর্তমান এবং আমাদের ট্যারিফের সাথে পরিবর্তিত হয়; OpenRouter কলামটি একই ওয়ার্কলোডের জন্য রেফারেন্স মূল্য দেখায়।

মোট, ইনপুট এবং আউটপুট একসাথে গণনা করে, উভয় মডেল সেই টেবিলে OpenRouter-এর রেফারেন্স দামের চেয়ে সস্তা, যেকোনো সময়ে এক দাম এবং কোনো পিক সারচার্জ নেই। DeepSeek-V4-Flash প্রতি উত্তরে ৩২,৭৬৮ আউটপুট টোকেন এবং ৩৮০K কনটেক্সট পর্যন্ত অনুমতি দেয়; GLM-5.3-Flash-এ ৩৯০K কনটেক্সট রয়েছে। একবার রিপোর্ট দেখালে কোন প্রজেক্টটি ভারী, শুধুমাত্র সেই প্রজেক্টের model স্ট্রিং পরিবর্তন করা এক-লাইনের পরিবর্তন, এবং একটি ব্যালেন্স প্রতিটি মডেল কভার করে। একটি অনুরোধ আসলে কত টোকেন ব্যবহার করে, দেখুন একটি API অনুরোধ কত টোকেন ব্যবহার করে; একটি এজেন্ট রান মাঝপথে থামাতে, দেখুন AI এজেন্ট টোকেন খরচ ট্র্যাকিং। দাম এবং মডেল CheapTokens মডেল পেজ এ আছে।

এটি কোথায় ভুল হয়#

  • PRICES এ একটি মডেল অনুপস্থিত। স্ক্রিপ্টটি একটি KeyError দিয়ে থামে যা মডেলের নাম দেয়। এটি যোগ করুন; শূন্যে ডিফল্ট করবেন না, নাহলে প্রজেক্টটি বিনামূল্যে দেখাবে।
  • স্ট্রিমিং কল। চূড়ান্ত চাঙ্ক ব্যবহার শুধুমাত্র তখনই বহন করে যদি আপনি এটি চান (OpenAI SDK-তে stream_options={"include_usage": True})। অন্যথায় আপনার লগে ফাঁক থাকে।
  • ব্যর্থ অনুরোধ। শুধুমাত্র সেই প্রতিক্রিয়াগুলি লগ করুন যেগুলিতে একটি usage অবজেক্ট আছে; একটি অনুরোধ যা ত্রুটি করেছে তার গণনা করার কিছু নেই।
  • প্রতি-ব্যক্তি রিপোর্ট। লেবেলটি একটি প্রজেক্ট বা এজেন্টের নামে রাখুন। মানুষ সম্পর্কে একটি রিপোর্ট ভুল সিদ্ধান্তে আমন্ত্রণ জানায়।