Квоты и учёт затрат: движок hold-and-settle
Как quota engine Simmetric Chat охватывает токены, хранилище и настоящие деньги - дизайн без второго счётчика на ledger'е, семантика fail-open когда ничего не настроено, и двухфазная hold-and-settle-бронь, делающая потолки расхода заслоном, а не отчётом.

Потолки, что действуют прежде, чем расход случится
Потолки потребления в многопользовательской AI-установке обычно живут в дашборде - отчёте, который читаешь после того, как счёт существует. Quota engine Simmetric Chat ставит их раньше: в путь запроса, до первого LLM-вызова. Движок покрывает три рода потолков - токены, хранилище и стоимость (арифметика настоящих денег, в центах) - и делает это одной формой везде: один ledger как истина потребления, производные балансы, заслоны до хода, и всегда явный отказ.
Эта статья проходит дизайн: инвариант «нет второго счётчика» на ledger'е, цепочку разрешения, решающую потолок каждого пользователя, работу скользящего окна сброса (история никогда не стирается), и двухфазную бронь hold-and-settle, делающую стоимостную квоту настоящим заслоном, а не отложенной тревогой.
Инструмент оператора (_community_-класс функций). Факты: FACT-CENSUS.md F-QUOTA-1.Нет второго счётчика
Единственный незаменимый инвариант: истина потребления живёт в СУЩЕСТВУЮЩЕМ token-usage ledger'е платформы. Балансы, holds и якоря сброса - производное состояние - никогда вторая счётная таблица, что могла бы отплыть от реальности. Следствия:
- Сброс - якорь ledger'а, а не протирание. Сброс пишет строку-якорь, ограничивающую скользящее окно; история использования/расходов никогда не стирается и не обнуляется. Оператор может аудитить назад в любой момент.
- Заслоны - на уровне службы и до хода - они идут там, где живут доменные данные (до первого LLM-вызова в оркестраторе, до ingesta в путях загрузки). Мидлвэра для обхода нет: проверка в самом пути службы.
- Математика денег - Decimal-в-центы. Всякая стоимостная выкладка проходит десятичный слой и приземляется целыми центами - никогда плавающая точка, никогда дрейф округления.
Цепочка разрешения
Потолок пользователя решается трёхступенчатой цепочкой, по порядку:
- Пользовательская накладка - админ напрямую ставит токен/складские/стоимостные потолки именованному пользователю.
- Пресет установки - стандартные ключи уровня установки в системной конфигурации (токен-потолок, гигабайты склада, потолок стоимости в EUR).
- Без лимита - sentinel
"0"/пустой = НЕ настроено, и движок отказывает открыто: нулевое поведенческих изменение для установок, что никогда не трогают квоты.
Fail-open - свойство с явной формой: quota engine - opt-in инструмент оператора, и «не настроено» обязано никогда не превращаться молча в «заблокировано».
Три рода
Токен-квоты катятся по оконной сумме потребления с ledger'а, ограниченной новейшим якорем сброса. Разрешение возвращает лимит и его исходный уровень - интерфейс может сказать, какая строка решила, по каждому пользователю. Превышение = именованная квотная ошибка, чей payload - ключ, который фронтенд, виджет и коннекторные обработчики читают одинаково.
Складские квоты принуждаются в путях загрузки до отправки в collector: пользовательская накладка, стандарт установки, или без лимита.
Стоимостные квоты - рука настоящих денег - дизайном hold-and-settle, ниже.
Hold-and-settle
Расход в токенах случается, когда случаются токены; расход в евро случается, пока течёт стрим. Стоимостный заслон потому бронирует ДО LLM-вызова и оседает по шве использования:
- Reserve (до вызова) - условное обновление, чей предикат база оценивает с блокировкой строки (потрачено + оценка ≤ потолка): N одновременных запросов СЕРИАЛИЗУЮТСЯ вместо того, чтобы проскользнуть всем скопом через устаревшую проверку, плюс строка hold в той же транзакции (бронь атомарна с проверкой).
- Settle (по шве) - hold финализируется и возмещает оценку минус факт. Принимое окно - пролётный перебор (факт > оценки) - без мид-стрим-убийства по стоимостной причине; инвариант в покое точен: осевший расход + открытые holds ≤ потолок.
Эта пара даёт стоимостной квоте свойство, которого отчёт иметь не может: потолок действует прежде, чем расход обязуется модели, через row-locked бронь, честную под конкуренцией.
Ценообразование: по модели, заморожено снимком, никогда беззвучно бесплатно
Источник цены по строке: замороженный снимок цен моделей, где есть (поздняя правка тарифа никогда не переписывает историю), иначе ставки резерва установки (доктрина SC-4: модель без цены никогда не обходит стоимостную квоту - неотрицающий встроенный пол действует с warn-once-логом, потому ничто не может показаться бесплатным по недосмотру). Валюты: ledger ведёт итоги по каждой валюте (USD, EUR, GBP, JPY, CNY, INR в v1 - без пересчёта); расход приземляется на done-событии стрима.
Настройка живёт в операторском пути: Settings → Providers → ценовая действие модели (ставки входа/выхода за 1M токенов + валюта), или по-пользовательское ценообразование для own-provider-ключей. N/A = «задайте ставку»; $0.00 = явно бесплатно (локальные модели возвращены в 0).
Principal виджета
Анонимные посетители виджета - не пользователи: потребление виджета привязывается к principal организации виджета - трафик виджета черпает из квотной цепи той организации, а не выдумывает идентичности по гостю. Коннекторный трафик и внутренние чаты делят тот же единственный оркестратор, потому доходные заслоны равномерно покрывают все три класса чат-поверхностей.
Читать дальше
Путеводитель несёт полную операторскую справку - ключи, endpoint'ы, поведение сброса, деталь ценообразования - на /ru/docs/quotas-and-costs:
- Quotas and costs - путеводитель
- Факты этого поста: строка
FACT-CENSUS.mdF-QUOTA-1 (три рода, ledger без второго счётчика, движок hold-and-settle)
Provenance: Simmetric Chat docs/QUOTAS.md (v0.28.1, Phases 207/216) + docs/MODEL_COSTS.md (Phases 203/209/216), quotaService.ts/costQuotaService.ts - на зафиксированном census'ом документальном состоянии (SHA aca5b8ff).


