---
title: 'Маскирование запросов'
sidebar_label: 'Маскирование запросов'
sidebar_position: 4
description: 'Как работает маскирование запросов к ИИ-моделям, типы распознаваемых данных, режимы маскирования, ошибки, ограничения, как включить маскирование'
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import CopyIcon from '@selectel/docux/icons/copy'

# Маскирование запросов

Маскирование запросов — поиск и скрытие конфиденциальных данных в запросах перед их отправкой к модели.

Сервис распознает основные [типы данных](#sensitive-data-types), например email, номер телефона, номер паспорта. Можно выбрать нужные типы, а также настроить распознавание собственных типов данных.

Распознавание работает на основе регулярных выражений. Проверяются текстовые значения в POST-запросах на эндпоинты:

* `/chat/completions` — текст сообщений, текстовые части мультимодального контента, аргументы функций и поле `prediction`;
* `/images/generations` — текст в поле `prompt`.

Маскирование можно использовать в одном из двух [режимов](#masking-modes) — замена данных или блокировка запроса.

Мы не рекомендуем использовать маскирование как единственный механизм защиты данных. Ограничивайте доступ к API-ключам и не передавайте конфиденциальную информацию без необходимости.

Чтобы использовать маскирование, [включите его](#enable-masking). Маскирование включается отдельно для каждого ИИ-роутера.

## Типы распознаваемых данных \{#sensitive-data-types}

В сервисе есть правила для распознавания следующих типов данных:

* email-адреса;
* российские и международные номера телефонов;
* номера банковских карт с проверкой контрольной суммы по алгоритму Луна;
* СНИЛС с проверкой контрольной суммы;
* ИНН из 10 или 12 цифр с проверкой контрольной суммы;
* серия и номер паспорта РФ;
* API-ключи ИИ-роутера.

Вы также можете настроить распознавание собственных типов данных. Для этого составьте регулярное выражение для распознавания нужных данных и укажите его в тикете при [включении маскирования](#enable-masking).

## Режимы маскирования \{#masking-modes}

Маскирование работает в одном из двух режимов:

* [замена данных](#replacement-mode) — найденные данные заменяются на маркеры-заглушки. Подходит для работы с данными, в которых могут встречаться конфиденциальные;
* [блокировка запроса](#blocking-mode) — при первом найденном вхождении запрос блокируется. Подходит для работы с данными, в которых не должно быть конфиденциальных данных еще до отправки к модели.

### Замена данных \{#replacement-mode}

Найденные конфиденциальные данные в запросе заменяются на маркеры-заглушки вида `[ЗАМЕНЕНО:<тип_данных>]`. Модель получает запрос с замененными данными.

Если встречаются разные вхождения одного типа данных, они получают порядковые номера, например `[ЗАМЕНЕНО:email_1]` и `[ЗАМЕНЕНО:email_2]`. Для числовых значений не учитывается разделение дефисами и пробелами.

:::note

Например, запрос «Напиши ivan@example.com, копия — manager@example.com. Ответить на ivan@example.com.» будет обработан и отправлен модели в виде «Напиши \[ЗАМЕНЕНО:email\_1], копия — \[ЗАМЕНЕНО:email\_2]. Ответить на \[ЗАМЕНЕНО:email\_1]».

:::

При замене данных ответ API не будет содержать дополнительных данных или заголовков.
Менять обработку успешных ответов не требуется.

### Блокировка запроса \{#blocking-mode}

При первом найденном вхождении отклоняется весь запрос. ИИ-роутер возвращает ошибку `guardrail_rejected` с HTTP-кодом `422` в формате JSON-файла и не отправляет запрос к модели. Если запрос потоковый, то ошибка возвращается до начала SSE-потока.

В ответе в заголовке `x-gateway-request-id` возвращается идентификатор запроса. Сохраняйте его в логах приложения для диагностики.

При обработке ответа проверяйте поле `error.code`. Не повторяйте запрос с кодом `guardrail_rejected` автоматически без изменения содержимого.

## Ошибки \{#errors}

Если ИИ-роутер не смог применить правила и запрос нельзя отправить без проверки, клиент получает ошибку с HTTP-кодом `500`:

```json
{
  "error": {
    "type": "server_error",
    "code": "internal_error",
    "message": "Guardrails could not be applied to this request",
    "request_id": "sel-aig-<request_id>"
  }
}
```

Здесь `<request_id>` — идентификатор запроса.

Для ошибки с кодом `500` настройте ограниченное число повторных попыток с увеличением задержки после каждой ошибки. Если ошибка сохраняется, [создайте тикет](https://my.selectel.ru/tickets/create) и в нем укажите идентификатор запроса.

## Ограничения \{#limitations}

Проверка не гарантирует обнаружение всех персональных или конфиденциальных данных.

Так как проверка работает на основе регулярных выражений, то значение останется без изменений, если оно:

* разделено между несколькими полями или частями сообщения;
* закодировано;
* транслитерировано;
* записано словами вместо цифр;
* находится внутри изображения или файла.

Возможны ложные совпадения. Например, правило для распознавания паспорта РФ может распознать как паспорт другой идентификатор из десяти цифр.

## Включить маскирование запросов \{#enable-masking}

1. Если вы хотите использовать маскирование в [режиме](#masking-modes) блокировки запросов, убедитесь, что ваш клиент обрабатывает ошибку `guardrail_rejected` с HTTP-кодом `422` и заголовок `Content-Type: application/json`, в том числе для запросов со `stream: true`.

2. [Создайте тикет](https://my.selectel.ru/tickets/create) для включения маскирования. В тикете укажите:

   * ID ИИ-роутера, можно скопировать в [панели управления](https://my.selectel.ru/ml/default/ai-router): в верхнем меню нажмите **Продукты** → **ИИ-роутер** → в карточке ИИ-роутера под его именем нажмите <CopyIcon />;
   * [режим маскирования](#masking-modes) — замена данных или блокировка запроса;
   * [типы данных](#sensitive-data-types), которые нужно маскировать;
   * если нужно настроить распознавание собственного типа данных — регулярное выражение для поиска этого типа данных;
   * если выбран режим замены данных — желаемое имя маркера.

<Formbricks />
