Καταμέτρηση tokens
Μετρήστε τα tokens ενός κειμένου ή ενός ολόκληρου αιτήματος πριν το στείλετε.
POST https://api.shannon-ai.com/v1/tokenize
POST https://api.shannon-ai.com/v1/messages/count_tokens
Και τα δύο endpoints μετρούν με τον tokenizer του μοντέλου που ονομάζετε, και δεν τρέχει κανένα μοντέλο. Καλύπτουν τα φιλοξενούμενα μοντέλα ανοιχτών βαρών. Το /v1/tokenize δέχεται απλό κείμενο ή μια συνομιλία Chat Completions. Το /v1/messages/count_tokens δέχεται αίτημα στη μορφή Anthropic Messages, που είναι η κλήση που κάνουν το SDK της Anthropic και το Claude Code.
Η μέτρηση είναι δωρεάν. Μια κλήση χρειάζεται το κλειδί API σας, δεν αφαιρεί τίποτα από το υπόλοιπό σας και δεν εμφανίζεται στο ιστορικό χρήσης σας.
Μέτρηση ενός κειμένου
Στείλτε model και text. Το κείμενο μετράται ως έχει, χωρίς μορφοποίηση chat γύρω του.
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
} Οι αριθμοί στις απαντήσεις αυτής της σελίδας είναι παραδείγματα. Το ίδιο κείμενο δίνει διαφορετική μέτρηση σε διαφορετικό μοντέλο.
Μέτρηση ενός αιτήματος chat
Στείλτε model και messages, με tools όταν το αίτημα τα έχει, ακριβώς όπως θα τα στέλνατε στο /v1/chat/completions. Η απάντηση είναι το μέγεθος ολόκληρης της εισόδου.
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
} Πεδία του /v1/tokenize
| Πεδίο | Τύπος | Περιγραφή |
|---|---|---|
model | string | Υποχρεωτικό. Ένα id φιλοξενούμενου μοντέλου ανοιχτών βαρών. Τα πεζά και τα κεφαλαία αντιμετωπίζονται το ίδιο. |
text | string | Ένα κείμενο που μετράται ως έχει, χωρίς μορφοποίηση chat. Έως 4,000,000 bytes. Στείλτε text ή messages· όταν υπάρχουν και τα δύο, μετράται το text. |
messages | array | Μηνύματα chat στη μορφή Chat Completions. Μετρώνται ως η πλήρης είσοδος ενός αιτήματος: κάθε μήνυμα με τη μορφοποίηση που βάζει γύρω του το πρότυπο chat του μοντέλου. |
tools | array | Ορισμοί εργαλείων που θα συμπεριληφθούν στη μέτρηση. Χρησιμοποιούνται μαζί με το messages. |
Η απάντηση είναι αντικείμενο JSON με αυτά τα πεδία:
| Πεδίο | Τύπος | Περιγραφή |
|---|---|---|
model | string | Το id μοντέλου για το οποίο έγινε η μέτρηση, στη δημοσιευμένη γραφή του. |
tokens | integer | Με text: τα tokens του κειμένου. Με messages: τα tokens ολόκληρης της εισόδου, με τις εικόνες. |
Μέτρηση ενός αιτήματος Messages
Στείλτε το σώμα που θα στέλνατε στο /v1/messages: model, messages, και system και tools όταν τα χρησιμοποιείτε. Τα επίσημα SDK της Anthropic καλούν αυτό το endpoint μέσω του 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
} Πεδία αιτήματος του endpoint /v1/messages/count_tokens
| Πεδίο | Τύπος | Περιγραφή |
|---|---|---|
model | string | Υποχρεωτικό. Ένα id φιλοξενούμενου μοντέλου ανοιχτών βαρών. |
messages | array | Υποχρεωτικό. Μηνύματα στη μορφή Anthropic Messages. Μετρώνται τα blocks text, image, tool_use και tool_result. |
system | string | array | Το system prompt: string ή πίνακας από blocks κειμένου. |
tools | array | Ορισμοί εργαλείων με name, description και input_schema. |
Γίνονται δεκτά για συμβατότητα, χωρίς επίδραση στη μέτρηση: tool_choice, max_tokens, temperature, top_p, stop_sequences, stream, thinking. Μπορείτε να περάσετε το σώμα ενός πραγματικού αιτήματος αμετάβλητο.
Η απάντηση είναι αντικείμενο JSON με αυτά τα πεδία:
| Πεδίο | Τύπος | Περιγραφή |
|---|---|---|
input_tokens | integer | Τα tokens ολόκληρης της εισόδου: system prompt, μηνύματα, εργαλεία και εικόνες. |
Υποστηριζόμενα μοντέλα
Και τα δύο endpoints μετρούν για τα φιλοξενούμενα μοντέλα ανοιχτών βαρών. Το GET /v1/models απαριθμεί τα /v1/tokenize και /v1/messages/count_tokens στα endpoints κάθε μοντέλου που τα υποστηρίζει. Οποιαδήποτε άλλη τιμή model, και τα ids Shannon, απαντάται με 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
Για ένα μοντέλο Shannon, διαβάστε τον αριθμό tokens από το αντικείμενο usage μιας απάντησης.
Πώς γίνεται η μέτρηση
Κάθε μοντέλο μετράται με τον δικό του tokenizer και το δικό του πρότυπο chat. Δεν χρησιμοποιείται εκτίμηση από χαρακτήρες ή λέξεις.
| Τι μετράται | Κανόνας |
|---|---|
| Ένα κείμενο | Τα tokens του string όπως στάλθηκε. Ένα κενό string μετρά 0. |
| Μηνύματα | Τα μηνύματα και τα εργαλεία τοποθετούνται με το δικό του πρότυπο chat του μοντέλου, μέχρι το σημείο όπου αρχίζει η απάντηση, και μετράται ολόκληρο αυτό το prompt. |
| Ρόλοι | Μετρώνται τα μηνύματα system, user, assistant και tool. Το developer μετράται ως system. Ένα μήνυμα χωρίς περιεχόμενο και χωρίς κλήση εργαλείου δεν προσθέτει τίποτα. |
| Κλήσεις και αποτελέσματα εργαλείων | Οι κλήσεις εργαλείων προηγούμενων γύρων του assistant και τα αποτελέσματά τους είναι μέρος της μέτρησης, και στα δύο endpoints. |
| Εικόνες | Μια εικόνα που στέλνεται μέσα στο σώμα (base64 ή data: URL) προσθέτει ένα token ανά τμήμα 28 × 28 pixel: ceil(width / 28) × ceil(height / 28). Μια εικόνα που δίνεται ως URL http(s) δεν κατεβαίνει από αυτά τα endpoints και μετρά 1,024. |
Παράδειγμα: μια εικόνα 1,024 × 768 pixels μετρά ceil(1024 / 28) × ceil(768 / 28) = 37 × 28 = 1,036 tokens.
Η μέτρηση και τι χρεώνεται ένα αίτημα
Η μέτρηση ολόκληρου αιτήματος γίνεται με τον ίδιο τρόπο όπως η μέτρηση εισόδου ενός πραγματικού αιτήματος με το ίδιο μοντέλο, μηνύματα και εργαλεία. Μια απάντηση αναφέρει αυτόν τον αριθμό ως usage.prompt_tokens στα Chat Completions, ως usage.input_tokens στο Responses, και ως usage.input_tokens συν usage.cache_read_input_tokens στο Messages.
- Η μέτρηση είναι η είσοδος πριν από την έκπτωση της cached εισόδου. Ένα πραγματικό αίτημα μπορεί να διαβάσει μέρος αυτής της εισόδου από το cache και να χρεώσει εκείνο το μέρος με την τιμή cached. Caching ερωτημάτων
- Μια εικόνα που δίνεται ως URL
http(s)μετρά εδώ 1,024. Ένα πραγματικό αίτημα κατεβάζει την εικόνα και τη μετρά από το μέγεθός της σε pixels, οπότε οι δύο αριθμοί μπορεί να διαφέρουν. Στείλτε την εικόνα ως base64 για να πάρετε τον ίδιο αριθμό. - Η έξοδος δεν ανήκει στη μέτρηση. Η απάντηση ενός πραγματικού αιτήματος χρεώνεται επιπλέον ως tokens εξόδου, με τον συλλογισμό συμπεριλαμβανόμενο.
- Η μέτρηση
textδεν έχει μορφοποίηση chat. Χρησιμοποιήστε την για να μετρήσετε ένα έγγραφο ή ένα τμήμα prompt, και τη μορφήmessagesγια να μετρήσετε ένα αίτημα.
Για να μετατρέψετε μια μέτρηση σε κόστος, πολλαπλασιάστε την με την τιμή εισόδου του μοντέλου ανά 1M tokens. Μοντέλα & τιμές
Όρια
| Όριο | Τιμή | Πάνω από αυτό |
|---|---|---|
Μήκος του text | 4,000,000 bytes (UTF-8) | 413 με το μήνυμα text too long |
| Σώμα αιτήματος | 32 MiB | 413 |
| Ανά αίτημα | Ένα κείμενο ή μία συνομιλία | Για να μετρήσετε πολλά κείμενα, στείλτε ένα αίτημα ανά κείμενο. |
Οι κλήσεις μέτρησης δεν προσμετρώνται στο όριο των 120 αιτημάτων ανά λεπτό. Όρια και υπόλοιπο
Σφάλματα
| Κατάσταση | Τύπος | Μήνυμα | Πότε |
|---|---|---|---|
400 | invalid_request_error | tokenize is available for the hosted open models; unknown model: <model> | Το /v1/tokenize με model που δεν είναι id φιλοξενούμενου μοντέλου ανοιχτών βαρών. |
400 | invalid_request_error | count_tokens is available for the hosted open models; unknown model: <model> | Το /v1/messages/count_tokens με model που δεν είναι id φιλοξενούμενου μοντέλου ανοιχτών βαρών, ή χωρίς model. |
400 | invalid_request_error | send `text` or `messages` | Το /v1/tokenize χωρίς text και χωρίς messages. |
401 | authentication_error | Missing authentication / Invalid API key | Δεν στάλθηκε κλειδί, ή το κλειδί δεν είναι έγκυρο. |
413 | invalid_request_error | text too long | Το text είναι μεγαλύτερο από 4,000,000 bytes. Ένα σώμα πάνω από 32 MiB απαντάται επίσης με 413. |
415 | invalid_request_error | Expected request with `Content-Type: application/json` | Το αίτημα δεν έχει τύπο περιεχομένου JSON. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Λείπει ένα υποχρεωτικό πεδίο (model στο /v1/tokenize, messages στο /v1/messages/count_tokens) ή ένα πεδίο έχει λάθος τύπο. |
503 | api_error | token counting is temporarily unavailable for this model | Η μέτρηση δεν μπορεί να γίνει για αυτό το μοντέλο αυτή τη στιγμή. Δοκιμάστε ξανά αργότερα. |
Το /v1/tokenize επιστρέφει σφάλματα στη μορφή OpenAI. Στο /v1/messages/count_tokens τα σφάλματα του ίδιου του endpoint (400 για το μοντέλο, 503) έρχονται στη μορφή Anthropic, και τα 401, 413, 415 και 422 έρχονται στη μορφή OpenAI. Διαβάστε πρώτα τον κωδικό κατάστασης, και μετά τα error.type και error.message, που υπάρχουν και στις δύο μορφές.
{
"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"
}
}