Броење токени
Избројте ги токените на текст или на цело барање пред да го испратите.
POST https://api.shannon-ai.com/v1/tokenize
POST https://api.shannon-ai.com/v1/messages/count_tokens
Двата ендпоинта бројат со tokenizer-от на моделот што го именувате и не се извршува ниту еден модел. Ги покриваат хостираните open-weight модели. /v1/tokenize прима обичен текст или разговор од Chat Completions. /v1/messages/count_tokens прима барање во форматот Anthropic Messages, што е повикот што го прават SDK-то на Anthropic и Claude Code.
Броењето е бесплатно. Повикот бара ваш API клуч, не зема ништо од вашето салдо и не се појавува во вашиот дневник на употреба.
Броење на текст
Испратете model и text. Текстот се брои каков што е, без chat форматирање околу него.
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
} Броевите во одговорите на оваа страница се примери. Истиот текст дава различна бројка на различен модел.
Броење на chat барање
Испратете model и messages, со tools кога барањето ги има, точно како што би ги испратиле на /v1/chat/completions. Одговорот е големината на целиот влез.
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 | Задолжително. Ид на хостиран open-weight модел. Големите и малите букви се третираат исто. |
text | string | Текст што се брои каков што е, без chat форматирање. До 4,000,000 бајти. Испратете text или messages; кога се присутни двете, се брои text. |
messages | array | Chat пораки во форматот Chat Completions. Се бројат како целосен влез на барање: секоја порака со форматирањето што chat шаблонот на моделот го става околу неа. |
tools | array | Дефиниции на алатки што се вклучуваат во бројката. Се користат заедно со messages. |
Одговорот е JSON објект со овие полиња:
| Поле | Тип | Опис |
|---|---|---|
model | string | Идот на моделот за кој е направено броењето, во објавениот запис. |
tokens | integer | Со text: токените на текстот. Со messages: токените на целиот влез, вклучително сликите. |
Броење на барање Messages
Испратете го телото што би го испратиле на /v1/messages: model, messages, а system и tools кога ги користите. Официјалните SDK-а на Anthropic го повикуваат овој ендпоинт преку 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 | Задолжително. Ид на хостиран open-weight модел. |
messages | array | Задолжително. Пораки во форматот Anthropic Messages. Се бројат блоковите text, image, tool_use и tool_result. |
system | string | array | System prompt-от: стринг или низа од текстуални блокови. |
tools | array | Дефиниции на алатки со name, description и input_schema. |
Прифатено заради компатибилност, без ефект врз бројката: tool_choice, max_tokens, temperature, top_p, stop_sequences, stream, thinking. Можете да пренесете тело на вистинско барање непроменето.
Одговорот е JSON објект со овие полиња:
| Поле | Тип | Опис |
|---|---|---|
input_tokens | integer | Токените на целиот влез: system prompt, пораки, алатки и слики. |
Поддржани модели
Двата ендпоинта бројат за хостираните open-weight модели. GET /v1/models ги наведува /v1/tokenize и /v1/messages/count_tokens во endpoints на секој модел што ги поддржува. Секоја друга вредност на model, вклучително и идовите на Shannon, се одговара со 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, прочитајте ги бројките на токени од објектот usage на одговорот.
Како се прави броењето
Секој модел се брои со свој tokenizer и свој chat шаблон. Не се користи проценка според знаци или зборови.
| Што се брои | Правило |
|---|---|
| Текст | Токените на стрингот каков што е испратен. Празен стринг брои 0. |
| Пораки | Пораките и алатките се распоредуваат со сопствениот chat шаблон на моделот, до точката каде започнува одговорот, и целиот тој prompt се брои. |
| Улоги | Се бројат пораките system, user, assistant и tool. developer се брои како system. Порака без содржина и без повик на алатка не додава ништо. |
| Повици на алатки и резултати | Повиците на алатки од претходните чекори на assistant и нивните резултати се дел од бројката, на двата ендпоинта. |
| Слики | Слика испратена во телото (base64 или data: URL) додава еден токен по поле од 28 × 28 пиксели: ceil(width / 28) × ceil(height / 28). Слика дадена како http(s) URL овие ендпоинти не ја преземаат и брои 1,024. |
Пример: слика од 1,024 × 768 пиксели брои ceil(1024 / 28) × ceil(768 / 28) = 37 × 28 = 1,036 токени.
Бројката и што се наплатува за барање
Броењето на цело барање се прави на ист начин како броењето на влезот на вистинско барање со истиот модел, пораки и алатки. Одговорот ја пријавува таа бројка како usage.prompt_tokens на Chat Completions, како usage.input_tokens на Responses, и како usage.input_tokens плус usage.cache_read_input_tokens на Messages.
- Бројката е влезот пред попустот за кеширан влез. Вистинско барање може да прочита дел од тој влез од кешот и да го наплати тој дел по цената за кеширано. Кеширање на промптови
- Слика дадена како
http(s)URL тука брои 1,024. Вистинско барање ја презема сликата и ја брои според нејзината големина во пиксели, па двете бројки може да се разликуваат. Испратете ја сликата како base64 за да добиете иста бројка. - Излезот не е дел од бројката. Одговорот на вистинско барање дополнително се наплатува како излезни токени, вклучувајќи го reasoning-от.
- Броењето на
textнема chat форматирање. Користете го за да измерите документ или дел од prompt, а форматаmessagesза да измерите барање.
За да претворите бројка во трошок, помножете ја со цената за влез на моделот за 1M токени. Модели и цени
Ограничувања
| Ограничување | Вредност | Над него |
|---|---|---|
Должина на text | 4,000,000 бајти (UTF-8) | 413 со пораката text too long |
| Тело на барање | 32 MiB | 413 |
| По барање | Еден текст или еден разговор | За да броите повеќе текстови, испратете по едно барање за секој текст. |
Повиците за броење не се вбројуваат во ограничувањето од 120 барања во минута. Ограничувања и салдо
Грешки
| Статус | Тип | Порака | Кога |
|---|---|---|---|
400 | invalid_request_error | tokenize is available for the hosted open models; unknown model: <model> | /v1/tokenize со model што не е ид на хостиран open-weight модел. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <model> | /v1/messages/count_tokens со model што не е ид на хостиран open-weight модел, или без model. |
400 | invalid_request_error | send `text` or `messages` | /v1/tokenize ниту со text, ниту со messages. |
401 | authentication_error | Missing authentication / Invalid API 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: … | Недостасува задолжително поле (model на /v1/tokenize, messages на /v1/messages/count_tokens) или поле има погрешен тип. |
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"
}
}