Token sayma
Bir metnin ya da bir isteğin tamamının token'larını göndermeden önce sayın.
POST https://api.shannon-ai.com/v1/tokenize
POST https://api.shannon-ai.com/v1/messages/count_tokens
Her iki uç nokta da adını verdiğiniz modelin tokenizer'ı ile sayar ve hiçbir model çalışmaz. Host edilen açık ağırlıklı modelleri kapsarlar. /v1/tokenize düz bir metni ya da bir Chat Completions konuşmasını alır. /v1/messages/count_tokens, Anthropic Messages biçiminde bir istek alır; Anthropic SDK'sının ve Claude Code'un yaptığı çağrı budur.
Sayım ücretsizdir. Bir çağrı API anahtarınızı gerektirir, bakiyenizden hiçbir şey almaz ve kullanım günlüğünüzde görünmez.
Bir metni sayma
model ve text gönderin. Metin, çevresinde sohbet biçimlendirmesi olmadan, olduğu gibi sayılır.
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
} Bu sayfadaki yanıtlardaki sayılar örnektir. Aynı metin farklı bir modelde farklı bir sayım verir.
Bir sohbet isteğini sayma
model ve messages alanlarını, istekte varsa tools ile birlikte, /v1/chat/completions adresine göndereceğiniz gibi gönderin. Yanıt, girişin tamamının boyutudur.
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 alanları
| Alan | Tür | Açıklama |
|---|---|---|
model | string | Zorunlu. Host edilen açık ağırlıklı bir model kimliği. Büyük ve küçük harf aynı sayılır. |
text | string | Sohbet biçimlendirmesi olmadan, olduğu gibi sayılacak bir metin. En fazla 4,000,000 bayt. text veya messages gönderin; ikisi de varsa text sayılır. |
messages | array | Chat Completions biçiminde sohbet mesajları. Bir isteğin girişinin tamamı olarak sayılırlar: her mesaj, modelin sohbet şablonunun çevresine koyduğu biçimlendirmeyle birlikte. |
tools | array | Sayıma dahil edilecek araç tanımları. messages ile birlikte kullanılır. |
Yanıt, şu alanları içeren bir JSON nesnesidir:
| Alan | Tür | Açıklama |
|---|---|---|
model | string | Sayımın yapıldığı model kimliği, yayımlanmış yazımıyla. |
tokens | integer | text ile: metnin token'ları. messages ile: görseller dahil girişin tamamının token'ları. |
Bir Messages isteğini sayma
/v1/messages adresine göndereceğiniz gövdeyi gönderin: model, messages ve kullanıyorsanız system ile tools. Resmi Anthropic SDK'ları bu uç noktayı messages.count_tokens ile çağırır.
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 alanları
| Alan | Tür | Açıklama |
|---|---|---|
model | string | Zorunlu. Host edilen bir açık ağırlıklı model kimliği. |
messages | array | Zorunlu. Anthropic Messages biçiminde mesajlar. text, image, tool_use ve tool_result blokları sayılır. |
system | string | array | Sistem istemi: bir dize ya da metin blokları dizisi. |
tools | array | name, description ve input_schema içeren araç tanımları. |
Uyumluluk için kabul edilir, sayıma etkisi yoktur: tool_choice, max_tokens, temperature, top_p, stop_sequences, stream, thinking. Gerçek bir isteğin gövdesini değiştirmeden verebilirsiniz.
Yanıt, şu alanları içeren bir JSON nesnesidir:
| Alan | Tür | Açıklama |
|---|---|---|
input_tokens | integer | Girişin tamamının token'ları: sistem istemi, mesajlar, araçlar ve görseller. |
Desteklenen modeller
Her iki uç nokta da host edilen açık ağırlıklı modeller için sayar. GET /v1/models, bunları destekleyen her modelin endpoints alanında /v1/tokenize ve /v1/messages/count_tokens uç noktalarını listeler. Shannon kimlikleri dahil, başka herhangi bir model değeri 400 ile yanıtlanır.
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
Bir Shannon modeli için token sayılarını bir yanıtın usage nesnesinden okuyun.
Sayım nasıl yapılır
Her model kendi tokenizer'ı ve kendi sohbet şablonuyla sayılır. Karakter ya da sözcüklerden yapılan bir tahmin kullanılmaz.
| Ne sayılır | Kural |
|---|---|
| Bir metin | Dizenin gönderildiği haliyle token'ları. Boş bir dize 0 sayılır. |
| Mesajlar | Mesajlar ve araçlar, yanıtın başladığı noktaya kadar modelin kendi sohbet şablonuyla düzenlenir ve o istemin tamamı sayılır. |
| Roller | system, user, assistant ve tool mesajları sayılır. developer, system olarak sayılır. İçeriği ve araç çağrısı olmayan bir mesaj hiçbir şey eklemez. |
| Araç çağrıları ve sonuçları | Önceki asistan turlarının araç çağrıları ve sonuçları, her iki uç noktada da sayıma dahildir. |
| Görseller | Gövde içinde gönderilen bir görsel (base64 ya da bir data: URL'si) her 28 × 28 piksellik parça için bir token ekler: ceil(width / 28) × ceil(height / 28). Bir http(s) URL'si olarak verilen görsel bu uç noktalar tarafından indirilmez ve 1,024 sayılır. |
Örnek: 1,024 × 768 piksellik bir görsel ceil(1024 / 28) × ceil(768 / 28) = 37 × 28 = 1,036 token sayılır.
Sayım ve bir isteğin neyle ücretlendirildiği
Bir isteğin tamamının sayımı, aynı model, mesaj ve araçlarla yapılan gerçek bir isteğin giriş sayımıyla aynı şekilde yapılır. Yanıt bu sayıyı Chat Completions'ta usage.prompt_tokens, Responses'ta usage.input_tokens, Messages'ta ise usage.input_tokens artı usage.cache_read_input_tokens olarak bildirir.
- Sayım, önbelleğe alınmış giriş indiriminden önceki girişi gösterir. Gerçek bir istek bu girişin bir kısmını önbellekten okuyabilir ve o kısmı önbellek fiyatından faturalandırabilir. İstem önbelleğe alma
- Bir
http(s)URL'si olarak verilen görsel burada 1,024 sayılır. Gerçek bir istek görseli indirir ve piksel boyutundan sayar, bu yüzden iki sayı farklı olabilir. Aynı sayıyı almak için görseli base64 olarak gönderin. - Çıktı sayıma dahil değildir. Gerçek bir isteğin yanıtı, akıl yürütme dahil, ayrıca çıktı token'ı olarak faturalandırılır.
- Bir
textsayımında sohbet biçimlendirmesi yoktur. Bir dokümanı ya da bir istem parçasını ölçmek için onu, bir isteği ölçmek içinmessagesbiçimini kullanın.
Bir sayımı maliyete çevirmek için onu modelin 1M token başına giriş fiyatıyla çarpın. Modeller ve fiyatlandırma
Sınırlar
| Sınır | Değer | Aşıldığında |
|---|---|---|
text uzunluğu | 4,000,000 bayt (UTF-8) | text too long mesajıyla 413 |
| İstek gövdesi | 32 MiB | 413 |
| İstek başına | Bir metin ya da bir konuşma | Birkaç metni saymak için metin başına bir istek gönderin. |
Sayım çağrıları dakikada 120 istek sınırına sayılmaz. Limitler ve bakiye
Hatalar
| Durum | Tür | Mesaj | Ne zaman |
|---|---|---|---|
400 | invalid_request_error | tokenize is available for the hosted open models; unknown model: <model> | Host edilen bir açık ağırlıklı kimlik olmayan bir model ile /v1/tokenize. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <model> | Host edilen bir açık ağırlıklı kimlik olmayan bir model ile ya da model olmadan /v1/messages/count_tokens. |
400 | invalid_request_error | send `text` or `messages` | Ne text ne messages içeren /v1/tokenize. |
401 | authentication_error | Missing authentication / Invalid API key | Anahtar gönderilmedi ya da anahtar geçerli değil. |
413 | invalid_request_error | text too long | text 4,000,000 bayttan uzun. 32 MiB'tan büyük bir gövde de 413 ile yanıtlanır. |
415 | invalid_request_error | Expected request with `Content-Type: application/json` | İstekte JSON içerik türü yok. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Zorunlu bir alan eksik (/v1/tokenize üzerinde model, /v1/messages/count_tokens üzerinde messages) ya da bir alanın türü yanlış. |
503 | api_error | token counting is temporarily unavailable for this model | Sayım bu model için şu anda yapılamıyor. Daha sonra yeniden deneyin. |
/v1/tokenize hataları OpenAI biçiminde döndürür. /v1/messages/count_tokens üzerinde uç noktanın kendi hataları (model için 400, 503) Anthropic biçiminde, 401, 413, 415 ve 422 ise OpenAI biçiminde gelir. Önce durum kodunu, sonra iki biçimde de bulunan error.type ve error.message alanlarını okuyun.
{
"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"
}
}