watermarks-remover — скилл и сервис для удаления ИИ-водяных знаков из текста и файлов
📂 Исходный код на GitHubСкилл для ИИ-агентов и Python-сервис, которые детерминированно удаляют ИИ-метки провенанса из текста и файлов: невидимые символы, статистические водяные знаки, C2PA/EXIF/XMP-метаданные.
Современные 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.