Дневной бюджет ИИ, который отказывает при отсутствии лимита: потолки, session id и найденный нами пробел
Одна фоновая задача как-то сделала около 118 000 вызовов модели за день меньше чем на восемнадцать долларов, и мы не смогли сказать, какая именно. Остановили бы два правила: дневной потолок, который отказывает, если не задан, и session id в каждом вызове.
🎯 Для Разработчик, который запускает вызовы ИИ в циклах, по cron или в фоновых воркерах
- Как выглядит сбежавшая задача в ваших собственных цифрах
- Почему потолок должен отказывать при отсутствии и зачем каждому вызову метка
- Как проверить свой помощник бюджета на тот же пробел, что нашли у нас
🔥 Что случилось
26 июня 2026 в нашей базе трасс записано 117 917 вызовов модели за день на сумму $17,88. Накануне было 1 809 вызовов и $2,14. Это примерно в 65 раз больше по объёму. Из 117 917 вызовов у 116 382 не было session id, поэтому трасса не могла сказать, какая задача их сделала. Сначала вину возложили не на ту задачу. Только цифры по дням и по session id указали на настоящую: цикл автоматического перевода. По записи об инциденте ущерб — около семнадцати с половиной долларов. Трасса за тот день показывает $17,88, туда входит и обычный трафик дня.
Деньги небольшие. Урок другой: цикл, который зовёт модель на каждый элемент и не имеет потолка, масштабируется до размера входа.
🧱 Два правила
Правило первое: у каждого автоматического пути есть дневной потолок, и отсутствие потолка означает отказ. Потолок читается из явной настройки. Если настройка пуста, равна нулю или отрицательна, задача не должна стартовать. Противоположное умолчание «нет настройки — нет лимита» превращает забытую строку конфигурации в неограниченные траты.
Правило второе: каждый вызов несёт session id. Идентификатор называет задачу, а не человека. Без него первый вопрос после тревоги «кто это сделал?» остаётся без ответа. Автоматизацию, которая зовёт модель без него, мы не коммитим.
🔎 Пробел, найденный при написании этой статьи
Наш помощник дневного бюджета для фоновых задач читает лимит из переменной окружения. 3 ноября 2026 мы запустили его с пустой переменной. Лимит получился 0,0, а вызов «можно ли тратить?» вернул «да». То есть в этом помощнике отсутствие потолка означает отсутствие ограничения — противоположность правилу первому. Вызывающие, которые задают положительный лимит, защищены. Тот, кто забыл переменную, — нет.
Наш измеряющий транспорт, то есть полоса, которая платит провайдерам, ведёт себя правильно: при отсутствии потолка он отказывает с сообщением «нужен явный дневной потолок». Два помощника расходятся, и мы записали помощник как дефект к исправлению. Вывод: проверяйте свою защиту при убранной настройке.
📈 Какова доля вызовов без метки
С 2026-04-24 в нашей базе трасс 777 526 вызовов на $164,31. Из них у 125 541 вызовов, это 16,1 процента, нет session id, и они стоят $24,57, то есть 15,0 процента всей суммы. Большая часть — тот самый день. Расход без метки — не ошибка округления.
🛠️ Практика: закройте оба пробела
- Перечислите все места, где модель вызывается в цикле, по расписанию или в фоне.
- Для каждого найдите настройку дневного потолка. Нет — добавьте. Если код считает пустое значение «без лимита», замените на отказ.
- Напишите тест, который запускает задачу с убранной настройкой и проверяет, что ни одного вызова не сделано.
- Добавьте session id в каждый вызов. Пусть обёртка выбрасывает ошибку, если его нет.
- Запросите из трасс вызовы без идентификатора по дням. Сделайте этот запрос тревогой.
- Порог тревоги берите из обычного дня, например втрое от медианы за последние четырнадцать дней.
✅ Проверьте себя
- Уберите потолок у одной задачи в тестовой среде. Задача отказывается и говорит почему.
- Выберите любой вызов прошлой недели. Вы можете назвать задачу, которая его сделала.
- Число вызовов без идентификатора за последние семь дней равно нулю, или вы можете объяснить каждый.
- Вчерашний расход по задачам читается одним запросом.
🚧 Когда это не работает
- Слишком высокий потолок. Сто долларов не защищают задачу на десять. Назначайте потолок по реальной потребности.
- Расход, который приходит позже. Часть провайдеров сообщает стоимость после вызова. Потолок по отчётному расходу можно перескочить на то, что уже в полёте. Резервируйте до вызова.
- Общие ключи. Если пять задач делят один ключ, счёт провайдера их не разделит. Это должен делать ваш session id.
- Повторы. Цикл повторов может умножить расход. Считайте каждую попытку в потолок.
- Бесплатные модели. У бесплатных тарифов есть лимиты по скорости, и они могут исчезнуть. Потолку в ноль долларов всё равно нужен лимит вызовов.
📊 Доказательства
| Что измерено | Вызовы и стоимость по дням и вызовы без session id в нашей базе трасс; поведение помощника бюджета при пустом лимите |
| Когда | 3 ноября 2026, 22:06 UTC |
| Артефакт | База трасс LLM (777 526 вызовов с 2026-04-24); день 26 июня 2026 и прямой запуск помощника |
| Ограничение | Один инцидент и один помощник. Трасса показывает объём и стоимость, но не имя задачи: оно названо в нашей записи об инциденте |
➡️ Дальше
Запишите лимиты по материалу Расходы, бюджеты и лимиты и решите, что делать при сбое задачи, в Плане реагирования для небольшой команды.
Источники
- Расходы, бюджеты и лимиты: бюджет на задачу.
- План реагирования для небольшой команды: шаги реагирования.
- Контекстные окна и токены: что агент видит и сколько это стоит.
- Модели и маршрутизация: что меняет маршрутизация.
🔗 Связи статьи
Открыть полный граф знаний ↗Связи опубликованных статей. Выберите узел, чтобы открыть статью у заголовка.
Связи статей · клавиатура / текст
Та же тема
- Векторная база — это карта, а не источник: чему нас научил поиск
- Когда неизвестно, сколько стоил вызов модели: заморозка, затем сверка
- Как разбить большую задачу для дешёвой модели: урок 24 000 байт
- Навыки, MCP-инструменты и правила: три способа дать агенту возможности
- Восемь ошибок наших агентов в shell и git и правило на каждую
- Несколько агентов, один репозиторий: правила владения из реальных инцидентов
Следующие шаги
Связанные материалы
Векторная база — это карта, а не источник: чему нас научил поиск
Векторная база находит фрагменты, близкие по смыслу к вашему вопросу. Она не знает, какие из них верны или актуальны. Считайте каждое попадание указателем: откройте названный файл, сверьте хэш, а числа берите из артефакта, а не из найденного абзаца.
ИИ-агенты и MCP простыми словамиКогда неизвестно, сколько стоил вызов модели: заморозка, затем сверка
Иногда вызов модели обрывается по таймауту, и вы не знаете, списал ли провайдер деньги. Никогда не записывайте это как ноль. Пометьте как неопределённое, остановите новые платные вызовы и пусть названный человек сверит это с выпиской провайдера. Отказы до генерации — исключение.
ИИ-агенты и MCP простыми словамиКак разбить большую задачу для дешёвой модели: урок 24 000 байт
Дешёвая модель хорошо справляется с одной небольшой чёткой задачей и плохо — с большой кучей. Мы ограничиваем задачу 24 000 байт и отклоняем большие до вызова любой модели. Режьте по единицам — один файл или одна страна на задачу — и проверяйте размер до запуска.
ИИ-агенты и MCP простыми словамиНавыки, MCP-инструменты и правила: три способа дать агенту возможности
Агенты получают способности по-разному. Правило ограничивает, что они делают, навык говорит, как делать работу, а MCP-инструмент позволяет вызывать функцию. У каждого свой риск, поэтому объявляйте все три в реестре и проверяйте тестом, что ничего не существует вне списка.
💬 Комментарии