Продукт
Все вызовы ваших агентов по одним правилам
MCP, HTTP и SSH через один брокер. Агент просит действие. Sallyport определяет класс, при необходимости зовёт человека, пишет запись, кладёт ключ на запрос и отправляет его. Правила одни и те же, пришёл вызов по MCP, по HTTP или по SSH.
Единица настройки
Binding — это один ключ, один сервис и один набор правил
На нём держится всё остальное. Binding называет кред, канал, хост, префикс пути и методы, которыми агентам можно пользоваться, и режим одобрения к ним. Выдали агенту binding — у него появился инструмент с человеческим описанием. Забрали — инструмент пропал из списка.
- Агент видит всё сразу
- Новый агент на первом же вызове перечисляет все binding'и своего воркспейса: сервис, ключ, что проходит сразу, а что ждёт человека. Никто не узнаёт границы своих прав через отказ.
- Нет доступа возвращается ссылкой, по которой выдают
- Вызов на хост без binding'а возвращает access request и URL. Человек выдаёт доступ одним экраном, агент повторяет вызов, работа продолжается.
- Правила на агента только ужесточают
- Override на агенте может сузить то, что разрешает binding, и не может расширить. Проверка живёт в базе, а не в ветке кода, про которую можно забыть.
Лестница
Чтение идёт. Запись спрашивает. Разрушительное отклоняется, пока вы не скажете иначе
Три класса, и каталог решает их за вас. GET по списку — чтение. POST, который двигает деньги, — запись. Удаление, ротация ключа и путь, выдающий чужой секрет, — разрушительное.
- Профили вместо файлов политик
- Observer, workhorse и prod идут профилями, которые применяются сразу к многим binding'ам, с предпросмотром изменений до применения.
- Сначала смотреть, потом включать
- Режим observe неделю ведёт binding и показывает отчёт: все вызовы, которые он видел, те, что профиль остановил бы, и причину по каждому. Включаете, когда согласны.
- Grant'ы с краем
- Разрешите класс на час с бюджетом вызовов. Grant — это строка, она проверяется на границе каждого вызова, и отзыв останавливает следующий.
Карточка
Экран, который определяет продукт
Человек открывает карточку на телефоне, тратит на неё три секунды и не помнит, что делал агент. На ней достаточно, чтобы отличить нормальный вызов от вредоносного, и ничего сверх того.
- Рисуется из запроса, который мы вот-вот отправим
- Строка цели берётся из канонического запроса, который построил шлюз: класс, метод, хост, путь, аргументы полностью, кред по имени, сработавшее правило и то, что вызов спровоцировало.
- Недоверенный текст помечен как недоверенный
- Всё, что написал агент, лежит в своём блоке, экранированное, с вырезанными управляющими и bidi-символами, а кнопки — выше него. В Telegram карточка идёт вообще без разметки.
- Один вопрос на серию
- Пятьдесят записей в цикле становятся одной групповой карточкой: все, первые пять или по одной. Разрушительный вызов добавляет step-up и обязательную причину.
Мы следим за штамповкой. Когда ответы воркспейса становятся быстрыми и одинаковыми, карточки группируются жёстче, а разрушительный вызов требует письменной причины.
Каталог
Рецепты хранят факты о чужих API
Рецепт знает хосты сервиса, способ предъявления креда, какие пути пишут и какие разрушают. Это JSON со схемой и тестами классификации в публичном репозитории, так что неверный класс правится данными, а не релизом.
- Пути, выдающие секреты, названы поимённо
- Installation-токены GitHub, CI-переменные GitLab, env Vercel с decrypt, kv у Vault. Помечены в рецепте, класс destructive, по умолчанию отказ, и консоль показывает их список в вашем арендаторе.
- Дрейф — это событие
- Когда апстрим добавляет эндпоинт, которого каталог не знает, вам об этом сообщают, а не пропускают его молча.
- То, чего нет в каталоге, всё равно работает
- Хост без рецепта получает консервативный дефолт и access request: неизвестный API становится вопросом к человеку, а не тупиком для агента.
Правила фрикшена
Отказ из-за конфигурации — это баг продукта
Минимальный фрикшен здесь требование, и его держат тесты. Пять из них стоит назвать вслух.
- У ожидания всегда есть идентификатор
- В каждом останавливающем ответе есть call_id, ссылка на одобрение, срок, интервал опроса и ожидаемое время. Повтор с идентификатором продолжает ту же операцию во всех четырёх транспортах.
- Данные не теряются
- Агент получает столько тела, сколько влезает в контекст, а полный ответ остаётся доступен по ссылке. У ответа на 100 MiB голова уходит инлайн, остальное — одним fetch'ем.
- Ошибка говорит, что делать дальше
- У каждого останавливающего кода есть инструкция и ссылка в тексте, который читает модель, а не только в структурном поле, которое она может пропустить.
- Лимиты вас не будят
- Лимит скорости отвечает временем повтора. Превышение плана включает триал и присылает уведомление. Ни то, ни другое не поднимает карточку и не останавливает прод.
Для агентств
Воркспейс на клиента, со своим approver'ом и своим журналом
Вы ведёте агентов на инфраструктуре клиентов, и у каждого клиента своё хранилище, свои одобряющие, свой выгружаемый журнал и карточка под вашим брендом. Подписали следующего — клонировали воркспейс. Такой формы нет ни у одного вендора с публичной ценой.
- Гостевому approver'у не нужен аккаунт
- Отправьте magic-link. Человек со стороны клиента отвечает на карточку про свой ключ, и в записи видно, кто это был.
- Отчёт принадлежит клиенту
- Каждый воркспейс выгружает свой сегмент журнала и свой дайджест, так что клиент видит, что ваши агенты делали в его системах.
Поставьте за него один ключ и посмотрите
Начните с самого шумного агента и с ключа, который вы меньше всего хотите ему отдавать.
10 000 вызовов в месяц бесплатно. Режим observe показывает, что политика остановила бы, ещё до её включения.