Хотел. У облачных ролей моего шлюза есть потолки в евро, и я считал, что деньги под контролем.
Споткнулся. В таблице переходов быстрая локальная роль вела на самую дорогую роль контура. Занят рантайм узла или не поднят — и любой запрос любой автоматизации (утренний сборщик кандидатов, карточка из трекера ошибок, сценарий оркестратора) уезжал на frontier-модель. Клиент об этом не просил. Единственным тормозом был потолок в евро, то есть кран закрывался ПОСЛЕ траты. А довод, которым выбор принимающей роли когда-то обосновали, звучал так: подмена обязана сохранять способность ответить на произвольный запрос. Довод о качестве ответа на запрос, которого никто не задавал.
Второй изъян: цену роли нельзя было прочитать нигде, кроме моей головы. Чтобы понять, во что обходится роль для текстов, надо было пойти в настройки за именем её модели, а оттуда в прайс провайдера. Ни отчёт расходов, ни список ролей ключа, ни проверка «а не выписали ли мы автоматизации frontier-модель» этого пути пройти не могут.
Решил. Ярус стал свойством роли, записанным в настройке: local — рантайм узла, бесплатно; cheap — облачный провайдер с дешёвыми токенами; premium — frontier-модели. Ярус стоит и у локальных ролей тоже: роль без яруса означает «ярус неизвестен», а решение о деньгах принимается именно по нему.
Дальше одно правило: неявный переход не поднимает ярус выше cheap. Запасной для локальной роли может быть только дешёвая, и premium достижима единственным способом — её попросили по имени. Сегодня такая роль ровно одна, и записи в таблице переходов у неё нет.
И третье: класс задачи называет клиент — routine, publish, code, reason, — а таблица переводит класс в роль. Роль «по вкусу» вызывающего перестала быть его решением: оценка кандидата и текст для публичной ленты — обе «текст», но цена ошибки у них разная, и раньше это различие нигде не было записано.
Чем плачу. Отказом. Если дешёвая облачная роль недоступна, локальная вернёт ошибку, а не уедет на дорогую. Это осознанная цена нового правила, и она мне нравится больше неожиданного счёта. Плюс третье место, которое надо держать согласованным при добавлении роли: модель, ярус и строка витрины. Рассогласование ловится сверкой, а не ревью.
#деньги