Pengiraan token
Kira token bagi teks atau seluruh permintaan sebelum anda menghantarnya.
POST https://api.shannon-ai.com/v1/tokenize
POST https://api.shannon-ai.com/v1/messages/count_tokens
Kedua-dua endpoint mengira dengan tokenizer model yang anda namakan, dan tiada model dijalankan. Ia meliputi model open-weight yang dihoskan. /v1/tokenize menerima teks biasa atau perbualan Chat Completions. /v1/messages/count_tokens menerima permintaan dalam format Anthropic Messages, iaitu panggilan yang dibuat oleh SDK Anthropic dan Claude Code.
Pengiraan adalah percuma. Panggilan memerlukan kunci API anda, tidak mengambil apa-apa daripada baki anda dan tidak muncul dalam log penggunaan anda.
Kira teks
Hantar model dan text. Teks dikira seadanya, tanpa pemformatan sembang di sekelilingnya.
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
} Nombor dalam balasan pada halaman ini ialah contoh. Teks yang sama memberikan kiraan yang berbeza pada model yang berbeza.
Kira permintaan sembang
Hantar model dan messages, dengan tools apabila permintaan mempunyainya, tepat seperti yang anda hantar kepada /v1/chat/completions. Balasan ialah saiz seluruh input.
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
} Medan /v1/tokenize
| Medan | Jenis | Penerangan |
|---|---|---|
model | string | Wajib. Id model open-weight yang dihoskan. Huruf besar dan kecil dilayan sama. |
text | string | Teks untuk dikira seadanya, tanpa pemformatan sembang. Sehingga 4,000,000 bait. Hantar text atau messages; apabila kedua-duanya ada, text yang dikira. |
messages | array | Mesej sembang dalam format Chat Completions. Ia dikira sebagai input penuh sesuatu permintaan: setiap mesej dengan pemformatan yang diletakkan oleh templat sembang model di sekelilingnya. |
tools | array | Takrifan alat untuk dimasukkan dalam kiraan. Digunakan bersama messages. |
Balasan ialah objek JSON dengan medan berikut:
| Medan | Jenis | Penerangan |
|---|---|---|
model | string | Id model yang kiraan dibuat untuknya, dalam ejaan yang diterbitkan. |
tokens | integer | Dengan text: token bagi teks itu. Dengan messages: token bagi seluruh input, termasuk imej. |
Kira permintaan Messages
Hantar badan yang akan anda hantar kepada /v1/messages: model, messages, dan system serta tools apabila anda menggunakannya. SDK Anthropic rasmi memanggil endpoint ini melalui 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
} Medan /v1/messages/count_tokens
| Medan | Jenis | Penerangan |
|---|---|---|
model | string | Wajib. Id model open-weight yang dihoskan. |
messages | array | Wajib. Mesej dalam format Anthropic Messages. Blok text, image, tool_use dan tool_result dikira. |
system | string | array | System prompt: rentetan atau tatasusunan blok teks. |
tools | array | Takrifan alat dengan name, description dan input_schema. |
Diterima untuk keserasian, tanpa kesan pada kiraan: tool_choice, max_tokens, temperature, top_p, stop_sequences, stream, thinking. Anda boleh menghantar badan permintaan sebenar tanpa perubahan.
Balasan ialah objek JSON dengan medan berikut:
| Medan | Jenis | Penerangan |
|---|---|---|
input_tokens | integer | Token seluruh input: system prompt, mesej, alat dan imej. |
Model yang disokong
Kedua-dua endpoint mengira untuk model open-weight yang dihoskan. GET /v1/models menyenaraikan /v1/tokenize dan /v1/messages/count_tokens dalam endpoints bagi setiap model yang menyokongnya. Sebarang nilai model lain, termasuk id Shannon, dijawab dengan 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
Bagi model Shannon, baca bilangan token daripada objek usage dalam balasan.
Cara kiraan dibuat
Setiap model dikira dengan tokenizernya sendiri dan templat sembangnya sendiri. Tiada anggaran daripada aksara atau perkataan digunakan.
| Apa yang dikira | Peraturan |
|---|---|
| Teks | Token bagi rentetan seperti yang dihantar. Rentetan kosong dikira 0. |
| Mesej | Mesej dan alat disusun dengan templat sembang model itu sendiri, sehingga titik balasan bermula, dan seluruh prompt itu dikira. |
| Peranan | Mesej system, user, assistant dan tool dikira. developer dikira sebagai system. Mesej tanpa kandungan dan tanpa panggilan alat tidak menambah apa-apa. |
| Panggilan alat dan keputusan | Panggilan alat daripada giliran assistant terdahulu dan keputusannya menjadi sebahagian daripada kiraan, pada kedua-dua endpoint. |
| Imej | Imej yang dihantar di dalam badan (base64 atau URL data:) menambah satu token bagi setiap petak piksel 28 × 28: ceil(width / 28) × ceil(height / 28). Imej yang diberikan sebagai URL http(s) tidak dimuat turun oleh endpoint ini dan dikira 1,024. |
Contoh: imej 1,024 × 768 piksel dikira ceil(1024 / 28) × ceil(768 / 28) = 37 × 28 = 1,036 token.
Kiraan dan apa yang dicaj pada permintaan
Kiraan seluruh permintaan dibuat dengan cara yang sama seperti kiraan input permintaan sebenar dengan model, mesej dan alat yang sama. Balasan melaporkan nombor itu sebagai usage.prompt_tokens pada Chat Completions, sebagai usage.input_tokens pada Responses, dan sebagai usage.input_tokens campur usage.cache_read_input_tokens pada Messages.
- Kiraan ialah input sebelum diskaun input cached. Permintaan sebenar mungkin membaca sebahagian input itu daripada cache dan membilkan bahagian itu pada kadar cached. Caching prompt
- Imej yang diberikan sebagai URL
http(s)dikira 1,024 di sini. Permintaan sebenar memuat turun imej dan mengiranya daripada saiznya dalam piksel, jadi kedua-dua nombor boleh berbeza. Hantar imej sebagai base64 untuk mendapat nombor yang sama. - Output bukan sebahagian daripada kiraan. Balasan permintaan sebenar dibilkan sebagai token output di atasnya, termasuk penaakulan.
- Kiraan
texttidak mempunyai pemformatan sembang. Gunakannya untuk mengukur dokumen atau bahagian prompt, dan bentukmessagesuntuk mengukur permintaan.
Untuk menukar kiraan kepada kos, darabkannya dengan harga input model bagi setiap 1M token. Model & harga
Had
| Had | Nilai | Melebihinya |
|---|---|---|
Panjang text | 4,000,000 bait (UTF-8) | 413 dengan mesej text too long |
| Badan permintaan | 32 MiB | 413 |
| Bagi setiap permintaan | Satu teks atau satu perbualan | Hantar satu permintaan bagi setiap teks untuk mengira beberapa teks. |
Panggilan pengiraan tidak dikira dalam had 120 permintaan seminit. Had dan baki
Ralat
| Status | Jenis | Mesej | Bila |
|---|---|---|---|
400 | invalid_request_error | tokenize is available for the hosted open models; unknown model: <model> | /v1/tokenize dengan model yang bukan id open-weight yang dihoskan. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <model> | /v1/messages/count_tokens dengan model yang bukan id open-weight yang dihoskan, atau tanpa model. |
400 | invalid_request_error | send `text` or `messages` | /v1/tokenize tanpa text mahupun messages. |
401 | authentication_error | Missing authentication / Invalid API key | Tiada kunci dihantar, atau kunci tidak sah. |
413 | invalid_request_error | text too long | text lebih panjang daripada 4,000,000 bait. Badan melebihi 32 MiB juga dijawab dengan 413. |
415 | invalid_request_error | Expected request with `Content-Type: application/json` | Permintaan tidak mempunyai jenis kandungan JSON. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Medan wajib tiada (model pada /v1/tokenize, messages pada /v1/messages/count_tokens) atau sesuatu medan mempunyai jenis yang salah. |
503 | api_error | token counting is temporarily unavailable for this model | Kiraan tidak dapat dibuat untuk model ini buat masa ini. Cuba lagi kemudian. |
/v1/tokenize memulangkan ralat dalam bentuk OpenAI. Pada /v1/messages/count_tokens, ralat endpoint itu sendiri (400 untuk model, 503) datang dalam bentuk Anthropic, dan 401, 413, 415 serta 422 datang dalam bentuk OpenAI. Baca kod status dahulu, kemudian error.type dan error.message, yang wujud dalam kedua-dua bentuk.
{
"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"
}
}