Назад в блог

Оптимизация расходовИнструкция

Как посчитать токены до запроса: tiktoken в Python

Оцените число токенов промпта офлайн через tiktoken, проверьте окно контекста, прикиньте стоимость и сверьтесь с полем usage из ответа API.

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

Терминал: pip install tiktoken и подсчёт токенов в одну строку
Содержание
  1. Пять строк, которые считают токены
  2. Влезает ли промпт в окно?
  3. Сколько это будет стоить?
  4. Сверьте оценку с usage

Токены промпта можно посчитать у себя на машине ещё до отправки: поставьте tiktoken, закодируйте текст и возьмите len() от результата. tiktoken — токенизатор OpenAI, поэтому для моделей DeepSeek, GLM и MiniMax это оценка. Настоящее число API вернёт в 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. Как выглядит сама ошибка, разобрано в статье запрос слишком длинный: 400 и 413, окно контекста и 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 выходных токенов на запрос. Цены за 1M токенов актуальны и меняются вместе с нашими тарифами; столбец OpenRouter показывает справочные цены для той же нагрузки.

В сумме, с учётом входа и выхода, колонка CheapTokens для этих моделей дешевле OpenRouter. Подставьте свои три числа — и бюджет у вас есть до первого запроса. О разнице между двумя сторонами счёта — в статье входные и выходные токены: за что платит API, а реальные замеры — в сколько токенов уходит на запрос. Актуальные цены всегда на странице цен.

Путь оценки от текста до реального usage
Оценить офлайн, проверить окно, отправить, сверить с usage.

Сверьте оценку с 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. Тогда свои будущие оценки умножайте на это отношение перед расчётом бюджета. Кроме того, настоящий промпт обёрнут в служебную разметку чата, поэтому реальный счёт может выйти чуть выше оценки по чистому тексту. Прогоните несколько типичных промптов, а не один, и возьмите среднее отношение.

Дальше привычка такая: оценить локально, проверить окно, применить свой коэффициент к бюджету, а usage в каждом ответе пусть держит вас в тонусе. Нужен суммарный счёт за всю работу? В статье учёт стоимости токенов агента в Python он строится на том же поле. Если ещё не подключались, начните с первого запроса к CheapTokens, а остальное есть в документации.

Найдите пары

Сопоставьте название и то, что оно показывает

  • len(enc.encode(text))Ваша локальная оценка размера входа
  • usage.prompt_tokensРазмер входа так, как его насчитал API
  • usage.completion_tokensРазмер ответа, считается по цене выхода
  • max_tokensПотолок длины ответа, который вы закладываете при проверке окна

Считать токены дёшево, быстро и локально. Сделайте это до вызова, который стоит денег.