Шлюз стоит между вашим кодом и моделью. Он находит в запросе чувствительные данные и подменяет их заглушками. Модель работает с обезличенным текстом. В ответе заглушки разворачиваются обратно, и вы получаете настоящие данные.
Фамилия здесь намеренно осталась на месте: ФИО пока не распознаются — почему.
Запрос в зарубежную модель — это передача текста за пределы вашего контура. Всё, что попало в промпт, попало и туда.
Если в промпте нет персональных данных, вопрос об их передаче за границу не возникает вовсе. Это проще, чем обосновывать такую передачу.
Запрос хранится у провайдера модели столько, сколько написано в его политике, и читается его сотрудниками при разборе инцидентов. Заглушку читать бесполезно.
Данные утекают не только из кода: их вставляют в промпт руками, копируют из письма, шлют в поддержку. Шлюз чистит запрос независимо от того, кто его составил.
Соответствие «заглушка → оригинал» живёт только в памяти одного запроса. На диск оно не пишется и в журнал не попадает.
Тот же код, тот же SDK, тот же ключ. Изменился только адрес, на который идёт запрос.
Одно и то же значение получает одну и ту же заглушку во всём запросе — модель понимает, что это один и тот же человек, и отвечает связно.
В ответе заглушки разворачиваются обратно — в том числе в потоковом режиме, по мере поступления кусков. Ваш код получает готовый ответ с настоящими данными.
Всё, что можно проверить контрольной суммой или строгим форматом, проверяется. Поэтому «заказ 1234567890» не будет принят за ИНН, а «версия 1.2.3» — за IP-адрес. Ложное срабатывание ломает работающую задачу молча, и мы предпочитаем его не допускать.
ФИО, адреса и названия компаний регулярными выражениями не берутся. Правило, достаточно широкое, чтобы поймать «Петров», поймает заодно половину обычных слов — и молча испортит запрос. Эти типы во второй очереди: их будет распознавать отдельная модель, работающая на нашей стороне.
Мы говорим об этом прямо, потому что маскирование, которому нельзя доверять, опаснее его отсутствия: на него полагаются и перестают проверять.
Меняется адрес — всё остальное остаётся как было.
from openai import OpenAI
client = OpenAI(
api_key="ВАШ_КЛЮЧ",
base_url="https://api.kosareva.cloud/guard/v1",
)
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": "Клиент petrov@acme.ru, ИНН 7707083893",
}],
)
curl https://api.kosareva.cloud/guard/v1/chat/completions
-H "Authorization: Bearer ВАШ_КЛЮЧ"
-H "Content-Type: application/json"
-d '{
"model": "gpt-4o",
"messages": [
{"role": "user", "content": "Клиент petrov@acme.ru"}
]
}'
Отдельный адрес показывает, что будет замаскировано, и никуда не обращается. Прогоните на нём свои настоящие промпты до того, как переключите боевой трафик.
POST /guard/v1/guard/preview
{"found": [{"type": "EMAIL", "value": "petrov@acme.ru"}],
"preview": ["Клиент [[EMAIL_1]]"]}
Таблица «заглушка — оригинал» существует, пока обрабатывается запрос, и исчезает вместе с ним. Базы масок нет.
Ни текст запроса, ни найденные значения не логируются. Шлюз не должен сам стать тем местом утечки, от которого защищает.
Аргументы function calling чистятся так же, как текст сообщений: через них данные утекают ровно тем же способом.
Шлюз передаёт ваш ключ дальше нетронутым и ничего о вас не знает. Лимиты, баланс и статистика считаются как раньше.
У тех, кто маскирование не подключал, путь запроса не изменился. Новый код стоит только на пути тех, кто его выбрал.
Это наш код, а не перепродажа чужого сервиса. Данные не уходят ещё и третьей стороне «на проверку».
Одинаковые значения получают одинаковые заглушки, поэтому связи в тексте сохраняются: модель видит, что в первом абзаце и в третьем — один и тот же адрес. Смысловая часть промпта не меняется вовсе.
Разворачиваются только те заглушки, которые шлюз сам поставил в этом запросе. Незнакомая останется в ответе просто текстом — подставить вместо неё чужие данные невозможно.
Да. Заглушка почти всегда разрывается между кусками ответа, поэтому шлюз придерживает хвост от незакрытой скобки до следующего куска. Задержка — один кусок, на глаз незаметна.
Заголовок X-Guard-Off: true пропускает конкретный запрос без изменений, а X-Guard-Types оставляет маскирование только для нужных типов.
Нет. Классическая DLP закрывает почту, файлы и съёмные носители. API Guard закрывает один конкретный канал — запросы к языковым моделям, который обычная DLP не видит: для неё это просто HTTPS к внешнему API.
Маскирование работает с любым ключом kosareva.cloud. Начните с предпросмотра: он покажет, что нашлось бы в ваших промптах, ничего никуда не отправляя.