Підрахунок токенів
Підрахуйте токени тексту або цілого запиту, перш ніж його надсилати.
POST https://api.shannon-ai.com/v1/tokenize
POST https://api.shannon-ai.com/v1/messages/count_tokens
Обидва ендпоінти рахують токенайзером названої вами моделі, і жодна модель не запускається. Вони охоплюють хостовані open-weight моделі. /v1/tokenize приймає простий текст або розмову Chat Completions. /v1/messages/count_tokens приймає запит у форматі Anthropic Messages — саме такий виклик роблять SDK Anthropic і Claude Code.
Підрахунок безкоштовний. Виклик потребує вашого API-ключа, нічого не забирає з вашого балансу й не з'являється у вашому журналі використання.
Підрахунок тексту
Надішліть 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
} Числа у відповідях на цій сторінці — приклади. Той самий текст дає інший підрахунок на іншій моделі.
Підрахунок чат-запиту
Надішліть 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 | Обов'язкове. Id хостованої open-weight моделі. Регістр не враховується. |
text | string | Текст, який рахується як є, без форматування чату. До 4,000,000 байтів. Надішліть text або messages; якщо є обидва, рахується text. |
messages | array | Повідомлення чату у форматі Chat Completions. Вони рахуються як повний вхід запиту: кожне повідомлення з форматуванням, яке навколо нього ставить шаблон чату моделі. |
tools | array | Визначення інструментів, які слід включити в підрахунок. Використовуються разом із messages. |
Відповідь — JSON-об'єкт з такими полями:
| Поле | Тип | Опис |
|---|---|---|
model | string | Id моделі, для якої зроблено підрахунок, в опублікованому написанні. |
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 | Обов'язкове. Id хостованої open-weight моделі. |
messages | array | Обов'язкове. Повідомлення у форматі Anthropic Messages. Рахуються блоки text, image, tool_use і tool_result. |
system | string | array | Системний промпт: рядок або масив текстових блоків. |
tools | array | Визначення інструментів з name, description і input_schema. |
Приймаються для сумісності, без впливу на підрахунок: tool_choice, max_tokens, temperature, top_p, stop_sequences, stream, thinking. Можна передати тіло справжнього запиту без змін.
Відповідь — JSON-об'єкт з такими полями:
| Поле | Тип | Опис |
|---|---|---|
input_tokens | integer | Токени всього входу: системний промпт, повідомлення, інструменти та зображення. |
Підтримувані моделі
Обидва ендпоінти рахують для хостованих open-weight моделей. GET /v1/models перелічує /v1/tokenize і /v1/messages/count_tokens в endpoints кожної моделі, що їх підтримує. Будь-яке інше значення model, зокрема id 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 у відповіді.
Як робиться підрахунок
Кожна модель рахується власним токенайзером і власним шаблоном чату. Оцінка за символами чи словами не використовується.
| Що рахується | Правило |
|---|---|
| Текст | Токени рядка в тому вигляді, в якому його надіслано. Порожній рядок рахується як 0. |
| Повідомлення | Повідомлення та інструменти розкладаються за власним шаблоном чату моделі до місця, де починається відповідь, і весь цей промпт рахується. |
| Ролі | Рахуються повідомлення system, user, assistant і tool. developer рахується як system. Повідомлення без вмісту й без виклику інструмента нічого не додає. |
| Виклики інструментів і результати | Виклики інструментів у попередніх ходах асистента та їхні результати входять до підрахунку на обох ендпоінтах. |
| Зображення | Зображення, надіслане в тілі (base64 або URL data:), додає один токен на кожну ділянку 28 × 28 пікселів: ceil(width / 28) × ceil(height / 28). Зображення, указане як URL http(s), ці ендпоінти не завантажують, і воно рахується як 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.
- Підрахунок — це вхід до знижки на кешований вхід. Справжній запит може прочитати частину цього входу з кешу й тарифікувати її за ціною кешу. Кешування запитів
- Зображення, указане як URL
http(s), тут рахується як 1,024. Справжній запит завантажує зображення й рахує його за розміром у пікселях, тож два числа можуть відрізнятися. Надішліть зображення як base64, щоб отримати те саме число. - Вихід не входить до підрахунку. Відповідь справжнього запиту тарифікується додатково як вихідні токени, разом із міркуваннями.
- Підрахунок
textне має форматування чату. Використовуйте його для вимірювання документа чи частини промпту, а форму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, що не є id хостованої open-weight моделі. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <model> | /v1/messages/count_tokens із model, що не є id хостованої 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"
}
}