Назад до блогу

Оптимізація витратПосібник

Порахуйте токени перед надсиланням запиту: tiktoken у Python

Оцініть кількість токенів запиту офлайн за допомогою tiktoken, перевірте її щодо контекстного вікна, оцініть вартість і порівняйте з полем usage від API.

Автор: CheapTokens TeamОпубліковано 4 хв читання

Термінал із pip install tiktoken і підрахунком токенів в один рядок
На цій сторінці
  1. П'ять рядків, що рахують токени
  2. Чи вміщується запит у вікно?
  3. Скільки це коштуватиме?
  4. Порівняйте оцінку з використанням

Ви можете порахувати токени запиту на власній машині ще до його надсилання: встановіть tiktoken, закодуйте текст, візьміть len() від результату. tiktoken — це токенізатор OpenAI, тому для моделей DeepSeek, GLM і MiniMax це число є оцінкою. Справжнє значення повертається в usage.prompt_tokens після першого виклику, і порівняти ці два числа — це ще один рядок.

Навіщо це робити? Бо і рахунок, і помилки починаються з розміру вхідних даних. Вставте довгий контракт у скрипт — і ви дізнаєтеся, що він завеликий, лише коли API відповість 400. Запустіть пакет із п'яти тисяч листів — і дізнаєтеся, скільки це коштувало, лише коли баланс зменшиться. Попередній підрахунок перетворює обидві несподіванки на число, яке можна прочитати заздалегідь.

П'ять рядків, що рахують токени#

README tiktoken (перевірено 1 листопада 2026) показує всю ідею: виберіть кодування, закодуйте текст, і довжина списку — це кількість токенів.

bash
pip install tiktoken
python
import tiktoken

enc = tiktoken.get_encoding('o200k_base')
text = 'Hello world'
tokens = enc.encode(text)
print(len(tokens))  # how many tokens the text is
П'ять рядків у файлі estimate.py
Весь лічильник: get_encoding, encode, len.

enc.decode(tokens) повертає оригінальний текст — зручна перевірка, що ви дивитеся на той самий текст, який побачить модель. README також згадує tiktoken.encoding_for_model('gpt-4o'), який вибирає токенізатор для конкретної моделі OpenAI. Ось у чому річ, яку варто запам'ятати: токенізатори належать до родин моделей. Емпіричне правило з README — приблизно чотири байти тексту на токен, і воно описує лише токенізатори OpenAI.

То що робити для моделі DeepSeek? Використовуйте той самий підрахунок як робочу оцінку й відкалібруйте його, як показано нижче.

Вгадайте число

Приблизно скільки токенів у англійському тексті з 2 000 символів?

Показати відповідь

Відповідь: 500

Близько 500. За емпіричним правилом із README — чотири байти на токен, а звичайний англійський текст — приблизно один байт на символ, тож 2 000 ÷ 4 = 500. Інші мови та емодзі займають більше байтів на символ, тому ті самі 2 000 символів за цим правилом зазвичай означають більше токенів.

Чи вміщується запит у вікно?#

Кожна модель має контекстне вікно, і ваші вхідні дані разом із дозволеною відповіддю мають у нього вміститися. Вікна для моделей, які ми обслуговуємо: DeepSeek-V4-Flash 380K, GLM-5.3-Flash 390K, MiniMax-M2.7 180K токенів. Найдовша відповідь — 32 768 токенів для DeepSeek-V4-Flash і 8 192 для двох інших (список моделей CheapTokens, 1 листопада 2026).

Перевірка перед викликом — це чотири рядки:

python
CONTEXT = {
    'deepseek-ai/DeepSeek-V4-Flash-0731': 380_000,
    'zai-org/GLM-5.3-Flash': 390_000,
    'MiniMaxAI/MiniMax-M2.7': 180_000,
}

def fits(prompt_tokens, max_tokens, model):
    return prompt_tokens + max_tokens <= CONTEXT[model]

Скажімо, у вас документ на 250 000 токенів. fits(250_000, 8_192, 'MiniMaxAI/MiniMax-M2.7') дорівнює False, тож ви спрямовуєте це завдання на модель із більшим вікном або розбиваєте документ, і 400 більше не трапляється. fits(250_000, 8_192, 'deepseek-ai/DeepSeek-V4-Flash-0731') дорівнює True. Якщо хочете повну історію про те, як виглядає помилка, request too long: 400 vs 413, context window and max_tokens розбирає це.

Скільки це коштуватиме?#

Тепер бюджет. Візьміть один типовий елемент, порахуйте його й помножте. Припустімо, ви класифікуєте 5 000 листів із замовленнями. Ви рахуєте один репрезентативний лист і отримуєте близько 800 вхідних токенів, а мітку й коротке пояснення обмежуєте 200 вихідними токенами. Підсумки: 5 000 × 800 = 4 000 000 вхідних токенів і 5 000 × 200 = 1 000 000 вихідних токенів.

Таблиця нижче оцінює саме таке навантаження за актуальними цінами, з урахуванням вхідних і вихідних токенів разом:

Модель За запит 5 000 запитів OpenRouter, 5 000 запитів
GLM-5.3-Flash $0.000024 $0.12 $0.217
DeepSeek-V4-Flash $0.000032 $0.16 $0.42
MiniMax-M2.7 $0.00007 $0.35 $4.20

800 вхідних і 200 вихідних токенів на запит. Ціни за 1 млн токенів актуальні та змінюються разом із нашими тарифами; стовпець OpenRouter показує довідкові ціни для того самого навантаження.

Загалом, з урахуванням вхідних і вихідних токенів разом, стовпець CheapTokens дешевший за OpenRouter для цих моделей. Змініть три числа на власні підрахунки — і матимете бюджет ще до першого запиту. Про різницю між двома частинами рахунку дивіться input vs output tokens: what an AI API bills you for, а реальні виміряні приклади — how many tokens an API request uses. Актуальні ціни завжди на сторінці цін.

Потік оцінювання від тексту до реальної кількості використання
Оцініть офлайн, перевірте вікно, надішліть, потім порівняйте з usage.

Порівняйте оцінку з використанням#

Оцінка — це здогад про чужий токенізатор, тож звірте її один раз із відповідями. Кожна відповідь містить поле usage, а usage.prompt_tokens — це те, що API порахував для ваших вхідних даних. Поставте ці два числа поруч і поділіть.

Крок за кроком

Запустіть порівняння

Налаштування

Встановіть пакети й покладіть ключ у змінну середовища. Ніколи не вставляйте його в скрипт.

bash
pip install tiktoken openai
export CHEAPTOKENS_API_KEY='your-key-here'

Запустіть скрипт

Збережіть це як compare.py. Він рахує локально, надсилає запит до https://api.cheaptokens.dev/v1 і виводить обидва числа. Ідентифікатор моделі — повний, зі списку моделей CheapTokens, оскільки скорочені назви не приймаються.

python
import os
import tiktoken
from openai import OpenAI

MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'
enc = tiktoken.get_encoding('o200k_base')
messages = [{'role': 'user',
             'content': 'Classify this email as order, refund or other: Hi, my parcel from last Tuesday has not arrived yet.'}]

estimate = sum(len(enc.encode(m['content'])) for m in messages)

client = OpenAI(base_url='https://api.cheaptokens.dev/v1',
                api_key=os.environ['CHEAPTOKENS_API_KEY'])
r = client.chat.completions.create(model=MODEL, messages=messages, max_tokens=200)

real = r.usage.prompt_tokens
print(f'estimate {estimate}, usage.prompt_tokens {real}, ratio {real / estimate:.2f}')

Прочитайте розбіжність

Останній рядок виводить три числа. Скажімо, він показує estimate 24, usage.prompt_tokens 31, ratio 1.29. Тоді множте свої майбутні оцінки на це співвідношення перед складанням бюджету. Справжній запит також обгортається у формат чату, тож реальний підрахунок може вийти трохи більшим за оцінку для простого тексту. Запустіть це на кількох типових запитах, а не на одному, і використовуйте середнє співвідношення.

Відтоді routine така: оцініть локально, перевірте вікно, застосуйте своє співвідношення до бюджету й дозвольте usage у кожній відповіді тримати вас у курсі. Якщо вам також потрібен накопичувальний підсумок за все завдання, track AI agent token cost in Python будує це на тому самому полі. Новачок у самому підключенні? Your first API request with CheapTokens розповідає про це, а решта — у документації.

З'єднайте пари

Зіставте кожну назву з тим, що вона вам каже

  • len(enc.encode(text))Ваша локальна оцінка розміру вхідних даних
  • usage.prompt_tokensРозмір вхідних даних, як його порахував API
  • usage.completion_tokensРозмір відповіді, що тарифікується на вихідній стороні
  • max_tokensОбмеження довжини відповіді, яке ви резервуєте під час перевірки вікна

Підрахунок дешевий, локальний і займає секунди. Робіть його перед викликом, який коштує грошей.