কনটেন্টে যান
Token গণনা

Token গণনা

পাঠানোর আগে একটি টেক্সটের বা পুরো রিকোয়েস্টের tokens গুনুন।

POST https://api.shannon-ai.com/v1/tokenize

POST https://api.shannon-ai.com/v1/messages/count_tokens

দুটি এন্ডপয়েন্টই আপনার দেওয়া মডেলের টোকেনাইজার দিয়ে গোনে, কোনো মডেল চলে না। এগুলো হোস্টেড ওপেন-ওয়েট মডেলগুলোর জন্য। /v1/tokenize সাধারণ টেক্সট বা একটি Chat Completions কথোপকথন নেয়। /v1/messages/count_tokens Anthropic Messages ফরম্যাটের রিকোয়েস্ট নেয়, যা Anthropic SDK ও Claude Code যে কল করে।

গণনা বিনামূল্যে। কলের জন্য আপনার API key লাগে, আপনার ব্যালেন্স থেকে কিছু কাটে না এবং আপনার ব্যবহার লগে দেখা যায় না।

একটি টেক্সট গোনা

model ও text পাঠান। টেক্সট যেমন আছে তেমনই গোনা হয়, তার চারপাশে কোনো চ্যাট ফরম্যাটিং ছাড়া।

import requests

response = requests.post(
    "https://api.shannon-ai.com/v1/tokenize",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "model": "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
        "text": "Hello, world",
    },
)
print(response.json()["tokens"])
200 উত্তর
{
  "model": "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
  "tokens": 3
}

এই পেজের উত্তরগুলোর সংখ্যা উদাহরণ। একই টেক্সট ভিন্ন মডেলে ভিন্ন সংখ্যা দেয়।

একটি চ্যাট রিকোয়েস্ট গোনা

/v1/chat/completions-এ যেভাবে পাঠাতেন ঠিক সেভাবে model ও messages পাঠান, রিকোয়েস্টে থাকলে tools-সহ। উত্তর হলো পুরো ইনপুটের আকার।

import requests

request = {
    "model": "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
    "messages": [
        {"role": "system", "content": "You are a concise assistant."},
        {"role": "user", "content": "What is the weather in Paris?"},
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "get_weather",
                "description": "Current weather for a city",
                "parameters": {
                    "type": "object",
                    "properties": {"city": {"type": "string"}},
                    "required": ["city"],
                },
            },
        }
    ],
}

response = requests.post(
    "https://api.shannon-ai.com/v1/tokenize",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json=request,
)
print(response.json()["tokens"])
200 উত্তর
{
  "model": "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
  "tokens": 164
}

/v1/tokenize-এর ফিল্ডসমূহ

ফিল্ড টাইপ বিবরণ
model string আবশ্যক। একটি হোস্টেড ওপেন-ওয়েট মডেল id। বড়-ছোট হাতের অক্ষর একই ধরা হয়।
text string যেমন আছে তেমন গোনার জন্য একটি টেক্সট, কোনো চ্যাট ফরম্যাটিং ছাড়া। 4,000,000 বাইট পর্যন্ত। text বা messages পাঠান; দুটিই থাকলে text গোনা হয়।
messages array Chat Completions ফরম্যাটে চ্যাট মেসেজ। এগুলো একটি রিকোয়েস্টের পূর্ণ ইনপুট হিসেবে গোনা হয়: প্রতিটি মেসেজ, মডেলের চ্যাট টেমপ্লেট তার চারপাশে যে ফরম্যাটিং দেয় সেটিসহ।
tools array গণনায় যুক্ত করার টুল সংজ্ঞা। messages-এর সাথে একসঙ্গে ব্যবহার হয়।

উত্তর একটি JSON অবজেক্ট, এই ফিল্ডগুলো সহ:

ফিল্ড টাইপ বিবরণ
model string যে মডেল id-র জন্য গণনা হয়েছে, তার প্রকাশিত বানানে।
tokens integer text থাকলে: টেক্সটের tokens। messages থাকলে: ইমেজসহ পুরো ইনপুটের tokens।

একটি Messages রিকোয়েস্ট গোনা

/v1/messages-এ যে বডি পাঠাতেন সেটিই পাঠান: model, messages, এবং ব্যবহার করলে system ও tools। অফিশিয়াল Anthropic SDK এই এন্ডপয়েন্টকে messages.count_tokens দিয়ে কল করে।

import anthropic

client = anthropic.Anthropic(
    api_key="YOUR_API_KEY",
    base_url="https://api.shannon-ai.com",
)

count = client.messages.count_tokens(
    model="DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
    system="You are a concise assistant.",
    messages=[
        {"role": "user", "content": "Summarise the attached report."}
    ],
)
print(count.input_tokens)
200 উত্তর
{
  "input_tokens": 21
}

/v1/messages/count_tokens এন্ডপয়েন্টের ফিল্ডসমূহ

ফিল্ড টাইপ বিবরণ
model string আবশ্যক। একটি হোস্টেড ওপেন-ওয়েট মডেল id।
messages array আবশ্যক। Anthropic Messages ফরম্যাটে মেসেজ। text, image, tool_use ও tool_result ব্লক গোনা হয়।
system string | array সিস্টেম প্রম্পট: একটি string অথবা টেক্সট ব্লকের অ্যারে।
tools array name, description ও input_schema সহ টুল সংজ্ঞা।

সামঞ্জস্যের জন্য গ্রহণ করা হয়, গণনায় কোনো প্রভাব ছাড়াই: tool_choice, max_tokens, temperature, top_p, stop_sequences, stream, thinking। আপনি প্রকৃত রিকোয়েস্টের বডি অপরিবর্তিত পাঠাতে পারেন।

উত্তর একটি JSON অবজেক্ট, এই ফিল্ডগুলো সহ:

ফিল্ড টাইপ বিবরণ
input_tokens integer পুরো ইনপুটের tokens: সিস্টেম প্রম্পট, মেসেজ, টুল ও ইমেজ।

সমর্থিত মডেল

দুটি এন্ডপয়েন্টই হোস্টেড ওপেন-ওয়েট মডেলের জন্য গোনে। GET /v1/models যে মডেল /v1/tokenize ও /v1/messages/count_tokens সমর্থন করে তার endpoints-এ সেগুলো তালিকাভুক্ত করে। অন্য যেকোনো model মান, Shannon id-সহ, 400 দিয়ে উত্তর পায়।

  • DeepSeek-V4-Pro-0813-3BIT-REAP
  • GLM-5.2-3BIT-REAP
  • Kimi-K3-3BIT-REAP
  • Nemotron3Ultra-3BIT-REAP
  • MiniMax-M3-3BIT-REAP
  • DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP
  • Kimi-K2.6-W4A16-AUTOROUND-REAP
  • Laguna-S-2.1-W4A16-AUTOROUND-REAP
  • inkling-W4A16-AUTOROUND-REAP
  • MiMo-V2.5-Pro-W8A16
  • MiMo-V2.5-W8A16
  • Hy3-W8A16

Shannon মডেলের জন্য token সংখ্যা উত্তরের usage অবজেক্ট থেকে পড়ুন।

গণনা কীভাবে হয়

প্রতিটি মডেল তার নিজস্ব টোকেনাইজার ও নিজস্ব চ্যাট টেমপ্লেট দিয়ে গোনা হয়। অক্ষর বা শব্দ থেকে কোনো আন্দাজ ব্যবহার করা হয় না।

কী গোনা হয় নিয়ম
একটি টেক্সট string-টি যেমন পাঠানো হয়েছে তার tokens। খালি string গোনা হয় 0।
মেসেজ মেসেজ ও টুলস মডেলের নিজস্ব চ্যাট টেমপ্লেটে সাজানো হয়, উত্তর শুরুর বিন্দু পর্যন্ত, এবং সেই পুরো প্রম্পট গোনা হয়।
রোল system, user, assistant ও tool মেসেজ গোনা হয়। developer গোনা হয় system হিসেবে। কনটেন্ট ও টুল কল ছাড়া মেসেজ কিছু যোগ করে না।
টুল কল ও ফলাফল আগের অ্যাসিস্ট্যান্ট টার্নের টুল কল ও তাদের ফলাফল গণনার অংশ, দুটি এন্ডপয়েন্টেই।
ইমেজ বডির ভেতরে পাঠানো ইমেজ (base64 বা data: URL) প্রতি 28 × 28 পিক্সেলের প্যাচে একটি token যোগ করে: ceil(width / 28) × ceil(height / 28)। http(s) URL হিসেবে দেওয়া ইমেজ এই এন্ডপয়েন্টগুলো ডাউনলোড করে না এবং 1,024 গোনে।

উদাহরণ: 1,024 × 768 পিক্সেলের একটি ইমেজ গোনা হয় ceil(1024 / 28) × ceil(768 / 28) = 37 × 28 = 1,036 tokens।

গণনা এবং একটি রিকোয়েস্টে কী চার্জ হয়

একটি পুরো রিকোয়েস্টের গণনা একই মডেল, মেসেজ ও টুলসহ প্রকৃত রিকোয়েস্টের ইনপুট গণনার মতোই করা হয়। উত্তর এই সংখ্যাটি জানায় Chat Completions-এ usage.prompt_tokens হিসেবে, Responses-এ usage.input_tokens হিসেবে, এবং Messages-এ usage.input_tokens যোগ usage.cache_read_input_tokens হিসেবে।

  • গণনা হলো ক্যাশড-ইনপুট ছাড়ের আগের ইনপুট। প্রকৃত রিকোয়েস্ট ওই ইনপুটের একটি অংশ ক্যাশ থেকে পড়তে পারে এবং সেই অংশ ক্যাশড হারে বিল হয়। প্রম্পট ক্যাশিং
  • http(s) URL হিসেবে দেওয়া ইমেজ এখানে 1,024 গোনা হয়। প্রকৃত রিকোয়েস্ট ইমেজ ডাউনলোড করে এবং পিক্সেল আকার থেকে গোনে, তাই দুটি সংখ্যা আলাদা হতে পারে। একই সংখ্যা পেতে ইমেজ base64 হিসেবে পাঠান।
  • আউটপুট গণনার অংশ নয়। প্রকৃত রিকোয়েস্টের উত্তর রিজনিংসহ আউটপুট tokens হিসেবে ওপরে আলাদা বিল হয়।
  • text গণনায় কোনো চ্যাট ফরম্যাটিং নেই। ডকুমেন্ট বা প্রম্পটের অংশ মাপতে এটি ব্যবহার করুন, আর রিকোয়েস্ট মাপতে messages রূপ।

গণনাকে খরচে বদলাতে মডেলের প্রতি 1M tokens-এর ইনপুট দাম দিয়ে গুণ করুন। মডেল ও মূল্য

সীমা

সীমা মান এর ওপরে
text-এর দৈর্ঘ্য 4,000,000 বাইট (UTF-8) বার্তা text too long সহ 413
রিকোয়েস্ট বডি 32 MiB 413
প্রতি রিকোয়েস্টে একটি টেক্সট বা একটি কথোপকথন একাধিক টেক্সট গুনতে প্রতিটি টেক্সটের জন্য একটি করে রিকোয়েস্ট পাঠান।

গণনার কলগুলো প্রতি মিনিটে 120টি রিকোয়েস্টের সীমায় গোনা হয় না। সীমা ও ব্যালেন্স

এরর

স্ট্যাটাস Type বার্তা কখন
400 invalid_request_error tokenize is available for the hosted open models; unknown model: <model> হোস্টেড ওপেন-ওয়েট id নয় এমন model সহ /v1/tokenize।
400 invalid_request_error count_tokens is available for the hosted open models; unknown model: <model> হোস্টেড ওপেন-ওয়েট id নয় এমন model সহ, বা model ছাড়া /v1/messages/count_tokens।
400 invalid_request_error send `text` or `messages` text বা messages কোনোটিই ছাড়া /v1/tokenize।
401 authentication_error Missing authentication / Invalid API key কোনো key পাঠানো হয়নি, অথবা key বৈধ নয়।
413 invalid_request_error text too long text 4,000,000 বাইটের চেয়ে দীর্ঘ। 32 MiB-এর বেশি বডির উত্তরও 413।
415 invalid_request_error Expected request with `Content-Type: application/json` রিকোয়েস্টে JSON কনটেন্ট টাইপ নেই।
422 invalid_request_error Failed to deserialize the JSON body into the target type: … একটি আবশ্যক ফিল্ড নেই (/v1/tokenize-এ model, /v1/messages/count_tokens-এ messages) অথবা কোনো ফিল্ডের type ভুল।
503 api_error token counting is temporarily unavailable for this model এই মুহূর্তে এই মডেলের জন্য গণনা করা যাচ্ছে না। পরে আবার চেষ্টা করুন।

/v1/tokenize এরর OpenAI আকারে ফেরত দেয়। /v1/messages/count_tokens-এ এন্ডপয়েন্টের নিজস্ব এরর (মডেলের জন্য 400, 503) Anthropic আকারে আসে, আর 401, 413, 415 ও 422 আসে OpenAI আকারে। আগে স্ট্যাটাস কোড পড়ুন, তারপর error.type ও error.message, যা দুই আকারেই থাকে।

400 /v1/tokenize
{
  "error": {
    "type": "invalid_request_error",
    "message": "tokenize is available for the hosted open models; unknown model: shannon-3"
  }
}
400 /v1/messages/count_tokens
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "count_tokens is available for the hosted open models; unknown model: shannon-3"
  }
}