Броене на токени
Пребройте токените на текст или на цяла заявка, преди да я изпратите.
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 | Системният 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-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. |
| Съобщения | Съобщенията и инструментите се подреждат със собствения чат шаблон на модела, до мястото, където започва отговорът, и целият този 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, които присъстват и в двата формата.
{
"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"
}
}