Перейти к основному содержанию

Kill switch расходов API для LLM-агентов: остановите бюджет до вызова провайдера

L
10 мин чтенияAI API

Как поставить бюджетный стоп перед платным API-вызовом агента, а не после счета.

Kill switch расходов API для LLM-агентов: остановите бюджет до вызова провайдера

Kill switch расходов API для LLM-агента должен срабатывать до того, как запрос уйдет к платному провайдеру. Если агент умеет повторять шаги, запускать подагентов, вызывать инструменты или переключаться на запасной маршрут, бюджетная проверка должна стоять на пути каждого такого вызова. Отчет в billing dashboard и письмо о превышении бюджета полезны, но они приходят слишком поздно для runaway loop.

Минимальная рабочая схема выглядит так: оценить максимальную стоимость запроса, атомарно зарезервировать эту сумму в общем ledger, вызвать провайдера только если резервирование прошло, затем сверить фактический usage и вернуть остаток резерва. Если лимит будет нарушен, агент получает terminal over_budget с retryable: false.

КонтрольЧто он останавливаетРоль в budget stop
Billing alertОператор поздно заметил рост расходовМягкий сигнал, запросы могут продолжаться
Provider или project capУправление счетом на стороне провайдераПолезный backstop, не первый gate агента
Gateway budgetТрафик через единый proxy или gatewayМожет быть жестким стопом, если нет обходов
Pre-provider gateСледующий платный model callГлавный kill switch для автономного агента

Правило остановки должно быть записано явно: после over_budget агент не повторяет запрос, не запускает helper, не переключается на другой платный ключ и не просит tool сделать скрытый model call. Новое действие возможно только после ручного изменения лимита или политики.

Что считать настоящим kill switch

Настоящий kill switch расходов не равен dashboard, email alert, quota graph или обычному rate limit. Он должен иметь право сказать no до начала оплачиваемой работы. Такой контроль можно разместить в runtime агента, внутреннем OpenAI-compatible proxy, API gateway, wrapper перед провайдером или sidecar-сервисе. Главное требование одно: именно через него проходит credential path, которым агент реально пользуется.

Самая частая ошибка архитектурная. Команда добавляет budget warning после того, как worker уже получил direct provider key. Это защищает финансовую почту, но не следующий API call. Если агент имеет planner loop, retry loop, tool loop и очередь sub-agent, все эти пути должны тратить бюджет через один gate.

Разведите термины в runbook:

ТерминИспользуйте дляНе используйте для
Spend limitДенежный потолок проекта, команды, пользователя или runToken throughput
Rate limitRequests или tokens за временное окноПолная месячная стоимость
Soft budgetAlerts, reporting, threshold governanceБлокировка до provider call
Hard stopЗапрос отклонен до новой платной работыПисьмо или отчет после факта

Эта лексика нужна не ради чистоты текста. Во время инцидента оператор должен спросить не "где у нас поле budget", а "какой компонент может запретить следующий платный вызов".

Выберите слой контроля

Надежная production-схема почти всегда слоистая. Primary stop стоит в request path, а provider, platform, token caps и alerts работают как backstops и observability.

Стек контроля расходов: лимиты agent loop, token cap, gateway budget, provider backstop, alerts и главный pre-provider gate.

СлойСилен в чемСлабое местоКак использовать
Agent loop limitБесконечные циклы, слишком много tool steps, долгий wall-clockНе знает точный счет провайдераЛокальный safety rail
Per-call token capОграничивает худший single requestНе остановит тысячи маленьких запросовGuardrail формы запроса
Pre-provider spend gateОтклоняет следующий платный request до выхода из системыТребует общего ledger и дисциплины маршрутовPrimary kill switch
Gateway budgetОбщий контроль across keys, teams, providers и modelsЛюбой bypass делает дыру; concurrency надо тестироватьShared control plane
Provider/project capAccount governance у провайдераМожет быть мягким, задержанным или не учитывать retry semantics агентаBackstop
Alerts и audit logsDetection, notification, postmortemНе обязаны остановить следующий callObservability

Если у вас уже есть OpenAI-compatible proxy, начните там: один base URL легче контролировать, чем десятки SDK-вызовов. Если только runtime агента видит все tool-triggered calls, ставьте gate в runtime и заставьте подагентов наследовать тот же budget scope. Если у вас несколько providers, внутренний gateway обычно проще для аудита, чем копирование budget logic в каждый worker.

Плохой вариант - partial gate. Planner идет через бюджет, evaluator или retrieval tool держит прямой ключ, а emergency fallback route разрешен без ledger. При аварии агент все равно найдет путь к счету.

Реализуйте reserve, call, reconcile

До ответа провайдера точную цену вы не знаете, поэтому gate должен резервировать худший допустимый сценарий. Это консервативно, но именно так вы избегаете гонки между параллельными worker.

Процесс reserve-call-reconcile: оценка максимальной стоимости, атомарное резервирование, вызов провайдера, запись usage, сверка и блокировка до превышения.

Минимальные поля ledger:

ПолеЗачем нужно
budget_idКоманда, пользователь, проект, agent run или иной владелец лимита
limit_amountРазрешенный максимум на период или run
reserved_amountСумма, заблокированная in-flight calls
actual_amountФактическая сумма после сверки usage
period_start / period_endОкно сброса бюджета
request_idСвязь решения с provider logs
agent_run_idГруппировка planner, worker, sub-agent и tool calls
decisionallowed, blocked, reconciled или released
reasoncap reached, missing estimate, unknown model, override или policy block

Flow до вызова:

ts
async function guardedModelCall(request) { const estimate = estimateWorstCaseCost(request); const reservation = await ledger.reserveAtomically({ budgetId: request.budgetId, requestId: request.requestId, agentRunId: request.agentRunId, amount: estimate, }); if (!reservation.allowed) { return { error: "over_budget", retryable: false }; } const response = await provider.responses.create(request.payload); await ledger.reconcile({ reservationId: reservation.id, actualAmount: costFromUsage(response.usage), usage: response.usage, }); return response; }

Ключевое слово - atomically. Если пять worker одновременно читают remaining budget и все вызывают provider, usage logs придут уже после перерасхода. Резервирование должно быть транзакцией базы, Redis script, durable workflow step или gateway operation, которая не допускает interleaving для одного budget_id.

Streaming требует отдельного правила. Первичный reserve равен максимальному выводу, который вы разрешили. Если usage доступен только в конце stream, сверяйте при закрытии. Если client disconnected до финального usage, не освобождайте весь reserve автоматически: оставьте conservative charge, пометьте unknown или запустите reconciliation job по provider logs.

Заставьте агента остановиться

Budget response должен быть частью agent semantics. Обычный timeout или 429 иногда можно повторять. over_budget нельзя повторять для того же scope.

json
{ "error": "over_budget", "retryable": false, "budget_id": "team-alpha-agent-run", "next_allowed_action": "human_budget_override" }

Три правила распространения:

ПравилоПочему
Planner больше не планирует paid workИначе root loop продолжит создавать blocked jobs
Sub-agent наследует parent budget scopeИначе helper потратит после остановки родителя
Tool calls, которые вызывают model, проходят тот же gateИначе tools становятся скрытым расходом

Retry policy должен иметь отдельный stop list: over_budget, policy_blocked и missing_budget_scope не ретраятся. Их надо логировать, показывать оператору и завершать run. Нельзя разрешать агенту "попробовать другой маршрут" без новой бюджетной политики, потому что это меняет owner, key, gateway и liability.

Проверьте границы провайдеров и gateway

Provider controls полезны, но это разные механизмы. Перед публикацией runbook проверьте текущую документацию, потому что бюджетные функции и dashboard behavior меняются.

SurfaceЧто проверить сейчасПрактическая граница
OpenAI project budgetsВ текущей справке OpenAI project monthly budgets описаны как soft spending thresholds: API requests могут продолжаться после превышения. Rate limits docs отдельно говорят о throughput limits и usage/spend limits.Не используйте project budget как единственный request-path kill switch.
OpenAI Responses usageResponses содержат usage fields для reconciliation.Полезно после call, недостаточно для pre-call block.
Anthropic limitsДокументация Anthropic разделяет spend limits и rate limits.Хороший backstop, но прямые calls агента все равно ведите через gate.
LiteLLM proxyДокументы LiteLLM описывают budgets, agent/session caps и spend tracking.Подходит, если весь paid traffic проходит через proxy.
Cloudflare AI GatewaySpend limits могут возвращать HTTP 429 после cost limit, с caveat по eventual consistency.Сильный gateway вариант, но concurrency bursts и bypass routes надо тестировать.
Vercel Spend ManagementМожет notify, запускать webhooks или pause production deployments при настройке.Platform brake, не замена per-agent gate.

Для OpenAI rate-limit symptoms держите отдельную ветку incident response. Rate limit отвечает на throughput; spend kill switch отвечает на вопрос, должен ли ваш агент вообще отправлять следующий платный запрос.

Протестируйте без вызова провайдера

Готовность kill switch доказывается не красивым логом blocked, а тем, что после лимита provider counter остается нулевым.

Проверочный список no-provider-call: fake provider, low cap, parallel calls, streaming abort, retry stop и audit proof.

ТестSetupPass condition
Fake providerПодмените endpoint локальным counter serviceПосле исчерпания бюджета counter равен 0
Cap below requestRemaining budget ниже estimateGate возвращает over_budget до network call
Parallel workersЗапустите конкурентные requests, которые превысили бы cap при гонкеТолько зарезервированные calls проходят
Streaming abortОборвите stream до финального usageLedger держит conservative reserve до reconciliation
Retry policyСмоделируйте timeout, 429 и over_budgetРетраятся только retryable errors
Audit packetПроверьте ledger, request_id, agent_run_id, reasonОператор может объяснить блокировку

Повторяйте эти тесты после изменения price metadata, model routing, retry policy, gateway config или storage. Если fake provider получает запрос после cap, это еще cost monitor, а не kill switch.

Production runbook

  1. Заморозьте direct provider credentials и проверьте, что worker не может обойти gate.
  2. Уточните budget scope: user, team, project, agent run или monthly account cap.
  3. Проверьте ledger: actual spend, reserved spend, in-flight calls, unknown items.
  4. Убедитесь, что агент получил terminal over_budget.
  5. Остановите retries, sub-agent scheduling и tool-triggered model calls.
  6. Сверьте provider logs с ledger records.
  7. Решите: поднять cap, сузить задачу или закрыть run.
  8. Для human override запишите approver, новый cap, срок действия и причину.

Самый опасный override - "попробуем через другой route". Это уже новая budget decision, а не retry.

Часто задаваемые вопросы

Достаточно ли OpenAI project budget?

Нет. Текущая справка OpenAI описывает project budgets как soft thresholds. Они полезны для governance и alerts, но runaway agent должен быть остановлен request-path gate до provider call.

Что возвращать: HTTP 402, 429 или domain error?

Выберите статус, который умеет ваш клиент, но payload важнее. В нем должны быть budget cap exceeded и retryable: false. Gateway может использовать 429, internal runtime часто удобнее возвращать over_budget.

Как оценить стоимость до ответа?

Берите maximum allowed input, output, tool, image или streaming cost. После call сверяйте actual usage и освобождайте остаток.

Что делать с поздним usage?

Держите reserve до reconciliation или помечайте unknown с conservative charge. Не открывайте бюджет сразу после interrupted stream.

Нужны ли sub-agent отдельные budgets?

Можно, но parent cap должен наследоваться. Helper не должен тратить после остановки parent run.

Если у нас уже есть gateway?

Проверьте, что каждый paid model path идет через gateway. Потом протестируйте low cap, parallel calls и fake provider. Gateway становится primary kill switch только без bypass routes.

Поделиться:

laozhang.ai

Один API, все модели ИИ

AI Изображения

Gemini 3 Pro Image

$0.05/изобр.
-80%
AI Видео

Sora 2 · Veo 3.1

$0.15/видео
Async API
AI Чат

GPT · Claude · Gemini

200+ моделей
Офиц. цена
Обслужено 100K+ разработчиков
|@laozhang_cn|$0.1 бонус