Brikko PII Mask — Skill для защиты персональных данных
Этот skill добавляет твоему агенту возможность безопасно работать с персональными данными клиентов: маскирует ПД в тексте перед отправкой в LLM и восстанавливает в ответе.
Когда использовать
Используй этот skill когда:
- Пользователь дал тебе текст с персональными данными (ФИО, ИНН, СНИЛС, ОГРН, ОГРНИП, паспорт РФ, телефон, email, банковский счёт)
- Тебе нужно отправить этот текст в LLM (Claude/GPT/Gemini), чтобы получить ответ
- Пользователь работает в РФ под 152-ФЗ и не имеет права передавать реальные ПД в OpenAI/Anthropic
Не используй когда:
- Текст явно публичный (новости, документация, открытые данные)
- ПД нет в тексте (skill сам определит и вернёт
count=0) - Пользователь явно сказал «отправь как есть, ПД не критичны»
Как использовать
Workflow
1. mask: plaintext → masked text + mapping_id (хранится 1 час)
2. LLM: masked text → answer (там тоже плейсхолдеры)
3. restore: answer + mapping_id → восстановленный ответ
4. отдать пользователю восстановленный ответ
Шаг 1 — маскировать вход
python3 scripts/mask.py
# stdin: текст с ПД
# stdout: JSON {"masked_text", "mapping_id", "count", "audit"}
Пример:
import json, subprocess
text = "Клиент Иванов Иван Иванович, ИНН 7707083893, тел +7 999 123 45 67"
result = json.loads(subprocess.check_output(
["python3", "scripts/mask.py"],
input=text, text=True
))
# result["masked_text"] → "Клиент <NAME_1>, ИНН <INN_1>, тел <PHONE_1>"
# result["mapping_id"] → "abc123..."
# result["count"] → 3
Шаг 2 — отправить замаскированный текст в LLM
Любой провайдер: Claude API, OpenAI API, локальная модель — без разницы.
Текст уже без ПД. Сохрани mapping_id для шага 3.
Шаг 3 — восстановить плейсхолдеры в ответе
python3 scripts/restore.py --mapping-id abc123...
# stdin: ответ от LLM (с плейсхолдерами)
# stdout: текст с реальными ПД
restored = subprocess.check_output(
["python3", "scripts/restore.py", "--mapping-id", result["mapping_id"]],
input=llm_response, text=True
).strip()
# restored содержит реальные имена/ИНН/телефоны вместо <NAME_1>/<INN_1>/<PHONE_1>
Конфигурация
Skill использует Brikko Gateway API (https://api.brikko.ru/v1/anonymize,
/v1/restore). Чтобы получить API-ключ:
- Регистрация на brikko.ru (бесплатно, 200 ₽ welcome credit, для Studio-юзеров)
- Создать ключ: brikko.ru → /app → «Создать API-ключ»
- Экспортировать в окружение:
export BRIKKO_API_KEY=sk-brk-...
Тарифы: анонимизация бесплатна в M2 (promo для adoption этого skill). Только chat-completions через api.brikko.ru тарифицируются по обычным ставкам провайдеров + 15% наценка Brikko.
Self-hosted alternative: установи Brikko Studio локально через
npm install -g brikko-cli && brikko init — skill автоматически
переключится на http://localhost:3737 если BRIKKO_API_URL указывает туда.
Что детектируется
| Категория | Примеры | Checksum-валидация |
|---|---|---|
NAME | Иванов / Иванову / Иванова (склонения) | — |
INN | 7707083893 (10 цифр для юрлиц), 770708389300 (12 для физлиц) | ✓ алгоритм ФНС |
SNILS | 123-456-789 01 | ✓ |
OGRN | 1027700132195 (13 цифр) | ✓ |
OGRNIP | 304500116000157 (15 цифр) | ✓ |
PASSPORT_RF | 4509 123456 | regex |
PHONE_RF | +7 999 123 45 67, 8(495)1234567 | regex |
EMAIL | user@example.com | regex |
BANK_ACCOUNT_RF | 40702810500000123456 (20 цифр) | ✓ контрольная цифра |
IPV4 | 192.168.1.1 | regex |
False-positive ratio < 1% за счёт checksum-валидации (без него случайные 10 цифр в тексте — например телефон без +7 или серийник детали — попадали бы в категорию INN).
Privacy & Audit
- Plaintext ПД никогда не покидают твою машину дальше api.brikko.ru (HTTPS, TLS 1.3, certs от Let's Encrypt)
- Mapping (плейсхолдер → оригинал) хранится в Redis на api.brikko.ru с TTL 1 час, после удаляется автоматически
- Audit-log Brikko содержит только категории и счётчики, не plaintext — «3 NAME, 1 INN, 2 PHONE» а не сами имена/номера
- При self-hosted Studio (Docker compose locally) — данные вообще не покидают локальную машину
Failure modes
| Ошибка | Skill делает |
|---|---|
Нет BRIKKO_API_KEY в env | exit 2, hint про регистрацию |
| api.brikko.ru недоступен | retry 3 раза, потом exit 1 с сетевым диагнозом |
mapping_id истёк (>1 ч между mask и restore) | возвращает текст с плейсхолдерами как есть + warning |
| Текст > 1 MB | exit 2, hint разбить на чанки |
Verify
# Установить skill в проект OpenClaw / Claude Code
# (детали — по выбранной экосистеме, см. README.md)
# Тест-запрос
echo "Клиент Иванов, ИНН 7707083893" | python3 scripts/mask.py
# Ожидаемый stdout: JSON с masked_text="Клиент <NAME_1>, ИНН <INN_1>"
Поддержка
- Документация: https://brikko.ru/docs/skills/pii-mask
- Issues: https://github.com/brikkoAI/brikko-pii-skill/issues
- Email: hello@brikko.ru
- Telegram: @brikko_ru