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"]) const response = await fetch("https://api.shannon-ai.com/v1/tokenize", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
text: "Hello, world",
}),
});
const { tokens } = await response.json();
console.log(tokens); curl https://api.shannon-ai.com/v1/tokenize \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
"text": "Hello, world"
}' {
"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"]) const 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"],
},
},
},
],
};
const response = await fetch("https://api.shannon-ai.com/v1/tokenize", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify(request),
});
const { tokens } = await response.json();
console.log(tokens); curl https://api.shannon-ai.com/v1/tokenize \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"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"]
}
}
}
]
}' {
"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) import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com",
});
const count = await client.messages.countTokens({
model: "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
system: "You are a concise assistant.",
messages: [
{ role: "user", content: "Summarise the attached report." },
],
});
console.log(count.input_tokens); curl https://api.shannon-ai.com/v1/messages/count_tokens \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
"system": "You are a concise assistant.",
"messages": [
{"role": "user", "content": "Summarise the attached report."}
]
}' {
"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-REAPGLM-5.2-3BIT-REAPKimi-K3-3BIT-REAPNemotron3Ultra-3BIT-REAPMiniMax-M3-3BIT-REAPDeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAPKimi-K2.6-W4A16-AUTOROUND-REAPLaguna-S-2.1-W4A16-AUTOROUND-REAPinkling-W4A16-AUTOROUND-REAPMiMo-V2.5-Pro-W8A16MiMo-V2.5-W8A16Hy3-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, যা দুই আকারেই থাকে।
{
"error": {
"type": "invalid_request_error",
"message": "tokenize is available for the hosted open models; unknown model: shannon-3"
}
} {
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "count_tokens is available for the hosted open models; unknown model: shannon-3"
}
}