Tokenszámlálás
Számold meg egy szöveg vagy egy teljes kérés tokenjeit, mielőtt elküldöd.
POST https://api.shannon-ai.com/v1/tokenize
POST https://api.shannon-ai.com/v1/messages/count_tokens
Mindkét végpont a megnevezett modell tokenizerével számol, és nem fut modell. A hosztolt nyílt súlyú modelleket fedik le. A /v1/tokenize sima szöveget vagy Chat Completions beszélgetést fogad. A /v1/messages/count_tokens Anthropic Messages formátumú kérést fogad, ezt a hívást végzi az Anthropic SDK és a Claude Code.
A számlálás ingyenes. A híváshoz az API-kulcsod kell, nem von le semmit az egyenlegedből, és nem jelenik meg a használati naplódban.
Szöveg számlálása
Küldd a model és a text mezőt. A szöveget úgy számolja, ahogy van, chatformázás nélkül.
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
} Az oldal válaszaiban szereplő számok példák. Ugyanaz a szöveg más modellen más számot ad.
Chatkérés számlálása
Küldd a model és a messages mezőt, a tools mezővel, ha a kérés tartalmaz ilyet, pontosan úgy, ahogy a /v1/chat/completions végpontnak küldenéd. A válasz a teljes bemenet mérete.
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
} A /v1/tokenize mezői
| Mező | Típus | Leírás |
|---|---|---|
model | string | Kötelező. Hosztolt nyílt súlyú modell azonosítója. A kis- és nagybetűt egyformán kezeli. |
text | string | Egy szöveg, amelyet úgy számol, ahogy van, chatformázás nélkül. Legfeljebb 4,000,000 bájt. Küldj text vagy messages mezőt; ha mindkettő jelen van, a text számít. |
messages | array | Chatüzenetek Chat Completions formátumban. A kérés teljes bemeneteként számolja őket: minden üzenetet azzal a formázással, amelyet a modell chatsablonja köréje tesz. |
tools | array | A számlálásba bevonandó eszközdefiníciók. A messages mezővel együtt használatos. |
A válasz egy JSON-objektum ezekkel a mezőkkel:
| Mező | Típus | Leírás |
|---|---|---|
model | string | A modellazonosító, amelyre a számlálás készült, a közzétett írásmódjában. |
tokens | integer | text esetén: a szöveg tokenjei. messages esetén: a teljes bemenet tokenjei, a képeket is beleértve. |
Messages kérés számlálása
Küldd azt a törzset, amelyet a /v1/messages végpontnak küldenél: model, messages, és system meg tools, ha használod őket. A hivatalos Anthropic SDK-k ezt a végpontot a messages.count_tokens hívással érik el.
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
} A /v1/messages/count_tokens mezői
| Mező | Típus | Leírás |
|---|---|---|
model | string | Kötelező. Hosztolt nyílt súlyú modell azonosítója. |
messages | array | Kötelező. Az Anthropic Messages formátumú üzenetek. A text, image, tool_use és tool_result blokkokat számolja. |
system | string | array | A rendszerprompt: string vagy szövegblokkok tömbje. |
tools | array | Eszközdefiníciók name, description és input_schema mezővel. |
Kompatibilitás miatt elfogadott, a számlálásra gyakorolt hatás nélkül: tool_choice, max_tokens, temperature, top_p, stop_sequences, stream, thinking. Átadhatod egy valódi kérés törzsét változtatás nélkül.
A válasz egy JSON-objektum ezekkel a mezőkkel:
| Mező | Típus | Leírás |
|---|---|---|
input_tokens | integer | A teljes bemenet tokenjei: rendszerprompt, üzenetek, eszközök és képek. |
Támogatott modellek
Mindkét végpont a hosztolt nyílt súlyú modelleknél számol. A GET /v1/models a /v1/tokenize és a /v1/messages/count_tokens végpontot felsorolja minden olyan modell endpoints mezőjében, amely támogatja őket. Bármely más model értékre, a Shannon azonosítókat is beleértve, 400 a válasz.
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 modellnél a tokenszámokat a válasz usage objektumából olvasd.
Hogyan történik a számlálás
Minden modellt a saját tokenizerével és a saját chatsablonjával számol. Karakterekből vagy szavakból való becslést nem használ.
| Mit számol | Szabály |
|---|---|
| Szöveg | A string tokenjei úgy, ahogy elküldted. Az üres string 0-nak számít. |
| Üzenetek | Az üzeneteket és az eszközöket a modell saját chatsablonjával rendezi el, addig a pontig, ahol a válasz kezdődik, és az egész promptot megszámolja. |
| Szerepek | A system, user, assistant és tool üzeneteket számolja. A developer üzenetet system üzenetként számolja. A tartalom és eszközhívás nélküli üzenet nem ad hozzá semmit. |
| Eszközhívások és eredmények | A korábbi assistant fordulók eszközhívásai és azok eredményei mindkét végponton részei a számlálásnak. |
| Képek | A törzsben küldött kép (base64 vagy data: URL) 28 × 28 pixeles foltonként egy tokent ad hozzá: ceil(width / 28) × ceil(height / 28). Az http(s) URL-ként megadott képet ezek a végpontok nem töltik le, és 1,024-nek számítják. |
Példa: egy 1,024 × 768 pixeles kép ceil(1024 / 28) × ceil(768 / 28) = 37 × 28 = 1,036 tokennek számít.
A számlálás és az, hogy mit számláz egy kérés
Egy teljes kérés számlálása ugyanúgy történik, mint a valódi kérés bemeneti számlálása ugyanazzal a modellel, üzenetekkel és eszközökkel. A válasz ezt a számot a Chat Completions végponton usage.prompt_tokens, a Responses végponton usage.input_tokens, a Messages végponton pedig usage.input_tokens plusz usage.cache_read_input_tokens néven jelenti.
- A szám a gyorsítványos bemenet kedvezménye előtti bemenet. A valódi kérés ennek a bemenetnek egy részét gyorsítványból olvashatja, és azt a részt a gyorsítványos áron számlázhatja. Prompt gyorsítványozás
- Az
http(s)URL-ként megadott kép itt 1,024-nek számít. A valódi kérés letölti a képet, és a pixelmérete alapján számolja, így a két szám eltérhet. Küldd a képet base64 formában, hogy ugyanazt a számot kapd. - A kimenet nem része a számlálásnak. A valódi kérés válaszát ezen felül kimeneti tokenként számlázza, a gondolkodással együtt.
- A
textszámlálás nem tartalmaz chatformázást. Dokumentum vagy prompt egy részének mérésére használd, a kérés mérésére pedig amessagesformát.
Ha a számlálást költséggé akarod alakítani, szorozd meg a modell 1M tokenre vonatkozó bemeneti árával. Modellek és árak
Korlátok
| Korlát | Érték | Fölötte |
|---|---|---|
A text hossza | 4,000,000 bájt (UTF-8) | 413 a text too long üzenettel |
| Kérés törzse | 32 MiB | 413 |
| Kérésenként | Egy szöveg vagy egy beszélgetés | Több szöveg számlálásához szövegenként külön kérést küldj. |
A számláló hívások nem számítanak bele a percenkénti 120 kérés korlátjába. Korlátok és egyenleg
Hibák
| Státusz | Típus | Üzenet | Mikor |
|---|---|---|---|
400 | invalid_request_error | tokenize is available for the hosted open models; unknown model: <model> | A /v1/tokenize olyan model értékkel, amely nem hosztolt nyílt súlyú azonosító. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <model> | A /v1/messages/count_tokens olyan model értékkel, amely nem hosztolt nyílt súlyú azonosító, vagy model nélkül. |
400 | invalid_request_error | send `text` or `messages` | A /v1/tokenize text és messages nélkül. |
401 | authentication_error | Missing authentication / Invalid API key | Nem küldtél kulcsot, vagy a kulcs nem érvényes. |
413 | invalid_request_error | text too long | A text hosszabb 4,000,000 bájtnál. A 32 MiB feletti törzsre is 413 a válasz. |
415 | invalid_request_error | Expected request with `Content-Type: application/json` | A kérésnek nincs JSON tartalomtípusa. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Egy kötelező mező hiányzik (a /v1/tokenize végponton a model, a /v1/messages/count_tokens végponton a messages), vagy egy mező típusa hibás. |
503 | api_error | token counting is temporarily unavailable for this model | A számlálás ennél a modellnél pillanatnyilag nem végezhető el. Próbáld meg később. |
A /v1/tokenize a hibákat OpenAI formában adja. A /v1/messages/count_tokens végponton a végpont saját hibái (400 a modellre, 503) Anthropic formában érkeznek, a 401, 413, 415 és 422 pedig OpenAI formában. Előbb a státuszkódot olvasd, utána az error.type és error.message mezőt, amelyek mindkét formában jelen vannak.
{
"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"
}
}