Към съдържанието
Броене на токени

Броене на токени

Пребройте токените на текст или на цяла заявка, преди да я изпратите.

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 Системният prompt: низ или масив от текстови блокове.
tools array Дефиниции на инструменти с name, description и input_schema.

Приемат се за съвместимост, без ефект върху броя: tool_choice, max_tokens, temperature, top_p, stop_sequences, stream, thinking. Можете да подадете тялото на реална заявка без промяна.

Отговорът е JSON обект с тези полета:

Поле Тип Описание
input_tokens integer Токените на целия вход: системен prompt, съобщения, инструменти и изображения.

Поддържани модели

И двата ендпоинта броят за хостваните 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.
Съобщения Съобщенията и инструментите се подреждат със собствения чат шаблон на модела, до мястото, където започва отговорът, и целият този prompt се брои.
Роли Броят се съобщенията 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.

  • Броят е входът преди отстъпката за кеширан вход. Реалната заявка може да прочете част от този вход от кеша и да таксува тази част по кешираната ставка. Кеширане на prompt-и
  • Изображение, зададено като URL http(s), се брои тук за 1,024. Реалната заявка изтегля изображението и го брои по размера му в пиксели, така че двете числа могат да се различават. Изпратете изображението като base64, за да получите същото число.
  • Изходът не е част от броя. Отговорът на реална заявка се таксува допълнително като изходни токени, включително разсъжденията.
  • Броенето на text няма чат форматиране. Използвайте го, за да измерите документ или част от 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, което не е 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"
  }
}