watermarks-remover — скилл и сервис для удаления ИИ-водяных знаков из текста и файлов

· 2 мин чтения
skills agent-skills privacy security claude-code
📂 Исходный код на GitHub

Скилл для ИИ-агентов и Python-сервис, которые детерминированно удаляют ИИ-метки провенанса из текста и файлов: невидимые символы, статистические водяные знаки, C2PA/EXIF/XMP-метаданные.

watermarks-remover — скилл и сервис для удаления ИИ-водяных знаков из текста и файлов

Современные LLM оставляют в сгенерированном тексте и файлах следы происхождения: невидимые Unicode-символы, статистические водяные знаки в выборе токенов, метаданные C2PA и EXIF. Проект watermarks-remover — это агентский скилл плюс Python-сервис на чистой стандартной библиотеке (без зависимостей), которые убирают такие метки из контента, владельцем которого вы являетесь. Скилл — это «тонкий клиент»: он не содержит кода и управляет всей машинерией по HTTP, поэтому на хосте агента не нужен даже Python. Репозиторий распространяется как плагин Claude Code с собственным маркетплейсом и собирает около 22 тысяч звёзд на GitHub под лицензией MIT.

Три слоя очистки

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

Слой Что убирает Как
A Невидимые Unicode-символы, экзотические пробелы, bidi-символы, tag characters Детерминированные Python-скрипты
B Статистические (сэмплирующие) текстовые водяные знаки Переписывание текста агентом + опциональный хук rewrite_text.py
Файлы C2PA / EXIF / XMP / свойства документов Очистка PNG, JPEG, WebP, AVIF, HEIC, BMP, GIF, TIFF, SVG, PDF, DOCX, XLSX, PPTX, EPUB, ODT, HTML, Markdown, MP4/MOV, WAV, MP3, FLAC

Поддерживаемые экосистемы (на уровне классов меток): Claude, Gemini / SynthID-Text, OpenAI, а также открытые схемы — Kirchenbauer-style (green-list) и keyed-Gumbel/EXP (Aaronson). Актуальный релиз — v0.7.0.

Установка скилла

В Claude Code самый быстрый путь — встроенный маркетплейс плагинов, без клонирования репозитория:

/plugin marketplace add guillaumemeyer/watermarks-remover
/plugin install watermarks-remover@watermarks-remover

Скиллы загружаются с неймспейсом /watermarks-remover:remove-ai-marks и /watermarks-remover:clean-user-facing-text. Для остальных хостов есть универсальный установщик на Python 3.10+ (тоже без зависимостей):

python3 install_skill.py --skill remove-ai-marks --target claude-code

Поддерживаемые цели: личный и проектный Claude Code (~/.claude/skills/ или .claude/skills/ проекта), Cowork / claude.ai / облачные сессии (zip-бандл для загрузки через Customize → Skills) и Cursor (~/.cursor/skills/). Есть даже вариант для Grok через симлинк. Установщик перед записью проверяет скилл по правилам упаковки Agent Skills, бережно сохраняет существующие установки (прошлая версия остаётся как бэкап) и умеет ставить симлинк для живых правок.

Второй скилл, clean-user-facing-text, — автономный и текстовый: он не требует сервиса и возит собственные скрипты Layer A, подходит для документов и веб-копии.

Детерминированная очистка через хук

Скилл — это инструкция: модель сама решает, вызывать ли его, а ведь именно модель и создаёт метки. Хук же исполняется хостом на каждый подходящий вызов инструмента, «сотрудничество» модели не требуется — это детерминированная половина воркфлоу.

Плагин регистрирует PostToolUse-хук на Write|Edit|MultiEdit|NotebookEdit, который прогоняет каждый записанный агентом файл через hook_written_file.py. Два режима:

  • check (по умолчанию) — только сообщает о найденных метках; замечания уходят модели, и она может предложить очистку;
  • clean — вычищает метки на месте и уведомляет модель, что файл на диске изменился.

Режим задаётся в настройках плагина или переменной WATERMARKS_HOOK_MODE=clean. Без плагина хук можно подключить вручную в ~/.claude/settings.json — в README есть готовый JSON-конфиг.

Важно понимать границу возможностей: ни один хук не может переписать сообщение ассистента до того, как вы его прочли. Детерминированная гарантия покрывает файлы, которые агент пишет, плюс pre-commit-гейт для всего, что уходит в git. Текст, существующий только в чат-транскрипте, остаётся в зоне best-effort.

HTTP-сервис

Вся машинерия работает как сервис на стандартной библиотеке Python — это интерфейс, которым пользуется скилл, и точка интеграции для любого веб-приложения:

make serve   # http://127.0.0.1:8765

API включает /health, /capabilities, динамический /openapi.json, а также /inspect, /detect, /clean, /watermark и их batch-версии (до 50 файлов на запрос). Файл передаётся в base64, формат определяется по расширению и magic bytes. Есть опциональная Bearer-аутентификация через WATERMARKS_SERVER_API_KEY; по умолчанию сервис слушает только loopback.

Отдельные endpoints на детекцию (/detect) позволяют прогнать текст через настроенные детекторы водяных знаков, а опции detect_before / detect_after в /clean — измерить, что именно изменила очистка. Детекция «fail-soft»: ненастроенный детектор просто сообщает available: false и никогда не блокирует очистку.

Работа из командной строки

Те же возможности доступны напрямую скриптами:

python3 service/scripts/inspect_file.py draft.md
python3 service/scripts/clean_file.py draft.md -o draft.cleaned.md
python3 service/scripts/clean_file.py photo.png -o photo.cleaned.png
python3 service/scripts/clean_text.py draft.md -o draft.cleaned.md --stats

Хук rewrite_text.py для Layer B по умолчанию только печатает промпт (модель не нужна), а опционально умеет ходить в локальный Ollama или любой OpenAI-совместимый API — ключи читаются только из переменных окружения, никогда из argv.

Заметная черта проекта — защитная механика против порчи данных: текстовые утилиты отказываются обрабатывать бинарные файлы (DOCX, PDF, изображения), а нераспознанные форматы никогда не чистятся автоматически. Раньше clean_text.py мог декодировать сжатые байты контейнера и записать их обратно, уничтожая файл, — теперь такие вызовы завершаются с ошибкой и подсказкой, какой инструмент использовать.

Опциональные тяжёлые бэкенды

Ядро (Layer A, файловые очистители, сервис) требует только Python 3.10+. Для продвинутых сценариев есть опциональные внешние компоненты, которые не бандлятся, а поднимаются из отдельных чекаутов или Docker-образов:

  • SynthID pixel scoring через reverse-SynthID — оценка уверенности для пиксельных водяных знаков Google (только детекция, не удаление);
  • CtrlRegen — удаление пиксельных меток (класс SynthID, StegaStamp, Tree-Ring, StableSignature) через контролируемую регенерацию; нужна GPU и около 10 ГБ моделей;
  • MarkLLM и MarkDiffusion — исследовательские харнессы для контролируемых экспериментов: сгенерировать промаркированный текст/картинку, прогнать очистку и убедиться, что метка исчезла;
  • Keyed-Gumbel (Aaronson EXP) детектор — модель-независимая same-key-проверка для self-hosted движков вроде arbi-serve, чистый stdlib без GPU.

Всё это собирается docker compose с профилями harness и heavy; core-образ публикуется на GHCR.

Честные ограничения

Авторы последовательно проводят мысль: пока вендоры не публикуют официальные детекторы и ключи, никакой инструмент не может честно заверить, что контент «провалит официальную проверку». Отчёты разделяют верифицируемую и best-effort-работу. Статистический водяной знак размазан по выбору токенов, поэтому его удаление — это существенное переписывание текста, а не перестановка абзацев. И переписывание неизбежно деградирует копирайтинг: тональность и точность подменяются выбором переписывающей модели. Отсюда практический совет — для Layer B использовать «неродную» модель, не ту же, что генерировала текст, иначе она может наложить метку заново.

Если всё равно планируете переписывать текст более дешёвой моделью — зачем платить за премиальную? Проще и дешевле сгенерировать сразу дешёвой: результат тот же или лучше.

Кому подойдёт

Инструмент для тех, кто публикует собственный ИИ-ассистированный контент и хочет контролировать его цифровые следы: технические писатели, авторы документации, команды, чьи файлы проходят через агентные пайплайны. Для кодовых баз особенно полезна связка из хука и pre-commit-гейта — очистка становится частью CI, а не ручным действием. Подробности о вендорских метках — в vendor-notes.md и mark-classes.md.

Источник: https://github.com/guillaumemeyer/watermarks-remover