Домашка: токен-калькулятор

Домашка

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

python
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. Если ваши функции проходят эти тесты — смета из урока у вас воспроизводится.

Пример работы программы

python
>>> 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-совместимого клиента). Запишите расхождение в процентах — обычно учебная модель ошибается в пределах полутора раз, чего для смет достаточно.

  • theory icon

    Как устроены LLM: токены, контекст, цена

    10 мин

  • homework icon

    Домашка: токен-калькулятор

    4 мин

  • quiz icon

    Квиз: Как устроены LLM: токены, контекст, цена

    8 мин

  • theory icon

    Промпты как код: шаблоны и переменные

    8 мин

  • homework icon

    Домашка: промпт ревьюера

    3 мин

  • quiz icon

    Квиз: Промпты как код: шаблоны и переменные

    7 мин

  • theory icon

    Структурированный вывод: JSON вместо прозы

    6 мин

  • homework icon

    Домашка: парсер ревью

    3 мин

  • quiz icon

    Квиз: Структурированный вывод: JSON вместо прозы

    7 мин

  • theory icon

    Выбор модели: GPT, Claude, открытые

    7 мин

  • homework icon

    Домашка: бенчмарк вслепую

    4 мин

  • quiz icon

    Квиз: Выбор модели: GPT, Claude, открытые

    7 мин

  • homework icon

    HARD-задача: смета агента

    3 мин

  • theory icon

    Локальная модель: Ollama по-настоящему

    8 мин

  • quiz icon

    Квиз: Локальная модель: Ollama по-настоящему

    6 мин

🎯
Тренажёр собеседованияЗакрепите знания перед интервью