Перейти до вмісту
Підрахунок токенів

Підрахунок токенів

Підрахуйте токени тексту або цілого запиту, перш ніж його надсилати.

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"])
200 Відповідь
{
  "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"])
200 Відповідь
{
  "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)
200 Відповідь
{
  "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-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 читайте кількість токенів з об'єкта 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, які є в обох формах.

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"
  }
}