Tokenräkning
Räkna tokens i en text eller i en hel begäran innan du skickar den.
POST https://api.shannon-ai.com/v1/tokenize
POST https://api.shannon-ai.com/v1/messages/count_tokens
Båda endpointsen räknar med tokenizern för den modell du anger, och ingen modell körs. De gäller de hostade open-weight-modellerna. /v1/tokenize tar en ren text eller en Chat Completions-konversation. /v1/messages/count_tokens tar en begäran i Anthropic Messages-formatet, vilket är anropet som Anthropic-SDK:n och Claude Code gör.
Att räkna är gratis. Ett anrop kräver din API-nyckel, tar ingenting från din balans och syns inte i din användningslogg.
Räkna en text
Skicka model och text. Texten räknas som den är, utan någon chattformatering runt den.
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
} Talen i svaren på den här sidan är exempel. Samma text ger en annan räkning på en annan modell.
Räkna en chattbegäran
Skicka model och messages, med tools när begäran har dem, precis som du skulle skicka dem till /v1/chat/completions. Svaret är storleken på hela inputen.
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
} Fält i /v1/tokenize
| Fält | Typ | Beskrivning |
|---|---|---|
model | string | Obligatoriskt. Ett id för en hostad open-weight-modell. Versaler och gemener behandlas lika. |
text | string | En text som ska räknas som den är, utan chattformatering. Upp till 4,000,000 byte. Skicka text eller messages; när båda finns räknas text. |
messages | array | Chattmeddelanden i Chat Completions-formatet. De räknas som hela inputen i en begäran: varje meddelande med den formatering som modellens chattmall lägger runt det. |
tools | array | Verktygsdefinitioner som ska ingå i räkningen. Används tillsammans med messages. |
Svaret är ett JSON-objekt med dessa fält:
| Fält | Typ | Beskrivning |
|---|---|---|
model | string | Modell-id:t som räkningen gjordes för, i sin publicerade stavning. |
tokens | integer | Med text: textens tokens. Med messages: tokens i hela inputen, bilder inräknade. |
Räkna en Messages-begäran
Skicka den body som du skulle skicka till /v1/messages: model, messages, samt system och tools när du använder dem. De officiella Anthropic-SDK:erna anropar den här endpointen via 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
} Fält i /v1/messages/count_tokens
| Fält | Typ | Beskrivning |
|---|---|---|
model | string | Obligatoriskt. Ett id för en hostad open-weight-modell. |
messages | array | Obligatoriskt. Meddelanden i Anthropic Messages-formatet. Block av typen text, image, tool_use och tool_result räknas. |
system | string | array | Systemprompten: en sträng eller en array av textblock. |
tools | array | Verktygsdefinitioner med name, description och input_schema. |
Accepteras för kompatibilitet, utan effekt på räkningen: tool_choice, max_tokens, temperature, top_p, stop_sequences, stream, thinking. Du kan skicka bodyn från en riktig begäran oförändrad.
Svaret är ett JSON-objekt med dessa fält:
| Fält | Typ | Beskrivning |
|---|---|---|
input_tokens | integer | Tokens i hela inputen: systemprompt, meddelanden, verktyg och bilder. |
Modeller som stöds
Båda endpointsen räknar för de hostade open-weight-modellerna. GET /v1/models listar /v1/tokenize och /v1/messages/count_tokens i endpoints för varje modell som stöder dem. Varje annat model-värde, Shannon-id:na inräknade, besvaras med 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
För en Shannon-modell läser du tokenantalen från usage-objektet i ett svar.
Hur räkningen görs
Varje modell räknas med sin egen tokenizer och sin egen chattmall. Ingen uppskattning utifrån tecken eller ord används.
| Vad som räknas | Regel |
|---|---|
| En text | Strängens tokens så som den skickades. En tom sträng räknas som 0. |
| Meddelanden | Meddelandena och verktygen läggs upp med modellens egen chattmall, fram till den punkt där svaret börjar, och hela den prompten räknas. |
| Roller | Meddelanden med system, user, assistant och tool räknas. developer räknas som system. Ett meddelande utan innehåll och utan verktygsanrop lägger inte till något. |
| Verktygsanrop och resultat | Verktygsanrop i tidigare assistentvändningar och deras resultat ingår i räkningen, på båda endpointsen. |
| Bilder | En bild som skickas inne i bodyn (base64 eller en data:-URL) lägger till en token per ruta på 28 × 28 pixlar: ceil(width / 28) × ceil(height / 28). En bild som anges som http(s)-URL laddas inte ned av de här endpointsen och räknas som 1,024. |
Exempel: en bild på 1,024 × 768 pixlar räknas som ceil(1024 / 28) × ceil(768 / 28) = 37 × 28 = 1,036 tokens.
Räkningen och vad en begäran debiteras
Räkningen av en hel begäran görs på samma sätt som inputräkningen för en riktig begäran med samma modell, meddelanden och verktyg. Ett svar rapporterar det talet som usage.prompt_tokens på Chat Completions, som usage.input_tokens på Responses, och som usage.input_tokens plus usage.cache_read_input_tokens på Messages.
- Räkningen är inputen före rabatten för cachad input. En riktig begäran kan läsa en del av den inputen från cachen och fakturera den delen till cachepriset. Prompt-caching
- En bild som anges som
http(s)-URL räknas som 1,024 här. En riktig begäran laddar ned bilden och räknar den utifrån dess storlek i pixlar, så de två talen kan skilja sig åt. Skicka bilden som base64 för att få samma tal. - Output ingår inte i räkningen. Svaret på en riktig begäran faktureras som outputtokens utöver detta, resonemang inräknat.
- En
text-räkning har ingen chattformatering. Använd den för att mäta ett dokument eller en del av en prompt, ochmessages-formen för att mäta en begäran.
För att göra om en räkning till en kostnad, multiplicera den med modellens inputpris per 1M tokens. Modeller och priser
Gränser
| Gräns | Värde | Över den |
|---|---|---|
Längd på text | 4,000,000 byte (UTF-8) | 413 med meddelandet text too long |
| Begäranbody | 32 MiB | 413 |
| Per begäran | En text eller en konversation | Skicka en begäran per text för att räkna flera texter. |
Räkneanrop räknas inte mot gränsen på 120 begäranden per minut. Gränser och balans
Fel
| Status | Typ | Meddelande | När |
|---|---|---|---|
400 | invalid_request_error | tokenize is available for the hosted open models; unknown model: <model> | /v1/tokenize med ett model som inte är ett id för en hostad open-weight-modell. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <model> | /v1/messages/count_tokens med ett model som inte är ett id för en hostad open-weight-modell, eller utan model. |
400 | invalid_request_error | send `text` or `messages` | /v1/tokenize med varken text eller messages. |
401 | authentication_error | Missing authentication / Invalid API key | Ingen nyckel skickades, eller nyckeln är inte giltig. |
413 | invalid_request_error | text too long | text är längre än 4,000,000 byte. En body över 32 MiB besvaras också med 413. |
415 | invalid_request_error | Expected request with `Content-Type: application/json` | Begäran har ingen JSON-innehållstyp. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Ett obligatoriskt fält saknas (model på /v1/tokenize, messages på /v1/messages/count_tokens) eller ett fält har fel typ. |
503 | api_error | token counting is temporarily unavailable for this model | Räkningen kan inte göras för den här modellen just nu. Försök igen senare. |
/v1/tokenize returnerar fel i OpenAI-formen. På /v1/messages/count_tokens kommer endpointens egna fel (400 för modellen, 503) i Anthropic-formen, och 401, 413, 415 och 422 kommer i OpenAI-formen. Läs statuskoden först, sedan error.type och error.message, som finns i båda formerna.
{
"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"
}
}