Policy Rules (Guardrails)
Guardrails в LLM Mart задают, как участники организации и API-ключи могут пользоваться моделями: лимиты расходов, списки разрешённых моделей и провайдеров, пров
Кому подходит
- Владельцам и администраторам — централизованно управлять ограничениями без разрозненных полей.
- ИБ и compliance — настраивать content-политики на нужном уровне клиента.
- Разработчикам — понимать, какие правила реально сработали для конкретного API-запроса.
Где настраиваются ограничения
Ограничения по моделям, бюджетам, контенту и rate limits задаются в API .../policy/rules и применяются при каждом запросе к API моделей.
Что можно настроить в одном правиле
Каждое правило — набор модулей:
| Модуль | Назначение |
|---|---|
access | Разрешённые или запрещённые модели и провайдеры |
budget | Потолок расходов в ₽ с периодом daily / weekly / monthly |
content | PII, категории контента, prompt-injection, свои regex |
network | Белый список IP/CIDR для доступа к API |
rateLimit | RPM/TPM на ключ или систему |
Пустой белый список в модуле access означает «без дополнительного ограничения по этому измерению» — сужение начинается только когда хотя бы одно правило задаёт непустой список.
Назначение правил: кому применяется
Правило привязывается к клиенту (clientSubject).
clientSubject.type | Когда использовать |
|---|---|
organization | Базовые лимиты всей организации / компании |
member | Ограничения для конкретного сотрудника (все его ключи наследуют контекст участника) |
virtual_group | Общие правила для группы участников и/или систем |
system | Правила для информационной системы или агента |
api_key | Самый узкий уровень — только этот ключ |
Личный аккаунт: в кабинете доступны «вся организация» (organization) и отдельный api_key.
Бизнес-аккаунт: полный набор уровней назначения плюс виртуальные группы (создаются в разделе Виртуальные группы).
Наслоение правил
На один запрос могут одновременно подойти несколько правил разных уровней — например, организация + виртуальная группа + API-ключ. Это не «первое совпадение», а совокупность:
- правило на участника задаёт базовую линию для всех его ключей;
- правило на ключ накладывается сверху и может быть строже;
- правила организации и группы действуют параллельно, если запрос попадает в их scope.
Счётчик бюджета всегда привязан к тому клиенту, для которого создано правило: отдельно «область счётчика» в кабинете не выбирается — она совпадает с clientSubject.
Иерархия и объединение
Для каждого запроса платформа выполняет два шага:
- Сбор — по лестнице scope и уровням назначения собираются все активные
PolicyRule, подходящие к запросу. - Объединение — модули сводятся в итоговую политику.
Правила объединения:
| Настройка | Как объединяется | Итог |
|---|---|---|
allowedModels, allowedProviders | Пересечение | Доступны только модели/провайдеры из всех правил с непустым белым списком |
deniedModels | Объединение | Запрет из любого правила блокирует модель |
budget | Каждый лимит отдельно | Запрос проходит только если все применимые бюджеты не исчерпаны |
content (PII, категории, regex) | Объединение фильтров | Фильтры из всех правил действуют вместе; при конфликте действий побеждает более строгое: block > mask > warn; режим observe только логирует |
network.allowedIPs | Пересечение | IP клиента должен попадать в белый список каждого правила с непустым списком |
rateLimit | Наиболее строгий | Берётся минимальный RPM/TPM из применимых правил |
Чем больше правил сужает доступ, тем уже итоговый белый список. Чем больше правил задаёт бюджеты, тем больше независимых проверок на каждом запросе.
Примеры бюджета (независимые счётчики)
Бюджеты не делятся между участниками: у каждого клиента свой счётчик на каждое правило.
Пример 1 — правило на участника, 50 000 ₽/день
Правило с лимитом 50 000 ₽/день назначено трём сотрудникам. У каждого свой счётчик 50 000 ₽. Если один исчерпал лимит, остальные продолжают работать в своих пределах.
Пример 2 — расход ключей суммируется для участника
У участника два API-ключа, на каждый — правило 20 000 ₽/день. Ключ A потратил 15 000 ₽, ключ B — 10 000 ₽. По ключам лимиты не превышены, но если на участника тоже действует правило 20 000 ₽/день, его суммарный расход 25 000 ₽ превысит member-лимит — новые запросы с любого его ключа будут отклонены.
Пример 3 — наслоенные лимиты
У участника member-правило 100 000 ₽/день. На ключ — отдельное правило 30 000 ₽/день. Ключ не может потратить больше 30 000 ₽/день, а суммарно по всем ключам участника — больше 100 000 ₽/день. Оба лимита проверяются на каждом запросе; срабатывает тот, который исчерпан первым.
Лестница scope: client × provider × model
Помимо клиента правило может сузить область по провайдеру и модели каталога (8 уровней — как в pricing rules):
| Уровень | Клиент | Провайдер | Модель |
|---|---|---|---|
| 1 | ✅ | ✅ | ✅ |
| 2 | ✅ | — | ✅ |
| 3 | ✅ | ✅ | — |
| 4 | ✅ | — | — |
| 5 | — | ✅ | ✅ |
| 6 | — | — | ✅ |
| 7 | — | ✅ | — |
| 8 | — | — | — |
Policy rules не останавливаются на первом совпадении по scope — собираются все подходящие уровни, затем объединяются.
Уровни назначения правил
При сборе правил они сортируются от более специфичного клиента к менее:
api_keysystemmembervirtual_grouporganization- глобальные правила платформы (без
clientSubject)
Виртуальные группы и наследование
Виртуальная группа содержит только memberIds и systemIds. API-ключи в группу напрямую не добавляются. Ключ наследует группы через:
- владельца ключа (
ownerEmail→member); - или
systemId, если ключ привязан к системе/агенту.
Белый список IP (network)
Модуль network ограничивает доступ к API моделей по IP-адресу клиента. Организация задаёт список разрешённых адресов и подсетей; запросы с других IP блокируются с HTTP 403 и причиной ip_not_allowed.
{
"network": {
"allowedIPs": ["203.0.113.10", "10.0.0.0/8", "192.168.1.0/24"]
}
}Формат записей: отдельный IPv4/IPv6 или CIDR (10.0.0.0/8). До 200 записей на правило.
Как определяется IP: платформа учитывает адрес, с которого пришёл запрос к API моделей (в том числе через корпоративный прокси, если он передаёт исходный адрес клиента).
Объединение: если несколько правил задают списки IP, адрес должен попадать в каждый список (пересечение). Типичный сценарий — одно правило на организацию с офисными подсетями.
Проверка контента
Модуль content сканирует вход запроса (тексты сообщений, аргументы tool calls) до вызова модели. Ответ модели проходит детокенизацию и повторное маскирование новых ПДн, сгенерированных моделью.
Персональные данные (PII)
Встроенные типы: email, телефон, паспорт, ИНН, платёжная карта, СНИЛС, ОГРН, ОГРНИП, полис ОМС. Дополнительно — свои regex через API (customPatterns).
Действия (в кабинете: блокировать, маскировать, предупреждать):
- block — HTTP
403, запрос не доходит до провайдера; - mask — обратимая токенизация: каждое совпадение заменяется уникальным суррогатом (
<PII_EMAIL_1>), запрос уходит к модели; в ответе суррогаты восстанавливаются в оригинал; - warn — фиксация срабатывания без блокировки и маскирования.
В REST API значение redact принимается как синоним mask (обратная совместимость); в интерфейсе не отображается.
Allow list (исключения)
Поле content.pii.allowList — массив публичных значений (email, телефон и т.д.), которые не маскируются и не блокируются. Пример: support@company.com, +7 800 123-45-67. Списки из нескольких правил объединяются.
Встроенные regex для PII
| Тип | Regex | Пример совпадения | Валидация |
|---|---|---|---|
[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,} | user@example.com | — | |
| Телефон | (?:\+7|8)[\s\-]?\(?\d{3}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2} | +7 999 123-45-67 | формат РФ |
| Паспорт РФ | \b\d{2}\s?\d{2}\s?\d{6}\b | 45 12 123456 | — |
| ИНН | \b\d{10}\b|\b\d{12}\b | 7707083893 | контрольная цифра |
| Платёжная карта | \b(?:\d[ -]*?){13,19}\b | 4265 5256 0839 8752 | Luhn |
| СНИЛС | \b\d{3}[-\s]?\d{3}[-\s]?\d{3}[-\s]?\d{2}\b | 123-456-789 01 | контрольная цифра |
| ОГРН | \b\d{13}\b | 1027700132195 | контрольная цифра |
| ОГРНИП | \b\d{15}\b | 304500116000157 | контрольная цифра |
| Полис ОМС | \b\d{16}\b | 16 цифр | контрольная цифра |
При маскировании каждое совпадение получает уникальный суррогат: <PII_EMAIL_1>, <PII_PHONE_2>. Таблица суррогат→оригинал хранится только в памяти на время запроса. После ответа модели суррогаты в тексте ответа восстанавливаются; новые ПДн в output дополнительно маскируются.
Категории контента
Дополнительно к PII: ненормативная лексика, разжигание ненависти, насилие, 18+, незаконная активность. Проверка по ключевым словам (не regex). Настраиваются в мастере на шаге «Категории контента».
Prompt injection
Встроенные OWASP-паттерны и свои regex. В кабинете — шаг Prompt injection в мастере правила. Действия: только фиксировать, маскировать, блокировать.
Рекомендуемый порядок: сначала Наблюдение (content.mode: observe) или действие «Только фиксировать», затем маскирование или блокировка.
Если поле content.promptInjection.patterns пустое, используются встроенные паттерны (регистронезависимые):
| Фраза / шаблон | Regex |
|---|---|
| ignore (all) previous/prior instructions | (?i)ignore\s+(all\s+)?(previous|prior)\s+instructions |
| disregard (all) previous/prior instructions | (?i)disregard\s+(all\s+)?(previous|prior)\s+instructions |
| forget (all) previous/prior instructions | (?i)forget\s+(all\s+)?(previous|prior)\s+instructions |
| you are now a/an/in … | (?i)you\s+are\s+now\s+(a|an|in)\s+ |
| jailbreak | (?i)jailbreak |
| system prompt | (?i)system\s*prompt |
| do anything now | (?i)do\s+anything\s+now |
| DAN mode | (?i)\bDAN\s+mode\b |
| reveal (the) system/hidden prompt | (?i)reveal\s+(the\s+)?(system|hidden)\s+prompt |
При указании своих паттернов в promptInjection.patterns встроенный набор заменяется списком из правила (по одному regex на строку в UI).
Свои паттерны (customPatterns)
Custom regex на шаге Свои паттерны. Действия: block, mask, warn.
Разрешённый синтаксис (RE2): классы символов, квантификаторы, альтернация |, негруппирующие скобки (?:…), якоря ^ $ \b, экранирование.
Запрещено: lookahead (?=…) / (?!…), lookbehind (?<=…) / (?<!…), backreference \1 / \k<name>, паттерны с риском ReDoS вроде (a+)+.
Примеры:
| Паттерн | Действие | Сценарий |
|---|---|---|
PROJ-\d{4,6} | mask | Коды проектов |
AKIA[0-9A-Z]{16} | block | AWS access key |
https?://internal\.company\.com\S* | mask | Внутренние URL |
При маскировании замена на [REDACTED]; при блокировке в ошибке — label паттерна или [BLOCKED]. До 100 000 символов на паттерн.
Объединение контент-фильтров
Если на запрос действуют несколько правил с content:
- фильтры объединяются (union): email из одного правила и телефон из другого — оба применяются;
- при разных действиях для одного типа данных побеждает block над mask над warn;
mode: observeфиксирует срабатывание без блокировки и без маскирования.
Когда запрос блокируется
При срабатывании budget, access, content (block) или rate limit API моделей возвращает 403 или 429. Для content-блокировок в теле ошибки указывается причина (тип PII, категория, паттерн).
Информационные системы и агенты
У информационной системы есть тип: system или agent. В интерфейсе — бейджи IS / Agent.
Персональные и бизнесовые guardrails
- Бизнес: бюджеты организации, доступ к моделям, лимиты для рабочих ключей, группы и участники.
- Личный: правила на всю организацию или отдельный ключ без member/virtual_group.
Про RPM/TPM
Ограничения RPM/TPM — модуль rateLimit в PolicyRule. Платформа применяет скользящее окно RPM на уровне API-ключа; при превышении — 429 Too Many Requests. См. Лимиты и квоты и Policy API.
Что дальше
Лимиты и квоты
Как платформа ограничивает использование моделей через policy rules: бюджеты, доступ к моделям, контент-ограничения и rate limits.
Логи запросов (Request Logs)
Раздел «Логи» в личном кабинете показывает историю обращений к API моделей: таблица запросов, график активности и панель детализации. Базовые метаданные (модель