Проверка бюджета

Узел, который спрашивает, укладывается ли предстоящий вызов модели в политики, бюджеты и, если вы её задали, собственную аллокацию узла, — и ветвит выполнение до того, как зарезервированы какие-либо деньги.

5 мин чтения

Проверка бюджета спрашивает, был бы разрешён предстоящий вызов модели, до того как зарезервированы какие-либо деньги. Если ответ — да, выполнение идёт к вызову. Если нет, выполнение уходит на ветку Отказ, и флоу решает, что услышит вызывающий.

Узел
Проверка бюджета
Тип
budget_check
Категория
Деньги
Порты
  • Разрешить default подключение обязательно
  • Отказ deny подключение необязательно
Завершает путь
Нет

Что делает узел

Узел оценивает вызов узла AI-модель, к которому ведёт его цепочка, так же, как будет оцениваться холд этого вызова. Затем он проверяет вызов одним из двух способов — его задаёт Какой бюджет проверять.

  • Глобальная политика — так проверяет новый узел. Узел применяет политики и читает денежные бюджеты, под которые попадает вызов: организации, проекта, операции и вашего клиента. Если холд поместился бы, выполнение выходит через Разрешить. Если отказывает политика или в бюджете нет места для холда, оно выходит через Отказ с policy_denied или budget_exceeded.

  • Аллокация узла. Узел сначала проверяет, как описано выше, и отказ этой проверки главнее. Затем он проверяет вызов по собственному лимиту для модели, к которой ведёт цепочка: то, во что обошлись вызовы после этого узла, считая по их оценкам, вместе с холдом этого вызова должно укладываться в лимит. Модель без своей строки получает лимит по умолчанию, а без лимита по умолчанию проходит без лимита узла. Отказ аллокации уходит на Отказ с budget_exceeded.

Узел только читает и ничего не резервирует. Три ограничения оставлены вызову модели — он проверяет их, когда берёт холд: бюджет На операцию, Одновременные резервы бюджета и кредиты вашего клиента. Поэтому у AI-модель есть свой порт Отказ. Под нагрузкой узел может ещё и пропустить вызов, холд которого потом будет отклонён.

Когда вызов оценить нельзя, узел пропускает выполнение, и решает вызов модели.

Когда использовать

  • Чтобы отказать до того, как зарезервированы деньги, и выбрать, что будет дальше: модель подешевле через Запасной путь, ответ из кеша, отказ со своим кодом через Отклонить запрос.

  • Чтобы дать одному флоу долю денег на каждую модель отдельно от бюджетов проекта: задайте аллокацию узла.

  • Сами бюджеты задаются на странице Бюджеты — Бюджеты. Узел их читает и не заменяет.

Отказ этого узла не отправляет событий вебхуков. operation.denied отправляется, когда сам вызов модели отклонён политикой или бюджетом.

Выполнение, которое закончилось как rejected после отказа узла, хранит в cost.estimated оценку отклонённого вызова: деньги, которые отказ сберёг, а не потраченные. Ветка Отказ, которая отвечает без вызова модели, заканчивается как completed с той же оценкой и без фактической стоимости.

Настройки

НастройкаДля чего она
modeЧто проверяет узел — policy, политики и бюджеты, под которые попадает вызов, или node, то же самое и затем аллокацию узла. Новый узел проверяет policy.
windowПериод, в котором считается аллокация, — daily, monthly или total. Читается только при аллокации. Без него — monthly.
allocationsСтроки аллокации, по одной на модель, — код модели и лимит, десятичное число, записанное текстом, например 25.00. Модель встречается не больше чем в одной строке. Читается только при аллокации.
default_limitЛимит модели, у которой нет своей строки, — десятичное число, записанное текстом. Необязателен. Без него такая модель проходит без лимита узла. Читается только при аллокации.

В конструкторе Какой бюджет проверять выбирает между вариантом Глобальная политика и аллокацией узла. Когда выбрана аллокация, Окно задаёт период, в котором считается лимит, а Добавить аллокацию добавляет строку: модель и её лимит. Панель отмечает действующую строку — строку модели, к которой ведёт узел. Лимит по умолчанию для модели без строки необязателен.

То, что считает аллокация, относится к этому узлу этого флоу и к одной модели и окну. Лимит — десятичное число с точкой и без знака валюты, например 25.00.

Порты

ПортВыполнение выходит через него, когда
РазрешитьВызов был бы разрешён. Обязательный
ОтказВызов отклонён. Необязательный

Когда у Отказ нет связи, отказ становится ответом на запрос: вызывающий получает budget_exceeded или policy_denied, а выполнение заканчивается как rejected. Проверка при публикации предупреждает о таком узле — Порты и ветвление.

Выход

Когда вызов был бы разрешён, узел оставляет то, что прочитал:

JSON
{
  "allowed": true,
  "available": "24.50000000",
  "would_reserve": "0.00057600",
  "node_budget": "within_limit",
  "node_budget_limit": "25.00000000",
  "node_budget_spent": "3.12000000"
}
  • would_reserve — холд, который взял бы вызов, а available — то, что осталось в самом тесном из бюджетов, под которые попадает вызов. available нет, когда под вызов не попадает ни один бюджет.

  • Три поля node_budget есть только при аллокации. node_budget говорит, как прочитана аллокация: здесь — в пределах лимита, а иначе — что у модели нет строки или что вызов не удалось оценить.

Когда узел отказывает, denied_by говорит, кто отказал, — политики и бюджеты или аллокация узла:

JSON
{ "allowed": false, "error_code": "budget_exceeded", "denied_by": "policy" }
JSON
{ "allowed": false, "error_code": "node_budget_exceeded", "denied_by": "node_allocation" }

Узел Условие на ветке Отказ читает их по пути nodes.<key>.output.denied_by, где <key> — ключ этого узла во флоу. Код, который вызывающий получает за отклонённую аллокацию, — budget_exceeded; node_budget_exceeded остаётся в выходе и в трассировке.

Ошибки

Настройки узла проверяются при проверке флоу и при его публикации.

В API запись issues называет такую проверку в params.detail; её code — invalid_node_config.

ПроверкаСообщение в конструкторе
budget_check_unsupported_mode«{node}» использует несуществующий режим бюджета.
budget_check_unsupported_window«{node}» использует несуществующее окно бюджета.
budget_check_invalid_default_limitЛимит по умолчанию «{node}» — недопустимая сумма.
budget_check_allocations_not_listАллокации «{node}» должны быть списком.
budget_check_needs_allocationУзлу «{node}» нужна хотя бы одна аллокация или лимит по умолчанию.
budget_check_allocation_not_objectУ «{node}» есть аллокация, которая не является объектом.
budget_check_allocation_without_modelУ «{node}» есть аллокация без выбранной модели.
budget_check_duplicate_model«{node}» выделяет бюджет на {model} дважды.
budget_check_invalid_limitЛимит для {model} на «{node}» — недопустимая сумма.
budget_check_unknown_modelМодели {model} нет в каталоге.

Проверяется и место узла: он ведёт ровно к одному AI-модель — Финансовая цепочка.

Пример

  • Запрос — По умолчанию → Проверка бюджета
  • Проверка бюджета — Разрешить → AI-модель
  • AI-модель — Успех → Вернуть ответ
  • Проверка бюджета — Отказ → Отклонить запрос

Проверка бюджета спрашивает, укладывается ли вызов. Если да, AI-модель резервирует деньги и вызывает модель. Если нет, Отклонить запрос завершает запрос с кодом, который выбрал его автор, и никаких денег не было зарезервировано.

Собрано из openapi b070e1f, sdk contract 5cc7055, php ae4a53b, node 84bc62d