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