Домашка: токен-калькулятор
Домашка
Смета агента начинается с трёх вопросов: сколько токенов займёт этот текст, влезет ли он в контекст вместе с ответом и сколько будет стоить месяц такой работы. Сегодня вы напишете в devbuddy модуль tokens.py, который отвечает на все три. Он останется в проекте навсегда: к финалу курса ваш агент-ревьюер будет заглядывать в него перед каждым запуском.
Описание задачи
Файл tokens.py с тремя функциями.
1. estimate_tokens(text: str) -> int — грубая оценка числа токенов в тексте по учебной модели:
кириллические буквы (а–я и ё в любом регистре) считаются отдельно: 1 токен на каждые 2 символа, с округлением вверх;
все остальные символы (латиница, цифры, пробелы, знаки, переводы строк): 1 токен на каждые 4 символа, с округлением вверх;
результат — сумма двух групп; пустая строка — 0 токенов.
Настоящие токенизаторы устроены сложнее, но для прикидок такой точности хватает — а главное, она работает без сети и мгновенно.
2. fits_in_context(prompt_tokens: int, diff_tokens: int, context_window: int, output_reserve: int) -> bool — влезет ли запрос в окно модели. Вход (prompt_tokens + diff_tokens) плюс резерв под ответ (output_reserve) должны суммарно не превышать context_window.
3. monthly_cost(prs_per_day: int, input_tokens: int, output_tokens: int, price_in: float, price_out: float, days: int = 22) -> float — месячная стоимость агента: round(..., 2) от произведения числа ревью за месяц на стоимость одного (цены задаются в долларах за миллион токенов).
Ограничения
Только стандартная библиотека, один файл
tokens.py.Функции чистые: без печати, без обращения к сети — только арифметика.
Как проверить себя
test_tokens.py — скопируйте и запустите python -m pytest test_tokens.py -v:
from tokens import estimate_tokens, fits_in_context, monthly_cost
def test_empty_text():
assert estimate_tokens("") == 0
def test_english():
# 11 символов латиницы -> ceil(11 / 4) = 3
assert estimate_tokens("hello world") == 3
def test_russian():
# 6 кириллических букв -> ceil(6 / 2) = 3
assert estimate_tokens("привет") == 3
def test_mixed():
# кириллица 6 -> 3 токена, прочие 8 символов -> 2 токена
assert estimate_tokens("Привет, world!") == 5
def test_code():
# 20 прочих символов -> ceil(20 / 4) = 5
assert estimate_tokens("def main():\n pass") == 5
def test_fits_true():
assert fits_in_context(1500, 4000, 8000, 1000) is True
def test_fits_false():
# 1500 + 6000 = 7500, а окно минус резерв даёт 7000
assert fits_in_context(1500, 6000, 8000, 1000) is False
def test_fits_exact_edge():
assert fits_in_context(0, 0, 100, 100) is True
assert fits_in_context(1, 0, 100, 100) is False
def test_monthly_luna():
# 440 ревью: (6000/1M * 0.10 + 1000/1M * 0.50) * 440
assert monthly_cost(20, 6000, 1000, 0.10, 0.50) == 0.48
def test_monthly_sol():
assert monthly_cost(20, 6000, 1000, 2.00, 10.00) == 9.68
def test_monthly_single_review():
assert monthly_cost(1, 6000, 1000, 10.00, 50.00, days=1) == 0.11Числа в стоимостных тестах — из урока: цены gpt-6-luna, gpt-6-sol и gpt-6-astra на официальной странице OpenAI на сентябрь 2026. Если ваши функции проходят эти тесты — смета из урока у вас воспроизводится.
Пример работы программы
>>> from tokens import estimate_tokens, fits_in_context, monthly_cost
>>> estimate_tokens("SELECT * FROM users WHERE id = 42")
9
>>> estimate_tokens("Привет, мир!")
6
>>> fits_in_context(prompt_tokens=1500, diff_tokens=4000,
... context_window=8000, output_reserve=1000)
True
>>> monthly_cost(20, 6000, 1000, 0.10, 0.50)
0.48Критерии готовности
Все одиннадцать тестов зелёные.
Функции не печатают ничего и не ходят в сеть.
Коммит в devbuddy:
tokens.pyиtest_tokens.py.
Проверьте на живой модели (необязательно)
Если настроен ключ: возьмите любой свой промпт строк на двадцать, оцените его estimate_tokens и сравните с реальным расходом в ответе API (response.usage.prompt_tokens у OpenAI-совместимого клиента). Запишите расхождение в процентах — обычно учебная модель ошибается в пределах полутора раз, чего для смет достаточно.
Как устроены LLM: токены, контекст, цена
10 мин
Домашка: токен-калькулятор
4 мин
Квиз: Как устроены LLM: токены, контекст, цена
8 мин
Промпты как код: шаблоны и переменные
8 мин
Домашка: промпт ревьюера
3 мин
Квиз: Промпты как код: шаблоны и переменные
7 мин
Структурированный вывод: JSON вместо прозы
6 мин
Домашка: парсер ревью
3 мин
Квиз: Структурированный вывод: JSON вместо прозы
7 мин
Выбор модели: GPT, Claude, открытые
7 мин
Домашка: бенчмарк вслепую
4 мин
Квиз: Выбор модели: GPT, Claude, открытые
7 мин
HARD-задача: смета агента
3 мин
Локальная модель: Ollama по-настоящему
8 мин
Квиз: Локальная модель: Ollama по-настоящему
6 мин