Скрытие персональных данных
Как это работает
Параметр obfuscate: true в запросе Chat Completions
включает скрытие персональных данных. Перед отправкой провайдеру персональные
данные во всех сообщениях диалога — user, system, assistant — заменяются
на плейсхолдеры вида <<PII_0>>, а в ответе модели восстанавливаются обратно.
Восстановление работает и в потоковом режиме (stream: true), и в аргументах
function/tool-вызовов: провайдер и модель видят только обезличенный текст,
клиент получает ответ с настоящими значениями.
Одинаковые значения в рамках запроса получают один и тот же плейсхолдер, поэтому
модель сохраняет связность: «позвони <<PII_1>>» и «передай <<PII_1>>» — это
один и тот же человек.
Запрос клиента: Меня зовут Иван Петров, телефон +7 916 245-33-18. Составь подпись к письму.Видит провайдер: Меня зовут <<PII_0>>, телефон <<PII_1>>. Составь подпись к письму.Ответ модели: С уважением, <<PII_0>>, тел. <<PII_1>>Получает клиент: С уважением, Иван Петров, тел. +7 916 245-33-18Что распознаётся
Детектор комбинирует правила с валидацией контрольных сумм (Луна для карт, контрольные цифры ИНН и СНИЛС, mod-97 для IBAN) и две ML-модели для именованных сущностей. Русский язык — основной, имена и названия распознаются во всех падежах и в нижнем регистре.
| Категория | Примеры |
|---|---|
| Имена | ФИО в любом падеже и регистре, фамилия с инициалами, имена в разговорной форме |
| Организации | Названия компаний, банков, учреждений, аббревиатуры |
| Адреса и локации | Города, улицы с номерами домов, полные адреса, квартиры, индексы |
| Документы РФ | Паспорт (все написания), ИНН 10/12 цифр, СНИЛС, ОГРН, ОГРНИП, КПП, кадастровый номер, полис ОМС, код подразделения, свидетельство о рождении, водительское удостоверение |
| Финансы | Карты 13–19 цифр (с валидацией по Луну), срок действия и CVV рядом с номером, расчётные счета, IBAN, криптокошельки BTC/ETH/LTC |
| Контакты | Телефоны России и международные, e-mail, @-аккаунты, ссылки |
| Секреты | Пароли (в том числе в логах и стектрейсах), API-ключи Stripe/OpenAI/Anthropic/GitHub/Google/Slack/AWS, JWT- и Bearer-токены, IP-адреса |
| Даты | Даты рождения в числовых и словесных форматах, год рождения по контексту |
| Коды | Одноразовые коды подтверждения, CVV/CVC по контексту |
Ссылки скрываются целиком и только тогда, когда внутри адреса есть персональные данные (e-mail, телефон, токен в параметрах) — частичная замена внутри URL ломала бы адрес. Обычные ссылки на документацию и сайты остаются как есть.
Подстановка искажённых написаний не отключает распознавание: текст нормализуется до разбора (полноширинные цифры, невидимые символы, URL-кодирование).
Свои паттерны (obfuscate_patterns)
Помимо встроенного детектора можно передать собственные regex-паттерны — для
внутренних идентификаторов, номеров договоров, кодов проектов и всего, что
знает только ваша система. Поле obfuscate_patterns работает вместе с
obfuscate: true:
{ "model": "gpt-4.1", "obfuscate": true, "obfuscate_patterns": [ { "pattern": "ДП-\\d{4}/\\d{4}", "label": "CONTRACT" }, { "pattern": "EMP-(\\d+)", "label": "EMPLOYEE" } ], "messages": [ { "role": "user", "content": "Продли договор ДП-2024/0117 сотрудника EMP-88121" } ]}Модель увидит Продли договор <<PII0>> сотрудника EMP-<<PII1>>, в ответе
значения восстановятся. Правила:
pattern— регулярное выражение (синтаксис Python/PCRE). Если в паттерне есть группа захвата, маскируется только она — окружение остаётся читаемым.label— необязательная метка: заглавные латинские буквы, цифры и подчёркивание, до 16 символов. По умолчаниюCUSTOM.- До 20 паттернов на запрос, длина паттерна — до 500 символов.
- Найденное по вашим паттернам маскируется всегда, независимо от встроенных типов детектора.
Паттерн, который не компилируется, превышает лимиты или выполняется дольше
секунды (защита от катастрофических выражений), отклоняет запрос с ошибкой
400 invalid_obfuscate_patterns и текстом причины — молча пропустить такой
паттерн нельзя: вы считали бы текст замаскированным, а он бы им не был.
Что стоит учитывать
- Плейсхолдеры живут в рамках одного запроса. История диалога передаётся клиентом в каждом запросе целиком и шифруется заново — сквозная нумерация между запросами не требуется.
- Изображения не обрабатываются: персональные данные на картинках уходят провайдеру как есть.
- Обфускация добавляет к запросу время работы детектора — от десятков миллисекунд на короткое сообщение до заметно большего на длинной истории.
- Значение, похожее на идентификатор, но с невалидной контрольной суммой, маскируется, если рядом есть контекстное слово («ИНН», «СНИЛС», «карта»): опечатка не должна приводить к утечке.
Пример
import axios from 'axios'
const { data } = await axios.post( 'https://gptunnel.ru/v1/chat/completions', { model: 'gpt-4.1', obfuscate: true, messages: [ { role: 'user', content: 'Составь договор: заказчик Иванов Пётр Сергеевич, ИНН 771234567890, тел. +7 916 245-33-18', }, ], }, { headers: { Authorization: 'shds-....' } },)
console.log(data.choices[0].message.content)import requests
resp = requests.post( "https://gptunnel.ru/v1/chat/completions", headers={"Authorization": "shds-...."}, json={ "model": "gpt-4.1", "obfuscate": True, "messages": [ { "role": "user", "content": "Составь договор: заказчик Иванов Пётр Сергеевич, " "ИНН 771234567890, тел. +7 916 245-33-18", } ], },)
print(resp.json()["choices"][0]["message"]["content"])curl https://gptunnel.ru/v1/chat/completions \ -H "Authorization: shds-...." \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4.1", "obfuscate": true, "messages": [ { "role": "user", "content": "Составь договор: заказчик Иванов Пётр Сергеевич, ИНН 771234567890, тел. +7 916 245-33-18" } ] }'Ошибка при недоступности сервиса
{ "error": { "message": "PII obfuscation is currently unavailable. Retry the request without `obfuscate`.", "type": "obfuscation_unavailable", "param": null, "code": "obfuscation_unavailable" }}Функция в альфа-тесте и пока предоставляется бесплатно.