Защита от опустошения бюджета и отказа в обслуживании
Иерархические бюджеты, предварительная оценка стоимости каждого запроса и rate limits на стороне шлюза гарантируют, что баг в коде или внешняя атака не превратятся в катастрофический счёт от провайдера.
Проблема
LLM-расходы — один из крупнейших новых статей расхода начиная с 2025го года. Бесконечный цикл вызовов модели в коде, утечка ключа в публичный репозиторий или внешняя нагрузка на ваш API за ночь могут израсходовать месячный бюджет проекта или компании. Особенность LLM в том, что стоимость одного запроса масштабируется с длиной контекста и количеством токенов — один «безобидный» вызов с гигантским промптом может стоить десятки долларов.
Стандартные защиты на уровне инфраструктуры — WAF, rate limit на API gateway — не учитывают стоимость запроса, только их количество. Тысяча дешёвых запросов и тысяча дорогих формально неотличимы, но первая обойдётся в копейки, а вторая — в тысячи долларов.
Кого это касается: финансовый контролёр, SRE, инженер по безопасности, отвечающие за гарантированный потолок расхода и устойчивость к перерасходу.
Решение
- Гарантированный потолок расхода. Иерархия
Customer → Team → VKприменяется на каждом запросе; превышение на любом уровне блокирует запрос. - Отказ в обслуживании не превращается в отказ биллинга. Предварительная оценка отвергает запросы если они превышают бюджет еще до вызова провайдера — стоимость атаки для провайдера равна нулю.
- Изоляция инцидентов между командами. Перерасход или ошибка одной команды не съедают бюджет другой; иерархия эксклюзивна.
- Быстрое тушение инцидентов. Одна операция (
is_active: false) мгновенно отключает доступ для одного VK, остальные продолжают работать. - Наблюдаемость рисков. Метрики Prometheus (
meridian_governance_rejections_total, бюджетные счётчики) позволяют настроить алерты до того, как бюджет будет исчерпан.
Что предлагает Meridian
Meridian реализует три слоя защиты, работающие совместно:
- Иерархические бюджеты — Customer → Team → Virtual Key → Provider Config. На каждом уровне свой потолок и период сброса; превышение на любом уровне блокирует запрос. В кластерной редакции согласованность бюджетов обеспечивается через Raft, без race conditions при отказе узлов.
- Предварительная оценка запроса — до отправки запроса в LLM Meridian оценивает его стоимость на основе количества входных токенов и тарифа модели. Если бюджет уже исчерпан или предполагаемая стоимость превысит лимит, запрос отвергается без обращения к upstream-провайдеру. Стоимость DoS-атаки для вашего биллинга — ноль.
- Rate limits — независимые ограничения по запросам/минуту и токенам/минуту на каждый VK. Останавливают взрывной рост вызовов от ошибки в коде или вредоносного клиента ещё до того, как они приблизятся к бюджетному потолку.
Сценарий
Команда alpha запустила в эксплуатацию сервис автогенерации краткого содержимого. По ошибке retry-логика на стороне приложения попадает в бесконечный цикл — вместо одного запроса к LLM сервис делает 600 вызовов в минуту с большими промптами.
- Первые ~60 запросов проходят. Meridian оценивает каждый pre-LLM и списывает фактическую стоимость post-LLM.
- На 61-м запросе срабатывает rate limit (
request_max_limit: 60,request_reset_duration: "1m") — Meridian возвращает429 Too Many Requests, upstream OpenAI не вызывается. - Параллельно срабатывает token rate limit (
token_max_limit: 100000,token_reset_duration: "1m") — даже если приложение перейдёт на крупные запросы вместо частых, оно упрётся в потолок токенов. - SRE получает алерт из Prometheus (метрика
meridian_governance_rejections_totalрастёт), идёт в логи Meridian, находит проблемный VK за секунды и отключает его (is_active: false). - Финансовые потери: фактическая стоимость 60 запросов, а не 60 × N минут × 600 RPS. Бюджет команды не пострадал; бюджеты других команд не затронуты.
Альтернативный сценарий — утечка виртуального ключа (VK) во внешний репозиторий. Атакующий пытается потратить платные запросы:
- Внешний клиент начинает массовые вызовы с украденным VK.
- Предварительная оценка на каждом запросе складывается с накопленным расходом — лимит VK ($100/день) достигается за минуты/часы.
- Каждый последующий запрос возвращает
402 Budget Exceededмгновенно, без обращения к OpenAI. Ущерб от инцидента или ошибки контролируемо минимальный.
Конфигурация
Шаг 1. Включите принудительную аутентификацию на inference.
- Откройте Config → Governance.
- Включите Enforce auth on inference (
enforce_auth_on_inference: true).

Шаг 2. Создайте Virtual Key с тремя уровнями защиты.
- В Virtual Keys → Add Virtual Key задайте:
- Max Limit:
100(USD), Reset Duration:1d— дневной бюджет. - Token Limit:
100000, Reset Duration:1m— token rate limit. - Request Limit:
60, Reset Duration:1m— request rate limit.
- Max Limit:
- Привяжите VK к Team и Customer с месячными бюджетами на верхних уровнях.

Шаг 3. Настройте алерты на превышение.
- В Observability → Metrics убедитесь, что Prometheus включён.
- В системе мониторинга настройте алерт на метрику
bifrost_governance_rejections_total(рост на VK = индикатор инцидента).
Создание VK с защитой по бюджету и rate limits:
curl -X POST http://localhost:8080/api/governance/virtual-keys \
-H "Content-Type: application/json" \
-d '{
"name": "alpha-prod",
"description": "Production VK with strict limits",
"team_id": "team-alpha",
"provider_configs": [
{
"provider": "openai",
"weight": 1.0,
"allowed_models": ["gpt-4o-mini"]
}
],
"budget": {
"max_limit": 100.00,
"reset_duration": "1d"
},
"rate_limit": {
"request_max_limit": 60,
"request_reset_duration": "1m",
"token_max_limit": 100000,
"token_reset_duration": "1m"
},
"is_active": true
}'Экстренное отключение VK при инциденте:
curl -X PUT http://localhost:8080/api/governance/virtual-keys/{vk_id} \
-H "Content-Type: application/json" \
-d '{ "is_active": false }'Ожидаемые HTTP-коды при срабатывании защиты:
| Код | Причина | Что делать |
|---|---|---|
401 | VK отсутствует или неактивен | Проверить заголовок и статус VK |
402 | Бюджет исчерпан на одном из уровней (VK/Team/Customer) | Увеличить бюджет или дождаться сброса |
429 | Превышен request_max_limit или token_max_limit | Уменьшить нагрузку, пересмотреть rate limits |
Полная иерархия с защитой на каждом уровне:
{
"client": {
"enforce_auth_on_inference": true
},
"governance": {
"customers": [
{ "id": "customer-rnd", "name": "rnd", "budget_id": "budget-rnd" }
],
"teams": [
{
"id": "team-alpha",
"name": "alpha",
"customer_id": "customer-rnd",
"budget_id": "budget-alpha"
}
],
"virtual_keys": [
{
"id": "vk-alpha-prod",
"name": "alpha-prod",
"value": "sk-bf-alpha-prod",
"is_active": true,
"team_id": "team-alpha",
"budget_id": "budget-vk-prod",
"rate_limit_id": "rate-vk-prod",
"provider_configs": [
{
"provider": "openai",
"weight": 1.0,
"allowed_models": ["gpt-4o-mini"]
}
]
}
],
"budgets": [
{ "id": "budget-rnd", "max_limit": 10000.0, "reset_duration": "1M" },
{ "id": "budget-alpha", "max_limit": 4000.0, "reset_duration": "1M" },
{ "id": "budget-vk-prod", "max_limit": 100.0, "reset_duration": "1d" }
],
"rate_limits": [
{
"id": "rate-vk-prod",
"request_max_limit": 60,
"request_reset_duration": "1m",
"token_max_limit": 100000,
"token_reset_duration": "1m"
}
]
}
}| Поле | Что ограничивает |
|---|---|
budget.max_limit + reset_duration | Денежный потолок за период |
rate_limit.request_max_limit | Запросов за период |
rate_limit.token_max_limit | Токенов (input+output) за период |
client.enforce_auth_on_inference | Запретить inference без VK |
В кластерной (Enterprise) редакции списания и резервы по бюджетам реплицируются через Raft. Это гарантирует, что отказ одного узла не приведёт к двойному списанию или потере спена при сетевых разрывах. Подробнее — на странице Кластеризация.
Ограничения
- *Точность оценки запроса зависит от модели и provider-specific сигналов. Реальная стоимость может незначительно отличаться от оценки; post-LLM reconciliation выравнивает счёт по факту.
- Direct Key Bypass. Заголовки
Authorization,x-api-key,x-goog-api-keyподдерживают прямые ключи провайдера. Такие запросы не учитываются в иерархии бюджетов — это сознательный отказоустойчивый сценарий для доверенных интеграций. См. Управление ключами провайдеров. - Прямые вызовы провайдера в обход Meridian не покрываются. Защищайте upstream-ключи провайдера организационно: они должны храниться только в Meridian и специальных сервисах управления секретами.
- Calendar-aligned сброс vs скользящее окно. По умолчанию
reset_durationработает как скользящее окно; для жёстких календарных границ (день UTC, месяц UTC) включитеcalendar_aligned: trueв бюджете — детали в Бюджеты и лимиты.
Связанные материалы
- Бюджеты и лимиты — подробно об иерархии, calendar-aligned бюджетах и post-LLM reconciliation.
- Резервирование бюджетов - как обеспечить отсутствие непредвиденных затрат
- Виртуальные ключи — заголовки аутентификации и привязки.
- Управление ключами провайдеров — Direct Key Bypass и сценарии с прямыми ключами.
- Самообслуживание команд и контроль затрат — как разложить бюджеты по командам и подразделениям.
- Телеметрия — Prometheus-метрики и алерты на превышения.
Персональные AI-агенты
Open WebUI, Cherry Studio, OpenClaw и любой OpenAI-совместимый клиент. Контроль расхода, быстрые переключания между моделями и единая наблюдаемость, простые эксперименты.
Обзор
Meridian поддерживает множество LLM-провайдеров через единый OpenAI-совместимый интерфейс. Переключайтесь между провайдерами без изменения кода приложения.