Контроль бюджетів для AI-агентів: як обмежити витрати в runtime

Практичний контроль бюджетів у production: max_steps, max_seconds, max_tool_calls, max_usd, stop reasons, audit logs і alerting.
На цій сторінці
  1. Ідея за 30 секунд
  2. Проблема
  3. Рішення
  4. Budget controls ≠ rate limiting
  5. Метрики бюджетного контролю
  6. Як це виглядає в архітектурі
  7. Приклад
  8. У коді це виглядає так
  9. Як це виглядає під час виконання
  10. Типові помилки
  11. Самоперевірка
  12. FAQ
  13. Де Budget Controls у загальній системі
  14. Пов'язані сторінки

Ідея за 30 секунд

Budget controls — це runtime-обмеження, які зупиняють run, коли агент виходить за ліміти кроків, часу, tool calls або грошей.

Коли це потрібно: коли агент викликає зовнішні інструменти, може ретраїти дії і працює з реальним бюджетом у production.

Проблема

Без бюджетів агент у production легко входить у цикл: більше кроків, більше tool calls, більше витрат. У demo це не видно, бо навантаження мале. У production така поведінка швидко перетворюється на інцидент.

Одна нестабільна відповідь інструмента часто запускає ланцюжок: повторна спроба -> новий tool call -> ще токени -> ще одна спроба. Якщо немає жорсткої межі в runtime, run продовжується довше і дорожче, ніж було заплановано.

Аналогія: це як поїздка без ліміту на таксі-акаунті компанії. Поки поїздка коротка, все нормально. Коли маршрут затягується, витрати ростуть непомітно до моменту списання.

Рішення

Рішення — винести бюджетні перевірки в policy layer у runtime. Кожен крок агента перевіряється за чотирма лімітами: max_steps, max_seconds, max_tool_calls, max_usd.

Policy layer повертає технічне рішення: allow або stop з явною причиною (max_steps, max_seconds, max_tool_calls, max_usd). Це рішення приймається на кожному кроці, а не лише в кінці run. Це окремий рівень системи, а не частина промпта чи логіки моделі.

Budget controls ≠ rate limiting

Це різні рівні контролю:

  • Rate limiting обмежує частоту запитів до системи або інструмента.
  • Budget controls обмежують сумарні витрати одного run.

Одне без іншого не працює:

  • без budget controls один run може стати надто дорогим
  • без rate limiting багато run-ів можуть перевантажити залежності

Приклад:

  • rate limit: не більше 10 запитів за хвилину до search_api
  • budget controls: не більше max_tool_calls=12 і max_usd=1.00 на один run

Метрики бюджетного контролю

Ці метрики і сигнали працюють разом на кожному кроці агента.

МетрикаЩо контролюєКлючові механікиНавіщо
Step budgetДовжину run у крокахmax_steps
stop reason max_steps
Зупиняє зациклення до росту витрат
Time budgetТривалість run у секундахmax_seconds
wall-clock timeout
Не дає довгим run-ам блокувати ресурси
Tool-call budgetКількість викликів інструментівmax_tool_calls
ліміт на виклики за run
Обмежує tool spam і retry-ланцюжки
Spend budgetГрошові витрати за runmax_usd
підрахунок usage
Ставить жорстку фінансову межу
Observability (budget)Видимість бюджетних рішеньaudit logs
alerts (Slack / PagerDuty)
Не обмежує дії напряму, але дозволяє швидко знайти і пояснити перевищення ліміту

Приклад alert:

Slack: 🛑 Agent Support-Bot hit max_usd limit ($100). Run stopped at step 12.

Як це виглядає в архітектурі

Budget policy layer стоїть між runtime і виконанням дії та перевіряє ліміти перед кожним кроком. Кожне рішення (allow або stop) фіксується в audit log.

Кожен крок агента проходить через цей flow перед виконанням: runtime не виконує дію напряму — спочатку budget-перевірка, потім виконання.

Коротко по флоу:

  • Runtime оновлює usage (steps, time, tool calls, spend)
  • Budget policy layer перевіряє ліміти
  • allow -> виконується наступний крок
  • stop -> повертається stop reason і partial response
  • обидва рішення записуються в audit log

Приклад

Агент підтримки обробляє запит і багато разів викликає refund.lookup через нестабільний API.

З budget controls:

  • max_tool_calls = 8
  • max_seconds = 45
  • max_usd = 1.00

-> run зупиняється після досягнення ліміту, а не після неконтрольованого росту витрат.

Budget controls зупиняють інцидент на рівні виконання, а не покладаються на те, що модель сама зупиниться.

У коді це виглядає так

У спрощеній схемі вище показано основний control flow. На практиці budget check часто виконується двічі: до виконання кроку і після оновлення фактичного usage. Лічильник кроків оновлюється перед перевіркою, щоб врахувати поточний крок у budget.

PYTHON
usage.update(step=1)

decision = budget.check(usage, limits)
if not decision.allowed:
    audit.log(run_id, decision.outcome, reason=decision.reason, usage=usage.snapshot())
    alerts.notify_if_needed(run_id, decision.reason, usage.snapshot())
    return stop(decision.reason)

result = tool.execute(args)
usage.update(tool_call=1, usd=result.cost_usd)

decision = budget.check(usage, limits)
if not decision.allowed:
    audit.log(run_id, decision.outcome, reason=decision.reason, usage=usage.snapshot())
    alerts.notify_if_needed(run_id, decision.reason, usage.snapshot())
    return stop(decision.reason)

audit.log(run_id, decision.outcome, reason=decision.reason, usage=usage.snapshot(), result=result.status)
return result

Як це виглядає під час виконання

TEXT
Сценарій 1: ліміт досягнуто (stop)

1. Runtime завершує крок 9 і оновлює фактичне usage.
2. Budget policy бачить, що max_usd перевищено.
3. Рішення: stop (max_usd).
4. Audit: decision=stop, reason=max_usd, step=9.
5. Користувач отримує partial response з причиною зупинки.

---

Сценарій 2: ліміт не досягнуто (allow)

1. Runtime запускає крок 4 і оновлює usage.
2. Budget policy перевіряє ліміти: все в межах.
3. Рішення: allow.
4. Виконується tool call.
5. Audit: decision=allow, usage оновлено, результат повернуто.

Типові помилки

  • лімітувати тільки токени і ігнорувати max_seconds, max_tool_calls та max_usd
  • перевіряти бюджети лише "в кінці", а не перед кожним кроком
  • не повертати явний stop reason користувачу
  • розмазати бюджетну логіку між runtime, tools і UI
  • не логувати budget decisions (allow / stop) в audit trail
  • не ставити alerting на max_usd і max_tool_calls

У результаті система виглядає стабільною, але під навантаженням швидко втрачає передбачуваність.

Самоперевірка

Швидка перевірка budget controls перед запуском у production:

Прогрес: 0/8

⚠ Бракує базового governance-контролю

Перед production потрібні мінімум: контроль доступу, ліміти, audit logs і аварійна зупинка.

FAQ

Q: Чи достатньо тільки token budget?
A: Ні. Tools можуть коштувати дорожче за токени. Мінімум: max_steps, max_seconds, max_tool_calls, max_usd.

Q: Що впроваджувати першим: max_steps чи max_usd?
A: Почни з max_steps і max_tool_calls, щоб одразу зупиняти цикли. Потім додай max_usd для фінансової межі.

Q: Що віддавати користувачу при budget stop?
A: Partial response + явний stop reason + коротка підказка, що робити далі (звузити запит або повторити з підвищеним бюджетом).

Q: Чи потрібні бюджети per-tenant?
A: Так. Для різних тарифів або команд потрібні різні ліміти, але механіка перевірки має бути однакова.

Q: Budget controls замінюють rate limiting?
A: Ні. Rate limiting захищає залежності від піків, а budget controls захищає run від runaway-витрат.

Де Budget Controls у загальній системі

Budget controls — це один із рівнів Agent Governance. Разом із RBAC, execution limits, approval і audit він формує єдину систему контролю виконання.

Пов'язані сторінки

Далі за темою:

⏱️ 6 хв читанняОновлено 25 березня 2026 р.Складність: ★★★
Реалізувати в OnceOnly
Budgets + permissions you can enforce at the boundary.
Використати в OnceOnly
# onceonly guardrails (concept)
version: 1
budgets:
  max_steps: 25
  max_tool_calls: 12
  max_seconds: 60
  max_usd: 1.00
policy:
  tool_allowlist:
    - search.read
    - http.get
writes:
  require_approval: true
  idempotency: true
controls:
  kill_switch: { enabled: true }
Інтегровано: продакшен-контрольOnceOnly
Додай guardrails до агентів з tool-calling
Зашип цей патерн з governance:
  • Бюджетами (кроки / ліміти витрат)
  • Дозволами на інструменти (allowlist / blocklist)
  • Kill switch та аварійна зупинка
  • Ідемпотентність і dedupe
  • Audit logs та трасування
Інтегрована згадка: OnceOnly — контрольний шар для продакшен агент-систем.

Автор

Микола — інженер, який будує інфраструктуру для продакшн AI-агентів.

Фокус: патерни агентів, режими відмов, контроль рантайму та надійність систем.

🔗 GitHub: https://github.com/mykolademyanov


Редакційна примітка

Ця документація підготовлена з допомогою AI, із людською редакторською відповідальністю за точність, ясність і продакшн-релевантність.

Контент базується на реальних відмовах, постмортемах та операційних інцидентах у розгорнутих AI-агентних системах.