Агент звонит на настоящий номер и доставляет на настоящий адрес. Модель при этом работает только с подменой.
Контейнер стоит внутри вашего периметра. К нам уходят счётчики — ни текстов, ни значений.
Маскирование по дороге в модель — бесплатная функция шлюза. Работающему агенту нужна обратная операция, и она начинается там, где фильтр заканчивается.
Меряем не на чистых шаблонах, а на том, как люди пишут в живых чатах и звонят в поддержку: опечатки, латинская раскладка, числа словами, падежи, уменьшительные имена, значение, размазанное по трём репликам.
Именно на таком тексте готовые библиотеки теряют больше всего: на чистом «Иванов Иван Иванович» работает любая, а реальные диалоги так не выглядят почти никогда.
Модель сама ничего не делает. Она читает переписку и решает, какую вашу функцию вызвать: «оформить доставку», «найти клиента в CRM». Звонит и привозит заказ ваш код — ему нужен настоящий номер и настоящий адрес.
Модели они не нужны нигде: чтобы понять «клиент просит доставку на завтра», достаточно любого правдоподобного имени. Значит настоящие данные должны попадать ровно в одно место — в ваш код. Pseudex стоит на этой границе и три раза за один заказ решает, что кому показать.
Находим 18 типов данных — ФИО, адрес, СНИЛС, ИНН, паспорт, ОМС. Подмена того же рода, падежа и формата, поэтому модель не пытается её исправить и читает разговор как обычно. Полный список →
Модель вызывает вашу функцию и передаёт в неё подмену — в том виде, в каком написала сама. Мы узнаём своё значение в любой форме и подставляем настоящее: курьер едет по реальному адресу.
Функция вернула настоящие данные из CRM, и они снова идут в модель. Для неё это тот же Виктор Шилов — иначе агент за один разговор познакомился бы с клиентом дважды.
Маскирование задумано как операция в одну сторону: текст вошёл, подмена вышла. Дальше она живёт своей жизнью — в памяти диалога, в аргументе вызова и в записи, которую ваш агент создал.
Вот одна и та же заявка после обработки. Слева — если настоящие значения никто не вернул.
Простое решение выглядит так: запомнили пару «настоящее ↔ подмена», модель ответила, нашли подмену в тексте и вернули настоящее. Это работает, пока модель повторяет подмену буква в букву. В аргументах вызова инструмента она этого почти никогда не делает.
Требовать от модели аккуратности бессмысленно — она пишет так, как ей удобно, и это правильное поведение. Поэтому подстраиваемся мы: узнаём свою подмену в любой форме, в которую её превратила модель.
Женское имя подменяется женским, улица — улицей, падеж сохраняется, у СНИЛС сходится контрольная сумма. Рассогласованную подмену модель замечает и начинает править сама — и вот тогда агент действительно ломается.
Просклоняла, сократила до инициалов, разнесла по трём полям, написала латиницей — мы узнаём своё значение в любой из этих форм и подставляем настоящее в том виде, в котором его ждёт ваша база.
Обе половины — про русский язык, падежи и документы РФ. Готового решения для этого мы не нашли, поэтому сделали сами. Если знаете второе — напишите, правда интересно.
Маскирование, волт и раскрытие значений живут на вашем железе. К нам уходит одно тело запроса — агрегатные счётчики в составе продления аренды.
Поэтому у нас нет и не может быть экрана, на котором видно ваше сообщение, токен или значение. Оператор персональных данных — вы, и остаётесь им один.
{"org_id": "org_4f3a8c",
"instance_id": "8f3c…",
"requests": 184203,
"values": 5140,
"entities": {"PHONE": 12043,
"NAME": 8871,
"LOC": 3310}}
Если маскировать нечем, запрос не уходит — до модели он не дойдёт. Если недоступны мы, контейнер работает на предоплаченном резерве ещё 48 часов и предупреждает.
Отметьте свои группы данных. Скажем, что находим сегодня, что в разработке и чего не планируем — последнее честнее первого. Отметки складываются в счётчик спроса: по нему мы строим очередь работ.
После регистрации приходит письмо со ссылкой: по ней ключ выпускается и показывается один раз, до всякой оплаты. Команда запуска придёт уже с подставленным ключом.
Он сам найдёт, куда проект ходит за моделью, поднимет контейнер, переключит переменную окружения и проверит, что маскирование сработало. Если нет — остановится и скажет.
curl localhost:8000/health docker logs pseudex | grep 'интерфейс' -A2 # → http://localhost:8081/?token=9f3c1a…
Абонплата по числу контейнеров, сверх включённого — по запросам. Запрос виден в логе вашего же шлюза, поэтому наш счёт можно сверить со своей записью.
Поддержка — на почте, отвечаем сами в рабочие часы по Москве. Настоящие значения клиентов присылать не нужно: они нам не видны, достаточно токена из журнала и времени.
Только тело отчёта, показанное выше: идентификатор организации и инстанса, число запросов и счётчики по типам сущностей. Ни текстов, ни токенов, ни значений — их физически нет на нашей стороне.
По дороге в модель — ничем, и мы этого не скрываем: спрятать телефон умеет открытый фильтр, который ставится одной строкой конфига. Разница в обратной операции: когда модель вызывает ваш инструмент, аргументы содержат подмену, и кто-то должен вернуть в них настоящие значения. Плюс устойчивость токенов между диалогами и разбор русских документов с контрольными суммами.
Само маскирование — единицы миллисекунд: детекция около 2 мс, подмена 0,4 мс, восстановление 2 мс. Сквозная надбавка больше, потому что запрос идёт лишним сетевым плечом: в наших замерах медиана выросла с 1 696 до 1 880 мс, у клиентов на своих стендах — до +0,5 секунды.
По одному рабочему процессу на ядро, каждый держит стек морфологии: на восьмиядерной машине это 2–2,5 ГБ памяти. Рабочих можно ограничить — PSEUDEX_WORKERS=2 даёт около 400 МБ и справляется с потоком небольшого бота. Ориентир: 2 ядра и 1 ГБ на старте, 4 ядра и 4 ГБ под нагрузку.
Пока нет. Контейнеру нужен исходящий HTTPS до лицензионного сервера: он берёт словари детекции в аренду и пополняет ёмкость. При нашей недоступности он работает на предоплаченном запасе примерно шесть часов вашего обычного трафика — это покрывает наши сбои, но не изолированный контур. Нужен такой режим — напишите, обсудим отдельно.
Любые, к которым вы ходите по HTTP: OpenAI-совместимые API, Anthropic, LiteLLM как прокси, собственный шлюз. Pseudex стоит до модели и ничего о ней не знает.
Мы не берём число, которое сообщает ваш контейнер. Он обслуживает столько запросов, на сколько мы выдали ёмкость, и за следующей порцией обязан прийти к нам. Ваш отчёт о фактическом расходе работает в обратную сторону — уменьшает начисление до фактического, то есть это ваша защита, а не наша.
Чего мы не обещаем: что это невозможно обойти. Учёт исполняет код на вашем оборудовании. Мы не утверждаем, что его нельзя изменить — мы делаем так, чтобы это требовало правки релизного бинарника и оставляло у нас датированный след.
Ваш трафик к нам не приходит вообще — контейнер стоит внутри вашего периметра, маскирование, волт и раскрытие значений происходят на вашем железе. К нам уходит только тело продления аренды со счётчиками.
Но у нас есть свои персональные данные — ваши: почта администратора кабинета, реквизиты для счёта, ФИО подписанта. Это ПД по 152-ФЗ, и ст. 18 ч. 5 требует, чтобы их запись, систематизация и хранение шли в базах на территории России. Поэтому витрина, лицензионный сервер и их база размещены в России, и по-другому быть не может.
Практическое следствие для вас: работая с нами, вы не создаёте себе трансграничной передачи — ни своей, ни своих клиентов.
Две строго необходимые: сессионная — чтобы вы оставались в кабинете после входа, и CSRF — чтобы форму нельзя было отправить с чужого сайта. Обе помечены HttpOnly и SameSite=Lax, сессионная живёт 12 часов.
Чужих счётчиков на сайте нет — ни Метрики, ни Google Analytics, ни пикселей. Есть наша собственная аналитика (Rybbit, открытый код), развёрнутая на нашем сервере в России: данные о посещениях не уходят ни в чьё облако. Она сохраняет в браузере идентификатор посетителя и записывает, куда вы нажимаете, поэтому мы спрашиваем согласия баннером — и «не считать» там такая же кнопка, как «согласен». Поля ввода в записи маскируются всегда: то, что вы печатаете в форму, в запись не попадает. На страницах кабинета аналитики нет вовсе.
Подробнее — в политике обработки.
Письмом на адрес, указанный в политике, с почты, на которую зарегистрирован аккаунт. Отзыв означает прекращение обработки и удаление аккаунта; данные, которые мы обязаны хранить по закону (бухгалтерские документы по оплаченным счетам), хранятся установленный срок и не используются ни для чего другого.
Ваш волт с настоящими значениями к нам не относится — он на вашем железе, и удаление аккаунта его не трогает.
Не оплачивать следующий счёт: карта не сохраняется, автосписаний нет. Ключ работает до конца оплаченного периода, потом сервис останавливается fail-closed. Данные остаются у вас — они и так никогда не были у нас.