Penghitungan token
Hitung token suatu teks atau seluruh permintaan sebelum Anda mengirimnya.
POST https://api.shannon-ai.com/v1/tokenize
POST https://api.shannon-ai.com/v1/messages/count_tokens
Kedua endpoint menghitung dengan tokenizer model yang Anda sebut, tanpa menjalankan model. Keduanya mencakup model open-weight hosted. /v1/tokenize menerima teks biasa atau percakapan Chat Completions. /v1/messages/count_tokens menerima permintaan dalam format Anthropic Messages, yaitu panggilan yang dibuat SDK Anthropic dan Claude Code.
Penghitungan gratis. Panggilan memerlukan kunci API Anda, tidak mengambil apa pun dari saldo Anda, dan tidak muncul di log penggunaan Anda.
Hitung sebuah teks
Kirim model dan text. Teks dihitung apa adanya, tanpa pemformatan chat di sekitarnya.
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
} Angka dalam balasan di halaman ini adalah contoh. Teks yang sama memberi hitungan berbeda pada model yang berbeda.
Hitung permintaan chat
Kirim model dan messages, dengan tools jika permintaan memilikinya, persis seperti yang Anda kirim ke /v1/chat/completions. Balasannya adalah ukuran 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
} Field /v1/tokenize
| Field | Tipe | Deskripsi |
|---|---|---|
model | string | Wajib. Id model open-weight hosted. Huruf besar dan kecil diperlakukan sama. |
text | string | Teks yang dihitung apa adanya, tanpa pemformatan chat. Hingga 4,000,000 byte. Kirim text atau messages; jika keduanya ada, text yang dihitung. |
messages | array | Pesan chat dalam format Chat Completions. Pesan dihitung sebagai input lengkap suatu permintaan: setiap pesan dengan pemformatan yang ditambahkan chat template model di sekelilingnya. |
tools | array | Definisi tool yang disertakan dalam hitungan. Dipakai bersama messages. |
Balasan adalah objek JSON dengan field berikut:
| Field | Tipe | Deskripsi |
|---|---|---|
model | string | Id model yang untuknya hitungan dibuat, dengan ejaan yang dipublikasikan. |
tokens | integer | Dengan text: token dari teks. Dengan messages: token dari seluruh input, termasuk gambar. |
Hitung permintaan Messages
Kirim body yang akan Anda kirim ke /v1/messages: model, messages, serta system dan tools jika Anda memakainya. SDK Anthropic resmi 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
} Field /v1/messages/count_tokens
| Field | Tipe | Deskripsi |
|---|---|---|
model | string | Wajib. Id model open-weight hosted. |
messages | array | Wajib. Pesan dalam format Anthropic Messages. Blok text, image, tool_use, dan tool_result dihitung. |
system | string | array | System prompt: string atau array blok teks. |
tools | array | Definisi tool dengan name, description, dan input_schema. |
Diterima demi kompatibilitas, tanpa efek pada hitungan: tool_choice, max_tokens, temperature, top_p, stop_sequences, stream, thinking. Anda dapat meneruskan body permintaan nyata tanpa perubahan.
Balasan adalah objek JSON dengan field berikut:
| Field | Tipe | Deskripsi |
|---|---|---|
input_tokens | integer | Token dari seluruh input: system prompt, pesan, tool, dan gambar. |
Model yang didukung
Kedua endpoint menghitung untuk model open-weight hosted. GET /v1/models mencantumkan /v1/tokenize dan /v1/messages/count_tokens di endpoints setiap model yang mendukungnya. 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
Untuk model Shannon, baca jumlah token dari objek usage pada balasan.
Cara penghitungan dilakukan
Setiap model dihitung dengan tokenizer dan chat template miliknya sendiri. Tidak ada perkiraan dari karakter atau kata yang dipakai.
| Apa yang dihitung | Aturan |
|---|---|
| Sebuah teks | Token dari string sebagaimana dikirim. String kosong dihitung 0. |
| Pesan | Pesan dan tool disusun dengan chat template milik model sendiri, sampai titik ketika balasan dimulai, dan seluruh prompt itu dihitung. |
| Role | Pesan system, user, assistant, dan tool dihitung. developer dihitung sebagai system. Pesan tanpa konten dan tanpa pemanggilan tool tidak menambah apa pun. |
| Pemanggilan tool dan hasilnya | Pemanggilan tool dari giliran assistant sebelumnya beserta hasilnya menjadi bagian dari hitungan, pada kedua endpoint. |
| Gambar | Gambar yang dikirim di dalam body (base64 atau URL data:) menambahkan satu token per patch 28 × 28 piksel: ceil(width / 28) × ceil(height / 28). Gambar yang diberikan sebagai URL http(s) tidak diunduh oleh endpoint ini dan dihitung 1,024. |
Contoh: gambar 1,024 × 768 piksel dihitung ceil(1024 / 28) × ceil(768 / 28) = 37 × 28 = 1,036 token.
Hitungan dan apa yang ditagih pada permintaan
Penghitungan seluruh permintaan dilakukan dengan cara yang sama seperti penghitungan input permintaan nyata dengan model, pesan, dan tool yang sama. Balasan melaporkan angka itu sebagai usage.prompt_tokens pada Chat Completions, sebagai usage.input_tokens pada Responses, dan sebagai usage.input_tokens ditambah usage.cache_read_input_tokens pada Messages.
- Hitungannya adalah input sebelum diskon input ter-cache. Permintaan nyata dapat membaca sebagian input itu dari cache dan menagih bagian itu dengan tarif cache. Prompt caching
- Gambar yang diberikan sebagai URL
http(s)dihitung 1,024 di sini. Permintaan nyata mengunduh gambar dan menghitungnya dari ukuran pikselnya, sehingga kedua angka bisa berbeda. Kirim gambar sebagai base64 untuk mendapatkan angka yang sama. - Output bukan bagian dari hitungan. Balasan permintaan nyata ditagih sebagai token output tambahan, termasuk penalaran.
- Hitungan
texttidak memiliki pemformatan chat. Gunakan untuk mengukur dokumen atau bagian prompt, dan bentukmessagesuntuk mengukur permintaan.
Untuk mengubah hitungan menjadi biaya, kalikan dengan harga input model per 1M token. Model & harga
Batas
| Batas | Nilai | Di atasnya |
|---|---|---|
Panjang text | 4,000,000 byte (UTF-8) | 413 dengan pesan text too long |
| Body permintaan | 32 MiB | 413 |
| Per permintaan | Satu teks atau satu percakapan | Kirim satu permintaan per teks untuk menghitung beberapa teks. |
Panggilan penghitungan tidak dihitung dalam batas 120 permintaan per menit. Batas dan saldo
Error
| Status | Tipe | Pesan | Kapan |
|---|---|---|---|
400 | invalid_request_error | tokenize is available for the hosted open models; unknown model: <model> | /v1/tokenize dengan model yang bukan id open-weight hosted. |
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 hosted, atau tanpa model. |
400 | invalid_request_error | send `text` or `messages` | /v1/tokenize tanpa text maupun messages. |
401 | authentication_error | Missing authentication / Invalid API key | Kunci tidak dikirim, atau kunci tidak valid. |
413 | invalid_request_error | text too long | text lebih panjang dari 4,000,000 byte. Body di atas 32 MiB juga dijawab dengan 413. |
415 | invalid_request_error | Expected request with `Content-Type: application/json` | Permintaan tidak memiliki content type JSON. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Field wajib hilang (model pada /v1/tokenize, messages pada /v1/messages/count_tokens) atau sebuah field bertipe salah. |
503 | api_error | token counting is temporarily unavailable for this model | Penghitungan tidak dapat dilakukan untuk model ini saat ini. Coba lagi nanti. |
/v1/tokenize mengembalikan error dalam bentuk OpenAI. Pada /v1/messages/count_tokens, error dari endpoint itu sendiri (400 untuk model, 503) datang dalam bentuk Anthropic, dan 401, 413, 415, serta 422 datang dalam bentuk OpenAI. Baca kode status lebih dulu, lalu error.type dan error.message, yang ada di kedua 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"
}
}