Tælling af tokens
Tæl tokens i en tekst eller i en hel anmodning, før du sender den.
POST https://api.shannon-ai.com/v1/tokenize
POST https://api.shannon-ai.com/v1/messages/count_tokens
Begge endpoints tæller med tokenizeren for den model, du angiver, og ingen model kører. De dækker de hostede open-weight-modeller. /v1/tokenize tager en ren tekst eller en Chat Completions-samtale. /v1/messages/count_tokens tager en anmodning i Anthropic Messages-formatet, som er det kald, Anthropic-SDK'et og Claude Code foretager.
Tælling er gratis. Et kald kræver din API-nøgle, tager intet fra din saldo og vises ikke i din forbrugslog.
Tæl en tekst
Send model og text. Teksten tælles, som den er, uden chatformatering omkring sig.
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
} Tallene i svarene på denne side er eksempler. Den samme tekst giver en anden tælling på en anden model.
Tæl en chatanmodning
Send model og messages, med tools, når anmodningen har dem, præcis som du ville sende dem til /v1/chat/completions. Svaret er størrelsen af hele inputtet.
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
} Felter i /v1/tokenize
| Felt | Type | Beskrivelse |
|---|---|---|
model | string | Påkrævet. Et id på en hostet open-weight-model. Store og små bogstaver behandles ens. |
text | string | En tekst, der tælles, som den er, uden chatformatering. Op til 4,000,000 bytes. Send text eller messages; når begge er til stede, tælles text. |
messages | array | Chatbeskeder i Chat Completions-formatet. De tælles som en anmodnings fulde input: hver besked med den formatering, som modellens chatskabelon lægger omkring den. |
tools | array | Værktøjsdefinitioner, der skal med i tællingen. Bruges sammen med messages. |
Svaret er et JSON-objekt med disse felter:
| Felt | Type | Beskrivelse |
|---|---|---|
model | string | Det model-id, tællingen blev foretaget for, i dets offentliggjorte stavemåde. |
tokens | integer | Med text: tekstens tokens. Med messages: tokens i hele inputtet, billeder inklusive. |
Tæl en Messages-anmodning
Send den body, du ville sende til /v1/messages: model, messages, og system og tools, når du bruger dem. De officielle Anthropic-SDK'er kalder dette endpoint 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
} Felter i /v1/messages/count_tokens
| Felt | Type | Beskrivelse |
|---|---|---|
model | string | Påkrævet. Et id på en hostet open-weight-model. |
messages | array | Påkrævet. Beskeder i Anthropic Messages-formatet. Blokkene text, image, tool_use og tool_result tælles. |
system | string | array | Systemprompten: en streng eller et array af tekstblokke. |
tools | array | Værktøjsdefinitioner med name, description og input_schema. |
Accepteret af hensyn til kompatibilitet, uden virkning på tællingen: tool_choice, max_tokens, temperature, top_p, stop_sequences, stream, thinking. Du kan sende body'en fra en reel anmodning uændret.
Svaret er et JSON-objekt med disse felter:
| Felt | Type | Beskrivelse |
|---|---|---|
input_tokens | integer | Tokens i hele inputtet: systemprompt, beskeder, værktøjer og billeder. |
Understøttede modeller
Begge endpoints tæller for de hostede open-weight-modeller. GET /v1/models opregner /v1/tokenize og /v1/messages/count_tokens i endpoints for hver model, der understøtter dem. Enhver anden model-værdi, Shannon-id'er inklusive, besvares 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
For en Shannon-model kan du læse token-tællingerne fra usage-objektet i et svar.
Hvordan tællingen foretages
Hver model tælles med sin egen tokenizer og sin egen chatskabelon. Der bruges intet skøn ud fra tegn eller ord.
| Hvad der tælles | Regel |
|---|---|
| En tekst | Strengens tokens, som den er sendt. En tom streng tæller 0. |
| Beskeder | Beskederne og værktøjerne lægges op med modellens egen chatskabelon, indtil det sted hvor svaret begynder, og hele den prompt tælles. |
| Roller | Beskeder med system, user, assistant og tool tælles. developer tælles som system. En besked uden indhold og uden værktøjskald tilføjer intet. |
| Værktøjskald og resultater | Værktøjskald fra tidligere assistent-ture og deres resultater indgår i tællingen, på begge endpoints. |
| Billeder | Et billede sendt inde i body'en (base64 eller en data:-URL) tilføjer én token per felt på 28 × 28 pixel: ceil(width / 28) × ceil(height / 28). Et billede angivet som en http(s)-URL downloades ikke af disse endpoints og tæller 1,024. |
Eksempel: et billede på 1,024 × 768 pixel tæller ceil(1024 / 28) × ceil(768 / 28) = 37 × 28 = 1,036 tokens.
Tællingen og hvad en anmodning afregnes for
Tællingen af en hel anmodning foretages på samme måde som inputtællingen af en reel anmodning med samme model, beskeder og værktøjer. Et svar melder det tal som usage.prompt_tokens på Chat Completions, som usage.input_tokens på Responses og som usage.input_tokens plus usage.cache_read_input_tokens på Messages.
- Tællingen er inputtet før rabatten for cached input. En reel anmodning kan læse en del af det input fra cachen og afregne den del til cachetaksten. Prompt-caching
- Et billede angivet som en
http(s)-URL tæller her 1,024. En reel anmodning downloader billedet og tæller det ud fra dets størrelse i pixel, så de to tal kan afvige. Send billedet som base64 for at få det samme tal. - Output er ikke en del af tællingen. Svaret på en reel anmodning afregnes som output-tokens oveni, ræsonnement inklusive.
- En
text-tælling har ingen chatformatering. Brug den til at måle et dokument eller en del af en prompt, ogmessages-formen til at måle en anmodning.
For at omsætte en tælling til en omkostning skal du gange den med modellens inputpris per 1M tokens. Modeller og priser
Grænser
| Grænse | Værdi | Over den |
|---|---|---|
Længden af text | 4,000,000 bytes (UTF-8) | 413 med beskeden text too long |
| Anmodningens body | 32 MiB | 413 |
| Per anmodning | Én tekst eller én samtale | Send én anmodning per tekst for at tælle flere tekster. |
Tællekald tælles ikke med i grænsen på 120 anmodninger per minut. Grænser og saldo
Fejl
| Status | Type | Besked | Hvornår |
|---|---|---|---|
400 | invalid_request_error | tokenize is available for the hosted open models; unknown model: <model> | /v1/tokenize med en model, der ikke er et id på en hostet open-weight-model. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <model> | /v1/messages/count_tokens med en model, der ikke er et id på en hostet open-weight-model, eller uden model. |
400 | invalid_request_error | send `text` or `messages` | /v1/tokenize hverken med text eller messages. |
401 | authentication_error | Missing authentication / Invalid API key | Der blev ikke sendt nogen nøgle, eller nøglen er ugyldig. |
413 | invalid_request_error | text too long | text er længere end 4,000,000 bytes. En body over 32 MiB besvares også med 413. |
415 | invalid_request_error | Expected request with `Content-Type: application/json` | Anmodningen har ingen JSON-indholdstype. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Et påkrævet felt mangler (model på /v1/tokenize, messages på /v1/messages/count_tokens), eller et felt har den forkerte type. |
503 | api_error | token counting is temporarily unavailable for this model | Tællingen kan ikke foretages for denne model i øjeblikket. Prøv igen senere. |
/v1/tokenize returnerer fejl i OpenAI-formen. På /v1/messages/count_tokens kommer endpointets egne fejl (400 for modellen, 503) i Anthropic-formen, og 401, 413, 415 og 422 kommer i OpenAI-formen. Læs først statuskoden, derefter error.type og error.message, som findes i begge former.
{
"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"
}
}