🇹🇷 Репетитор турецкого. Часть 2: переезд, счёт за API и как я уронил его в десять раз

В первой части было устройство: проект в Cowork, задача по расписанию, инструкции, состояние в JSON. Стоило это $20 в месяц – плоский тариф, счётчика токенов я не видел.

Дальше — почему я оттуда ушёл, во что это обошлось и что с этим сделал.

1. Почему переехал Сначала переезд в Telegram. Тренировка появлялась файлом в папке на ноутбуке. Чтобы позаниматься, надо сесть за ноутбук. А заниматься удобнее в дороге, с телефона.

Плюс хотелось кнопку: не только «раз в сутки по расписанию», но и «дай урок сейчас». Так появилась команда /today.

Потом — GitHub. И вот это уже было вынужденно.

Бот жил постоянным процессом на моём маке. Планировщик будил генерацию, процесс слушал телеграм. Крышку закрыл – ничего не происходит. Слетели права – тишина, и узнаёшь через день. Схема решения простая: один процесс по расписанию раз в сутки генерирует тренировку и шлёт в телеграм, второй раз в пять минут опрашивает телеграм на предмет /today. Постоянного процесса нет вообще. Заодно исчезла куча костылей. У меня в инструкциях жила целая система лок-файлов, чтобы плановый запуск и запуск по кнопке не подрались за файл прогресса. В GitHub Actions это одна строка конфигурации — обе задачи в одной группе параллельности, одновременно не запускаются. Восемьдесят строк правил ушли в одну настройку.

2. Как выросли траты А вот тут начинается интересное. Из Cowork я ушёл на прямые вызовы API — и впервые увидел, сколько эта штука на самом деле стоит. Модель тогда писала весь HTML-файл целиком: стили, скрипты, логику упражнений. На одну тренировку уходило около 18 тысяч токенов вывода. Работала на claude-sonnet-4-6 — $3 за миллион входных токенов, $15 за выходные. При ежедневном занятии — примерно $9 в месяц. Формально дешевле подписки. Но с двумя оговорками. Во-первых, подписка покрывала вообще всё, а тут я плачу только за турецкий. Во-вторых, цифра росла: каждая неудачная генерация — это повторная попытка, то есть ещё один полный вызов по той же цене.

3. Три шага, которые уронили счёт Шаг первый: убрать из ответа модели всё, что умеет код. Модель писала вёрстку, а вёрстка каждый день получалась чуть другая. Функция проверки теста могла называться checkMC, назавтра handleMC, через день trainerMC. Отсюда шла половина багов – и три четверти счёта, потому что содержания в тех 18 тысячах токенов была хорошо если четверть. Что сделал: развёл ответственность. Модель отдаёт только содержание строгим JSON по схеме – вопросы, варианты, правильные ответы, теория. HTML собирает мой код из фиксированных шаблонов, написанных один раз.

модель → JSON → валидатор → рендер → HTML → телеграм Вывод упал с 18 000 токенов до 4 000

Шаг второй: понизить модель. Это стало возможно только после первого шага. Пока модель писала весь файл с интерактивом, лёгкая с задачей не справлялась – приходилось держать тяжёлую. Как только от неё потребовалось только структурированное содержание, claude-haiku-4-5 стало достаточно. Разница в прайсе: $1 и $5 против $3 и $15. Втрое дешевле выходной токен.

Шаг третий: кэшировать неизменную часть промпта. Системный промпт у меня немаленький: методика, куррикулум на 36 уроков, правила генерации. От запуска к запуску он не меняется. Что сделал: пометил его как кэшируемый. Повторное чтение из кэша стоит десятую часть обычной входной цены.

4. Сколько вышло и чем я заплатил Тренировка стоит около трёх центов вместо тридцати. При ежедневном занятии — меньше доллара в месяц против двадцати на подписке.

🇹🇷 Репетитор турецкого. Часть 2: переезд, счёт за API и как я уронил его в десять раз
В первой части было устройство: проект в Cowork, задача по расписанию, инструкции, состояние в JSON | Сетка — социальная сеть от hh.ru 🇹🇷 Репетитор турецкого. Часть 2: переезд, счёт за API и как я уронил его в десять раз
В первой части было устройство: проект в Cowork, задача по расписанию, инструкции, состояние в JSON | Сетка — социальная сеть от hh.ru