guillaumemeyer/watermarks-remover
Loại bỏ các dấu xuất xứ AI của nhiều nhà cung cấp: Vệ sinh văn bản Unicode, móc viết lại thống kê và C2PA/siêu dữ liệu từ PNG/JPEG/SVG/PDF/DOCX/HTML/MD
README
_ _ _ ____ ___ ____ ____ _ _ ____ ____ _ _ ____ ____ ____ _ _ ____ _ _ ____ ____
| | | |__| | |___ |__/ |\/| |__| |__/ |_/ [__ __ |__/ |___ |\/| | | | | |___ |__/
|_|_| | | | |___ | \ | | | | | \ | \_ ___] | \ |___ | | |__| \/ |___ | \
loại bỏ hình mờ
Kỹ năng đặc vụ + dịch vụ stdlib Python để thoát y nhãn hiệu xuất xứ AI của nhiều nhà cung cấp từ văn bản và tập tin — để đảm bảo quyền riêng tư và vệ sinh cho nội dung bạn sở hữu. Kỹ năng này là một máy khách mỏng: nó điều khiển máy móc qua HTTP, do đó máy chủ tác nhân không cần Python.
| Lớp | Mục tiêu | Làm thế nào |
|---|---|---|
| A | Unicode vô hình, khoảng trắng kỳ lạ, bidi, ký tự thẻ | Tập lệnh Python xác định |
| B | Hình mờ văn bản thống kê (lấy mẫu mã thông báo) | Đại lý viết lại + tùy chọn rewrite_text.py cái móc |
| Tập tin | Đạo cụ C2PA / EXIF / XMP / tài liệu | PNG, JPEG, WebP, AVIF, HEIC, BMP, GIF, TIFF, SVG, PDF, DOCX, XLSX, PPTX, EPUB, ODT, HTML, Markdown, MP4/MOV/M4A/M4V, WAV, MP3, FLAC |
Nhà cung cấp/hệ sinh thái (cấp lớp): Claude, Gemini / SynthID-Văn bản, OpenAI bề mặt xuất xứ, mở-LLM Dấu hiệu kiểu Kirchenbauer (danh sách xanh) và khóa-Gumbel / EXP (Aaronson).
Bản phát hành mới nhất: v0.5.0
Con đường kỹ năng: skills/remove-ai-marks/
Đường dẫn dịch vụ: service/
(di cư: trước đây remove-claude-marks; gạch chéo bí danh /remove-claude-marks vẫn được ghi lại)
Cài đặt (kỹ năng đại lý)
Tàu kỹ năng không có mã — nó gọi dịch vụ qua HTTP. Cài đặt kỹ năng (chỉ đánh dấu) và khởi động dịch vụ, sau đó đặt WATERMARKS_SERVICE_URL nếu không phải vậy http://127.0.0.1:8765.
In Claude Code, the fastest route is the bundled plugin marketplace — no clone, and it updates in place. Everywhere else, one installer covers every supported host (Python 3.10+ stdlib, no dependencies):
python3 install_skill.py --skill remove-ai-marks --target claude-code
| Máy chủ | Mục tiêu | Đất ở |
|---|---|---|
| Claude Code (personal) | --target claude-code |
~/.claude/skills/<skill> (honors CLAUDE_CONFIG_DIR) |
| Claude Code (dự án) | --target claude-project --project-dir PATH |
PATH/.claude/skills/<skill> |
| Cowork, Claude.ai, cloud sessions, routines | --target cowork |
dist/<skill>.zip để tải lên dưới Customize → Skills |
| Cursor | --target cursor (mặc định) |
~/.cursor/skills/<skill> |
Kỹ năng vận chuyển: remove-ai-marks (full, service-backed) and
clean-user-facing-text (chỉ văn bản, khép kín). --list prints them. Existing installations are preserved unless you pass --force; việc thay thế được thực hiện trước tiên và bản cài đặt trước đó được giữ dưới dạng bản sao lưu có tên duy nhất.
--link symlinks this checkout instead of copying, so edits are picked up live. On Windows, use py install_skill.py ...; cái install-skill.sh wrapper is provided for macOS/Linux shells.
Trước khi viết bất cứ điều gì, trình cài đặt sẽ xác nhận kỹ năng dựa trên
Kỹ năng đại lý packaging rules that Claude.ai uploads and the Skills API enforce: spec-only frontmatter (name, description,
license, compatibility, metadata, allowed-tools), a lowercase hyphenated
name of at most 64 characters matching the directory, a non-empty
description of at most 1024 characters. The Cowork bundle additionally has to fit the 30 MB upload limit, which the packager enforces.
Automatic cleaning via hook (deterministic)
A skill is an instruction: the model decides whether to invoke it, and the model is the thing producing the marks. A cái móc is executed by the harness on every matching tool call, cooperation not required. That makes the hook the deterministic half of this workflow.
The plugin registers a PostToolUse hook on Write|Edit|MultiEdit|NotebookEdit
that runs service/scripts/hook_written_file.py
against the file the agent just wrote. Two modes, matching the pre-commit convention of check-by-default:
| Chế độ | Behaviour |
|---|---|
check (mặc định) |
Reports provenance marks, leaves the file alone. Findings go to the model (exit 2), so it can offer to clean them. |
clean |
Strips the marks in place, then tells the model the file on disk changed. |
Set the mode from the plugin's settings (Chế độ móc trong /plugin manage, read by the hook as CLAUDE_PLUGIN_OPTION_HOOK_MODE), or with
WATERMARKS_HOOK_MODE=clean in the environment. The hook command deliberately does không interpolate ${user_config.hook_mode}: Claude Code refuses to run a hook that references an option the user has never opened /plugin manage to set — a declared default does not satisfy it — so interpolating it would mean the hook silently never runs on a fresh install. Detection reuses audit_libcủa
scan_file / is_actionable, so the hook, the pre-commit gate, and the CI SARIF export agree on what counts as actionable; cleaning shells out to
clean_file.py, so no cleaning logic is duplicated. clean mode writes to a sibling temp file and swaps only on a real difference, so files that were already clean keep their mtime and don't retrigger file watchers.
Without the plugin, wire it in ~/.claude/settings.json (or a project
.claude/settings.json) yourself:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit|MultiEdit|NotebookEdit",
"hooks": [
{
"type": "command",
"command": "python3",
"args": ["/path/to/watermarks-remover/service/scripts/hook_written_file.py",
"--mode", "check"],
"timeout": 30
}
]
}
]
}
}
On Windows, replace python3 với py.
What a hook cannot do. No hook can rewrite the assistant's chat message before you read it. Claude Code's Stop hook receives last_assistant_message
read-only, and there is no pre-send filter for final responses — the same limit this project already documents for Cursor rules. So the deterministic guarantee covers files the agent writes, plus the
pre-commit gate cho bất kỳ thứ gì đang được đưa vào git. Văn bản chỉ tồn tại trong bản ghi cuộc trò chuyện vẫn phụ thuộc vào quy trình làm việc của kỹ năng, dựa trên hướng dẫn mô hình và do đó phải nỗ lực hết sức.
Plugin Claude Code (thị trường)
Kho lưu trữ cũng là một Claude Code phần bổ trợ và một plugin đơn
marketplace (.claude-plugin/), vì vậy cả hai kỹ năng đều cài đặt và cập nhật bằng hai lệnh, không cần bản sao hoặc tập lệnh:
/plugin marketplace add guillaumemeyer/watermarks-remover
/plugin install watermarks-remover@watermarks-remover
Các kỹ năng sau đó tải không gian tên: /watermarks-remover:remove-ai-marks và
/watermarks-remover:clean-user-facing-text (the bare /remove-ai-marks also works when nothing else claims the name). /plugin marketplace update watermarks-remover pulls later versions. The same works from the CLI with
claude plugin marketplace add … / claude plugin install …và từ thanh toán cục bộ bằng cách đi qua một đường dẫn thay vì owner/repo.
Người bảo trì: make plugin-validate chạy claude plugin validate . --strict
against both manifests; tests/test_plugin_manifest.py bao gồm các tệp giống nhau mà không cần CLI.
Claude Code
# Personal — available in all your projects
python3 install_skill.py --skill remove-ai-marks --target claude-code
# or: make install-claude-code-skill
# Project — commit .claude/skills/ to share it with the repo
python3 install_skill.py --skill remove-ai-marks --target claude-project \
--project-dir /path/to/project
# or: make install-claude-project-skill PROJECT=/path/to/project
Claude Code picks up personal and project skills without a restart; /skills
liệt kê những gì nó đã tải. Gọi với /remove-ai-marks or ask to “strip AI watermarks / C2PA / Claude marks / SynthID-class text.” A project install is also what cloud sessions
đọc, vì họ sao chép kho lưu trữ và tải nó .claude/skills/.
Cowork (và Claude.ai, phiên đám mây, quy trình)
Các buổi làm việc chung làm không đọc ~/.claude/skills on your machine — they load the skills enabled for your Claude.ai account, synced when the session starts. So install there by uploading a bundle:
python3 install_skill.py --skill remove-ai-marks --target cowork
# writes dist/remove-ai-marks.zip (make package-cowork-skill)
Sau đó, trong ứng dụng Máy tính để bàn Claude, hãy mở Customize → Skills → Add và tải zip lên (cài đặt kỹ năng tương tự trên Claude.ai cũng hoạt động). Gói này có thể tái tạo và chứa một gói cấp cao nhất remove-ai-marks/ directory with
SKILL.md at its root, which is the layout the upload expects.
Khả năng tiếp cận dịch vụ ở đây quan trọng hơn so với cài đặt cục bộ: kỹ năng này là một ứng dụng khách HTTP mỏng, do đó phiên phải có khả năng tiếp cận WATERMARKS_SERVICE_URL. Cowork sessions that run locally on your machine reach a local make serve; cloud sessions and routines run remotely and need a service URL reachable from there (and WATERMARKS_SERVER_API_KEY đặt trên đó). Nếu bạn muốn một kỹ năng không có dịch vụ gì cả, hãy tải lên clean-user-facing-text thay vào đó - nó chỉ ở dạng văn bản và gửi các tập lệnh riêng:
python3 install_skill.py --skill clean-user-facing-text --target cowork
Grok
# Grok Build / project-local
mkdir -p .grok/skills
ln -sfn "$(pwd)/skills/remove-ai-marks" .grok/skills/remove-ai-marks
# User-global Grok
mkdir -p ~/.grok/skills
ln -sfn "$(pwd)/skills/remove-ai-marks" ~/.grok/skills/remove-ai-marks
Optional text-only skill
skills/clean-user-facing-text/ là một kỹ năng khép kín dành cho các bản thảo, tài liệu và bản sao web được ủy quyền. Nó không bao gồm hình ảnh, C2PA, dịch vụ và công cụ mô hình bên ngoài, đồng thời chạy các tập lệnh Lớp A được cung cấp riêng thay vì gọi dịch vụ.
python3 install_skill.py --skill clean-user-facing-text --target claude-code
python3 install_skill.py --skill clean-user-facing-text --target cursor
Việc gọi kỹ năng được chọn theo mô hình. Các dự án áp dụng rõ ràng quy trình làm việc này trong Cursor cũng có thể sao chép quy tắc tùy chọn:
mkdir -p /path/to/project/.cursor/rules
cp integrations/cursor/clean-user-facing-text.mdc \
/path/to/project/.cursor/rules/clean-user-facing-text.mdc
Đối với tất cả các dự án, hãy đặt cùng một hướng dẫn trong Cursor Quy tắc người dùng thay vào đó. Các quy tắc cải thiện tính nhất quán nhưng vẫn giữ nguyên các hướng dẫn mẫu; Cursor không hiển thị bộ lọc gửi trước xác định cho phản hồi trò chuyện cuối cùng.
Bắt đầu dịch vụ
Đường dẫn nhanh nhất là máy chủ HTTP cục bộ (chỉ Python 3.10+ stdlib — không có deps, không có Docker):
make serve # http://127.0.0.1:8765
# or directly:
python3 service/scripts/server.py --host 127.0.0.1 --port 8765
Windows (không có Docker)
Xem docs/windows-autostart.md để tự động khởi động dịch vụ khi đăng nhập Windows mà không cần Docker.
Để biết toàn bộ cơ sở hạ tầng (lõi + khai thác tùy chọn/phụ trợ nặng), hãy xem Docker / soạn bên dưới.
Các công cụ hệ thống tùy chọn (được sử dụng tự động khi có — được cài đặt sẵn trong hình ảnh lõi Docker):
| Công cụ | Vai trò |
|---|---|
c2patool |
Kiểm tra bảng kê khai C2PA |
exiftool |
Dải siêu dữ liệu còn lại (đặc biệt. PDF) |
qpdf |
Xây dựng lại cấu trúc PDF - bắt buộc để có một dải PDF thực sự (xem bên dưới) |
Kịch bản cốt lõi cần Python 3.10+ chỉ stdlib. Cuộc gọi mô hình lớp B là tùy chọn.
Sử dụng nhanh (tập lệnh)
SCRIPTS=service/scripts
# Unified inspect / clean
python3 "$SCRIPTS/inspect_file.py" draft.md
python3 "$SCRIPTS/clean_file.py" draft.md -o draft.cleaned.md
python3 "$SCRIPTS/clean_file.py" photo.png -o photo.cleaned.png
python3 "$SCRIPTS/clean_file.py" notes.docx -o notes.cleaned.docx
# Text Layer A
python3 "$SCRIPTS/inspect_text.py" draft.md
python3 "$SCRIPTS/clean_text.py" draft.md -o draft.cleaned.md --stats
# Layer B rewrite hook (default: print prompt only — no model required)
python3 "$SCRIPTS/rewrite_text.py" draft.md --backend print-prompt --strength paraphrase
# Optional local Ollama (loopback only by default — remote endpoints require
# WATERMARKS_REWRITE_ALLOW_REMOTE=1 or --allow-remote):
# WATERMARKS_REWRITE_BACKEND=ollama WATERMARKS_REWRITE_MODEL=llama3.2 \
# python3 "$SCRIPTS/rewrite_text.py" draft.md -o draft.rewritten.md
# API keys are read from WATERMARKS_REWRITE_API_KEY only (never argv).
# Images
python3 "$SCRIPTS/inspect_image.py" shot.png
python3 "$SCRIPTS/clean_image.py" shot.png -o shot.cleaned.png
Công cụ văn bản từ chối đầu vào nhị phân
inspect_text.py, clean_text.py và rewrite_text.py thao tác trên văn bản. Chỉ vào một .docx, .pdf hoặc hình ảnh mà họ sử dụng để giải mã các byte nén và báo cáo bất kỳ điểm mã nào bị loại bỏ - nhiễu theo dõi quá trình nén chứ không phải nội dung - và clean_text.py sau đó ghi lại những byte bị xáo trộn đó, hủy tập tin. Bây giờ họ từ chối đầu vào nhị phân và đặt tên cho công cụ xử lý nó:
python3 "$SCRIPTS/inspect_text.py" report.docx
# refusing to treat report.docx as text: it looks like a ZIP container (DOCX, ODT, …).
# Use inspect_file.py / clean_file.py, which route by format,
# or pass --force-text to scan the raw bytes anyway.
Việc phát hiện được thực hiện bằng số ma thuật cộng với tỷ lệ byte điều khiển, do đó, văn bản ở dạng mã hóa không phải UTF-8 vẫn tiếp tục hoạt động. --force-text ghi đè nó ở khắp mọi nơi.
Các định dạng không được nhận dạng sẽ không bao giờ được tự động làm sạch
classify() các byte nhãn không khớp với định dạng văn bản, hình ảnh hoặc vùng chứa được hỗ trợ như unknown — nó không còn quay trở lại "văn bản" nữa. Ở chế độ tự động
clean_file.py từ chối các tệp như vậy (thoát 2, không có đầu ra nào được ghi) thay vì giải mã chúng dưới dạng UTF-8 và ghi lại các byte bị sai lệch; --as text hoặc
--force-text là những lựa chọn tham gia rõ ràng. inspect_file.py báo cáo tập tin như unknown (thoát 0) và câu trả lời dịch vụ HTTP /inspect với
kind: "unknown" nhưng từ chối /clean có định dạng không xác định (400 - gửi tên tệp có phần mở rộng đã biết, ví dụ: notes.txt).
dịch vụ HTTP
Máy móc tương tự chạy như một dịch vụ stdlib HTTP (service/scripts/server.py) — giao diện mà kỹ năng sử dụng và cách bất kỳ ứng dụng web nào có thể tích hợp mà không cần bán hàng:
| phương pháp | Đường dẫn | Thân hình | Trả lại |
|---|---|---|---|
| NHẬN | /health |
— | {"ok": true, "version": ...} |
| NHẬN | /capabilities |
— | các công cụ/phụ trợ tùy chọn có thể sử dụng được (mỗi công cụ đều được thử nghiệm theo phiên bản, không chỉ tìm thấy trên PATH) |
| NHẬN | /openapi.json |
— | Thông số OpenAPI 3.0.3 được tạo động |
| BÀI ĐĂNG | /inspect |
{"file": "<base64>", "name": "notes.md"} |
{"ok", "kind", "suspicious", "report"} |
| BÀI ĐĂNG | /detect |
{"file": "<base64>", "name": "notes.txt"} |
{"ok", "kind", "detections": [...]} |
| BÀI ĐĂNG | /clean |
{"file": "<base64>", "name": "notes.md", "options": {...}} |
{"ok", "kind", "cleaned": "<base64>", "report"} |
| BÀI ĐĂNG | /inspect/batch |
{"files": [{"file": "<base64>", "name": "notes.md"}, ...]} |
{"ok", "results": [{"name", "ok", "kind", "suspicious", "report"}, ...]} |
| BÀI ĐĂNG | /clean/batch |
{"files": [{"file": "<base64>", "name": "notes.md", "options": {...}}, ...]} |
{"ok", "results": [{"name", "ok", "kind", "cleaned": "<base64>", "report"}, ...]} |
Điểm cuối hàng loạt lặp lại cùng một đường dẫn cho mỗi tệp như /inspect và /clean, giới hạn ở WATERMARKS_MAX_BATCH_FILES tập tin theo yêu cầu (mặc định 50). Một mục nhập không đúng định dạng (base64 sai, tùy chọn không xác định, định dạng không được nhận dạng) hiển thị dưới dạng mục nhập đó "ok": false với một "error" chuỗi - nó không bao giờ hủy bỏ phần còn lại của lô.
WM="http://127.0.0.1:8765"
curl -s "$WM/health" # {"ok": true, "version": "..."}
curl -s "$WM/openapi.json" # machine-readable OpenAPI 3.0.3 contract
curl -s -X POST "$WM/clean" -H 'Content-Type: application/json' \
-d "{\"file\": \"$(base64 < notes.md | tr -d '\n')\", \"name\": \"notes.md\"}"
Các tuyến dịch vụ theo phần mở rộng tên tệp rồi đến byte ma thuật, do đó văn bản/hình ảnh/vùng chứa được tự động phát hiện. Đặt WATERMARKS_SERVER_API_KEY yêu cầu Authorization: Bearer <key> trên mọi yêu cầu. Theo mặc định, liên kết chỉ lặp lại (--host để ghi đè); dành cho một mạng đáng tin cậy.
Phát hiện hình mờ (/detect và detect_before / detect_after)
Việc phát hiện là một bước riêng biệt so với việc dọn dẹp — dịch vụ không bao giờ gọi API của nhà cung cấp trừ khi bạn yêu cầu:
POST /detectchạy trình phát hiện hình mờ đã được định cấu hình trên một tệp. Văn bản → máy dò nhà cung cấp + kiểu dáng; hình ảnh → Điểm pixel SynthID./inspectchấp nhận chọn tham gia"detect": truecờ nối thêm kết quả dò tìm vào báo cáo văn bản (và có thể lậtsuspicious)./cleanchấp nhận"detect_before"/"detect_after"các tùy chọn để chấm điểm đầu vào và đầu ra đã được làm sạch, do đó bạn có thể đo lường mức độ làm sạch thực sự đã thay đổi.
Trình phát hiện văn bản (xem /capabilities → text_detectors):
| Máy dò | Kích hoạt bởi | Ghi chú |
|---|---|---|
markllm |
MARKLLM_DIR (kiểm tra máy chủ) |
Khai thác nghiên cứu (sơ đồ KGW / SynthID), chỉ có cùng cấu hình - không phải là lời tiên tri của nhà cung cấp. |
gumbel |
WATERMARKS_GUMBEL_KEY |
Phát lại cùng khóa không có mô hình của sơ đồ có khóa-Gumbel (Aaronson EXP) (xem detect_gumbel.py), chỉ stdlib - các công cụ tự lưu trữ như arbi-serve; chỉ cùng một khóa, không phải là lời tiên tri của nhà cung cấp. |
claude-text |
- (giữ chỗ) | Anthropic đã thông báo phát hiện hình mờ API; đường may này kích hoạt khi nó được vận chuyển. |
Chấm điểm hình ảnh: khi nào WATERMARKS_SYNTHID_SCORER_URL được thiết lập, dịch vụ sẽ chấm điểm hình ảnh thông qua wr-synthid-score sidecar (cấu hình nặng); với một người địa phương REVERSE_SYNTHID_DIR nó sử dụng thanh toán trực tiếp. Phát hiện không thành công: báo cáo trình phát hiện không được định cấu hình, hết thời gian chờ hoặc bị lỗi
{"available": false, "error": ...} và không bao giờ chặn việc dọn dẹp.
Docker / soạn
Hình ảnh được công bố (GHCR):
| Thẻ hình ảnh | Nội dung | Đã xuất bản? |
|---|---|---|
ghcr.io/guillaumemeyer/watermarks-remover:<tag> / :latest |
Dịch vụ lõi HTTP + tất cả trình dọn dẹp + Exiftool / qpdf / c2patool | Có |
…:markllm-<tag> / :markllm-latest |
Khai thác hình mờ văn bản MarkLLM (ngược dòng Apache-2.0) | Có |
…:markdiffusion-<tag> / :markdiffusion-latest |
Khai thác hình ảnh MarkDiffusion (ngược dòng Apache-2.0) | Có |
watermarks-remover-ctrlregen:local |
Xóa pixel CtrlRegen - chưa bao giờ được xuất bản (noai-watermark tàu không có GIẤY PHÉP) |
Chỉ xây dựng cục bộ |
watermarks-remover-synthid-scorer:local |
trình ghi điểm SynthID ngược — chưa bao giờ được xuất bản (Giấy phép nghiên cứu phi thương mại) | Chỉ bản dựng cục bộ (CLI cầu thủ ghi bàn + tùy chọn wr-synthid-score HTTP xe sidecar bên dưới heavy hồ sơ) |
Xây dựng và chạy dịch vụ cốt lõi:
make docker-core-build
docker run --rm -p 127.0.0.1:8765:8765 --read-only --tmpfs /tmp watermarks-remover
# any CLI stays runnable by overriding the command:
docker run --rm -v "$(pwd):/data" watermarks-remover \
/app/scripts/clean_file.py /data/notes.md -o /data/notes.cleaned.md
Đưa lên toàn bộ cơ sở hạ tầng:
docker compose up -d # core HTTP service only
docker compose --profile harness up -d # + markllm / markdiffusion
docker compose --profile heavy up -d # + ctrlregen / synthid (local builds)
docker compose --profile harness --profile heavy up -d # all services
Ngăn xếp soạn thư ánh xạ dịch vụ cốt lõi tới 127.0.0.1:8765. Dịch vụ khai thác/nặng là CLI một lần - gọi bằng docker compose run --rm <service> … khi bạn cần xác minh hoặc công việc pixel.
Xác thực ngăn xếp đang chạy (chỉ mã thoát, không có đầu ra nếu thành công):
make compose-check # or: ./compose-check.sh
Séc wr-core qua GET /health và chạy từng dây nịt/dịch vụ hạng nặng với --help, yêu cầu thoát 0.
Cấu hình (env vars cho soạn thảo Docker)
Không có gì được yêu cầu để làm sạch văn bản tùy ý — dịch vụ cốt lõi hoạt động ngay lập tức:
echo "Hello\u200bWorld\u00ad!" > /tmp/sample.txt
curl -s -X POST http://127.0.0.1:8765/clean -H 'Content-Type: application/json' \
-d "{\"file\": \"$(base64 < /tmp/sample.txt | tr -d '\n')\", \"name\": \"sample.txt\"}"
Mọi thứ khác đều là tùy chọn và tồn tại trong một .env tập tin ở thư mục gốc repo. docker compose tự động tải .env và nội suy ${VAR} tài liệu tham khảo trong compose.yaml từ đó (xuất khẩu vỏ giành chiến thắng .env nếu cả hai đều được đặt).
cp .env.example .env # then edit
docker compose up -d # picks up .env automatically
.env là bị bỏ qua (từ chối theo mặc định) - không bao giờ cam kết. Đối với các lần chạy CLI phía máy chủ (rewrite_text.py, kỹ năng), xuất cùng một tệp vào môi trường:
set -a; . ./.env; set +a; python3 service/scripts/rewrite_text.py /tmp/x.txt -o /tmp/x.rewritten.txt
| Var | Tiếp cận | Mục đích |
|---|---|---|
WATERMARKS_SERVER_API_KEY |
wr-core (thông qua soạn thư environment) |
Yêu cầu Authorization: Bearer <key> trên HTTP API |
WATERMARKS_GEMINI_* |
— | Đã xóa vào tháng 8 năm 2026: Google đã ngừng tạo hình mờ văn bản SynthID trên API (xem vendor-notes.md) |
WATERMARKS_SYNTHID_SCORER_URL |
wr-core |
Điểm lõi ở wr-synthid-score sidecar để chấm điểm hình ảnh SynthID (ví dụ: http://wr-synthid-score:8766 dưới hồ sơ nặng nề) |
WATERMARKS_SYNTHID_SCORER_API_KEY |
wr-core + wr-synthid-score |
Khóa mang chung cho xe ghi điểm (trống = không xác thực) |
WATERMARKS_MARKLLM_SCHEME |
text_detectors.py (chủ nhà) |
Chương trình MarkLLM dành cho /detect: kgw (mặc định) / synthid |
HF_TOKEN |
khai thác/dịch vụ nặng | Mã thông báo Hugging Face cho các mô hình có kiểm soát |
WATERMARKS_SERVICE_URL |
chỉ khách hàng (kỹ năng / cuộn tròn) | Nơi tiếp cận dịch vụ; mặc định http://127.0.0.1:8765 |
WATERMARKS_REWRITE_BACKEND |
rewrite_text.py cái móc |
print-prompt (mặc định) / ollama / openai-compatible |
WATERMARKS_REWRITE_MODEL |
rewrite_text.py cái móc |
Tên mẫu (ví dụ: deepseek-v4-flash) |
WATERMARKS_REWRITE_BASE_URL |
rewrite_text.py cái móc |
Cơ sở API (ví dụ: https://api.deepseek.com) |
WATERMARKS_REWRITE_API_KEY |
rewrite_text.py cái móc |
Khóa API - chỉ env, không bao giờ trên argv |
WATERMARKS_REWRITE_ALLOW_REMOTE |
rewrite_text.py cái móc |
1 để cho phép các điểm cuối không lặp lại |
WATERMARKS_REWRITE_REASONING_EFFORT |
rewrite_text.py cái móc |
none (mặc định) / low / medium / high / off |
WATERMARKS_GUMBEL_KEY |
detect_gumbel.py / text_detectors.py |
Khóa bí mật để phát lại cùng khóa có khóa-Gumbel (EXP) (ví dụ: 0x…); được ưu tiên hơn argv - không bao giờ đăng nhập |
Lớp B được điều phối bởi tác nhân trong kỹ năng (nó viết lại bằng mô hình của chính nó), do đó WATERMARKS_REWRITE_* vars chỉ cần thiết khi lái xe rewrite_text.py trực tiếp.
Hình ảnh được xuất bản tự động trên v* thẻ thông qua .github/workflows/release-images.yml.
Tính điểm pixel SynthID tùy chọn
inspect_image.py và clean_image.py có thể báo cáo điểm tin cậy SynthID miền pixel khi kiểm tra bên ngoài
aloshdenny/reverse-SynthID
có sẵn. Người ghi bàn là không được đóng gói: nó được tải trong thời gian chạy từ quá trình thanh toán của bạn và mã của nó vẫn theo Giấy phép Nghiên cứu phi thương mại của dự án thượng nguồn.
Tùy chọn 1: bootstrap một lệnh (không có Docker)
SCRIPTS=service/scripts
# Clones upstream, creates a venv, and installs scorer-only dependencies.
"$SCRIPTS/setup_synthid.sh"
# Score an image (default checkout: ~/reverse-SynthID).
REVERSE_SYNTHID_DIR=~/reverse-SynthID \
~/reverse-SynthID/.venv/bin/python "$SCRIPTS/score_synthid.py" shot.png
# Or surface the score from inspect / clean (same venv Python).
REVERSE_SYNTHID_DIR=~/reverse-SynthID \
~/reverse-SynthID/.venv/bin/python "$SCRIPTS/inspect_image.py" shot.png
setup_synthid.sh chấp nhận --dir PATH, --ref REFvà --full (cài đầy đủ bản upstream requirements.txt, điều này cho biết thêm torch/diffusers đối với đường vòng VAE ngược dòng, dự án này không sử dụng).
Trên Windows sử dụng setup_synthid.ps1 (-Dir, -Ref, -Full), tạo ra venv tại .venv\Scripts\ - cách bố trí image_meta.py đã tìm kiếm rồi
os.name == "nt".
Tùy chọn 2: bản dựng Docker cục bộ
make docker-synthid-build
# Run unprivileged and with a read-only rootfs; the scorer only needs to read
# /data and write to stdout/tmp.
docker run --rm \
--user "$(id -u):$(id -g)" \
--read-only --tmpfs /tmp \
-v "$(pwd):/data" \
watermarks-remover-synthid-scorer /data/shot.png
Hình ảnh được xây dựng cục bộ từ nguồn ngược dòng tại thời điểm xây dựng. Nó không được xuất bản nên không phân phối lại mã ngược dòng.
Tùy chọn 3: Xe sidecar của cầu thủ ghi bàn HTTP (Docker soạn)
Dưới heavy lập hồ sơ ngăn xếp soạn thư cũng chạy trình ghi điểm dưới dạng xe phụ HTTP (wr-synthid-score) vì vậy dịch vụ cốt lõi được xuất bản có thể chấm điểm hình ảnh trước/sau khi làm sạch mà không cần đóng gói mã ngược dòng phi thương mại. điểm wr-core vào đó và chia sẻ một khóa mang (xem .env.example):
# .env
WATERMARKS_SYNTHID_SCORER_URL=http://wr-synthid-score:8766
WATERMARKS_SYNTHID_SCORER_API_KEY=change-me
docker compose --profile heavy up -d
Sau đó POST /clean với {"options": {"detect_before": true, "detect_after": true}} trả lại synthid_before / synthid_after trong báo cáo và POST /detect trên một hình ảnh sẽ trả về điểm SynthID. Fail-soft: nếu sidecar bị hỏng hoặc chưa được định cấu hình, sẽ có báo cáo
{"available": false, "error": ...} và việc dọn dẹp vẫn thành công.
Sử dụng tính điểm V4 artifacts/spectral_codebook_v4.npz từ thanh toán ngược dòng (`220 MB). Đây là chỉ phát hiện/cho điểm - nó không xóa hình mờ pixel.
Tùy chọn loại bỏ pixel CtrlRegen
cho miền pixel hình mờ hình ảnh (SynthID-class, StegaStamp, Tree-Ring, StableSignature), một chương trình phụ trợ bên ngoài tùy chọn chạy đường ống CtrlRegen (tái tạo có thể điều khiển bằng Bộ chuyển đổi IP ControlNet + DINOv2). Phần phụ trợ là
mertizci/noai-watermark, việc triển khai lại ICLR 2025 được duy trì
CtrlRegen phương pháp xếp gạch tự động.
Phần phụ trợ là không được đóng gói và không gửi tệp GIẤY PHÉP, vì vậy nó được coi là được bảo lưu mọi quyền: nó được sao chép tại một cam kết được ghim và được tải trong thời gian chạy. Các chân phụ thuộc thời kỳ nghiên cứu của nó (requirements-ctrlregen.txt - ví dụ:
transformers==4.37.2, diffusers==0.27.2) mang các tư vấn đã xuất bản và có chủ ý không cập nhật, vì vậy chúng chỉ được cài đặt bên trong venv chuyên dụng mà tập lệnh này tạo ra và không bao giờ được đưa vào hình ảnh dịch vụ chính;
setup_ctrlregen.sh cũng xác minh lại cam kết đã ghim trên các lần thanh toán hiện có, không chỉ các bản sao mới.
Khởi động
SCRIPTS=service/scripts
# Clones upstream (pinned commit), creates a venv, installs torch + deps.
"$SCRIPTS/setup_ctrlregen.sh"
# Standalone removal (default checkout: ~/noai-watermark).
NOAI_WATERMARK_DIR=~/noai-watermark \
~/noai-watermark/.venv/bin/python "$SCRIPTS/clean_ctrlregen.py" shot.png -o shot.ctrlregen.png
Trên Windows sử dụng setup_ctrlregen.ps1 (cờ giống như -Dir, -Ref, -Python); venv đáp xuống .venv\Scripts\, cái nào clean_image.py đã giải quyết rồi. Nó thăm dò các chỉ số bánh xe PyTorch đã xuất bản và chọn chỉ số cao nhất bằng hoặc thấp hơn phiên bản CUDA nvidia-smi bản in thực sự tồn tại - con số đó là mức tối đa người lái xe hỗ trợ và trình điều khiển tương thích ngược, vì vậy trình điều khiển báo cáo 13.1 (không được xuất bản cu131) lượt cài đặt cu130. Dưới khả năng tính toán 7.5 nó buộc cu126, chỉ mục cuối cùng có bánh xe vẫn mang hạt nhân Maxwell/Pascal/Volta. Nó cài đặt torch và torchvision
cùng nhau từ chỉ mục đó để cài đặt phụ thuộc không thể hoán đổi chúng cho các bản dựng CPU từ PyPI, sau đó xác minh sau khi cài đặt torch.cuda.is_available()
là đúng — nếu phát hiện thấy GPU nhưng đèn pin chỉ kết thúc với CPU, tập lệnh sẽ cảnh báo lớn và thoát ra khác 0 thay vì giả vờ thiết lập thành công.
Từ clean_image.py
NOAI_WATERMARK_DIR=~/noai-watermark \
~/noai-watermark/.venv/bin/python "$SCRIPTS/clean_image.py" shot.png \
-o shot.cleaned.png --remove-pixel ctrlregen
Thứ tự thao tác: dải siêu dữ liệu trước tiên, sau đó loại bỏ pixel CtrlRegen, sau đó là điểm SynthID đảo ngược tùy chọn trước/sau (khi REVERSE_SYNTHID_DIR cũng được thiết lập).
Sức mạnh được bảo thủ theo mặc định (--ctrlregen-strength 0.25), vì cường độ cao hơn sẽ loại bỏ nhiều hình mờ hơn nhưng tái tạo lại hình ảnh nhiều hơn. Tài liệu cài đặt trước: 0.15 tối thiểu / 0.25 mặc định / 0.35 cân bằng /
0.5 hung hăng / 0.7 max (mặc định phụ trợ là 0,5). --ctrlregen-steps
mặc định là 50 (bước khử nhiễu hiệu quả ≈ bước × cường độ).
Kích thước hình ảnh (giới hạn gốc 512×512)
CtrlRegen là một ControlNet khuếch tán ổn định 512 × 512. Phần phụ trợ giải quyết vấn đề này cho các đầu vào tùy ý, do đó không có ô bổ sung nào được hiển thị ở đây:
- 512 điểm ảnh: một lần - cắt giữa/thay đổi kích thước thành 512, tạo lại, thay đổi kích thước trở lại.
- >512px: xếp chồng tự động (gạch 512 px, chồng chéo 192 px), chiều rộng/chiều cao được căn chỉnh theo bội số của 8, sau đó là các đường nối cosine.
- Hoặc là đường dẫn: đầu ra được thay đổi kích thước về kích thước ban đầu và khớp màu với ảnh gốc.
Hình ảnh rất lớn (ví dụ: 4K) tạo ra nhiều ô, do đó, sẽ tăng tỷ lệ theo số lượng ô (VRAM chậm hơn và cao hơn). Giảm quy mô đầu vào lớn trước khi thực tế; kích thước ô và sự chồng chéo được mã hóa cứng ngược dòng và không hiển thị dưới dạng cờ.
Tính toán, mô hình kiểm soát và xác minh
Mong đợi ~10 GB lượt tải xuống mô hình; nên sử dụng GPU và CPU chạy chậm. Một số mô hình thượng nguồn được kiểm soát, vì vậy xuất khẩu HF_TOKEN (chỉ env - không bao giờ argv). clean_ctrlregen.py từ chối tự động cài đặt phụ thuộc; chạy
setup_ctrlregen.sh đầu tiên.
Không có trình phát hiện cục bộ nào cho StegaStamp/Tree-Ring/StableSignature, vì vậy tín hiệu cục bộ duy nhất là điểm SynthID ngược (đại diện thay thế). Khi có sẵn,
clean_image.py --remove-pixel ctrlregen báo cáo điểm trước/sau; việc kiểm tra Google SynthID chính thức vẫn là cơ quan có thẩm quyền cuối cùng.
Docker
make docker-ctrlregen-build
docker run --rm -e HF_TOKEN="$HF_TOKEN" \
--user "$(id -u):$(id -g)" \
-v "$(pwd):/data" \
watermarks-remover-ctrlregen /data/shot.png -o /data/shot.ctrlregen.png
Xác minh hình mờ văn bản MarkLLM tùy chọn
cho thí nghiệm được kiểm soát, dây quấn bên ngoài tùy chọn
THU-BPM/MarkLLM (Apache-2.0) để tạo hình mờ cho văn bản kiểm tra và phát hiện lại nó sau khi viết lại Lớp B - ví dụ: chứng minh rằng dấu KGW (Kirchenbauer, hàng "open-LLM" của bạn) hoặc SynthID-Text (hàng Gemini) biến mất khi bạn viết lại. Đó là một khai thác xác minh, không phải là một lời tiên tri: Phát hiện MarkLLM chỉ có hiệu lực đối với giống nhau cấu hình lược đồ + khóa được sử dụng khi tạo và không thể chứng nhận trình phát hiện nhà cung cấp sẽ không thành công.
Phần phụ trợ là không được đóng gói. setup_markllm.sh sao chép ngược dòng tại một cam kết được ghim, tạo venv và cài đặt các dep được ghim (đèn pin + máy biến áp); mô hình tính điểm (mặc định facebook/opt-1.3b, Apache-2.0) tải xuống từ Hugging Face trong lần chạy đầu tiên.
SCRIPTS=service/scripts
# Bootstrap (clones upstream, creates ~/MarkLLM/.venv, installs deps).
"$SCRIPTS/setup_markllm.sh"
# Generate watermarked + unwatermarked sample text under the KGW scheme.
MARKLLM_DIR=~/MarkLLM \
~/MarkLLM/.venv/bin/python "$SCRIPTS/detect_text_watermark.py" watermark prompt.txt \
--scheme kgw -o wm.txt -o2 plain.txt
# Detect the scheme mark in a text file.
MARKLLM_DIR=~/MarkLLM \
~/MarkLLM/.venv/bin/python "$SCRIPTS/detect_text_watermark.py" detect wm.txt --scheme kgw --json
Xác minh xung quanh việc viết lại Lớp B: vượt qua --markllm-scheme để
rewrite_text.py (với --markllm-dir) và nó ghi lại việc phát hiện MarkLLM trước/sau cộng với một cleared cờ:
export WATERMARKS_REWRITE_BACKEND=ollama WATERMARKS_REWRITE_MODEL=llama3.2
MARKLLM_DIR=~/MarkLLM \
python3 "$SCRIPTS/rewrite_text.py" wm.txt -o wm.rewritten.txt \
--markllm-scheme kgw --markllm-dir "$HOME/MarkLLM" --json-stats
Viết lại lặp đi lặp lại theo hướng dẫn phát hiện: Lớp B hiện viết lại lặp đi lặp lại và dừng ngay khi nỗ lực vượt qua đánh giá. Mỗi vòng đánh giá tạo ra
--candidates các biến thể (mặc định 1, WATERMARKS_REWRITE_CANDIDATES) và --max-loops giới hạn số vòng chạy trước khi biến thể nỗ lực cao nhất được trả về (mặc định 1, WATERMARKS_REWRITE_LOOPS). Mỗi biến thể là một lệnh gọi viết lại cộng với một đánh giá và một vòng sẽ kết thúc sớm ở lần thử đầu tiên mà người đánh giá báo cáo là không có hình chìm mờ — vì vậy hãy nâng cao --max-loops thử lại các biến thể mới cho đến khi quá trình đánh giá thành công (việc viết lại sạch thông thường sẽ tốn một lần thử). Người đánh giá được chọn theo mức độ ưu tiên:
- MarkLLM — phát hiện nghiên cứu cùng cấu hình, khi
--markllm-schemeđược thông qua (với--markllm-dir). Một khe cắm trình phát hiện nhà cung cấp được dành riêng phía trên MarkLLM cho trình phát hiện văn bản SynthID của Google. Google đã ngừng sử dụng trình phát hiện văn bản SynthID trên API vào tháng 8 năm 2026 — một điểm cuối của nhà cung cấp trong tương lai có thể cắm vào đó. - phân kỳ từ vựng bigram-Jaccard - khi không có máy dò nào được cấu hình; không có kết quả đạt/không đạt, vì vậy mọi nỗ lực đều được tạo ra và kết quả có sự khác biệt về mặt từ vựng nhất sẽ được chọn (hành vi ban đầu).
--json-stats báo cáo người đánh giá, các bản ghi đã thực hiện, đạt/không đạt và mỗi lần thử:
{
"evaluator": "markllm",
"candidates": 1,
"max_loops": 2,
"attempts_made": 2,
"passed": true,
"candidate_scores": [
{
"lexical_divergence": 0.91,
"selection_score": 0.91,
"selected": false,
"passed": false,
"evaluation": {"detector": "markllm", "available": true, "scheme": "kgw",
"is_watermarked": true, "score": 4.3, "threshold": 3.0}
},
{
"lexical_divergence": 0.84,
"selection_score": 0.84,
"selected": true,
"passed": true,
"evaluation": {"detector": "markllm", "available": true, "scheme": "kgw",
"is_watermarked": false, "score": 1.7, "threshold": 3.0}
}
],
"markllm": {"scheme": "kgw", "before": {"...": "..."}, "after": {"...": "..."},
"cleared": true, "note": "same-config only"}
}
Trình phát hiện không được định cấu hình, hết thời gian chờ hoặc có lỗi sẽ mang lại kết quả
"available": false mục nhập với một error lý do và không bao giờ viết lại thất bại - nỗ lực đó đơn giản là không thể vượt qua và vòng lặp quay trở lại lựa chọn phân kỳ từ vựng. Khi đã hết mức tối đa mà không vượt qua, nỗ lực có ít hình mờ nhất (điểm thấp nhất) sẽ được trả về là nỗ lực tốt nhất kèm theo ghi chú.
Nếu phần phụ trợ chưa được định cấu hình hoặc phần phụ trợ của nó bị thiếu thì quá trình viết lại sẽ tiếp tục và việc xác minh ghi chú báo cáo sẽ không khả dụng. Nên sử dụng GPU; CPU chạy hoạt động nhưng chậm và tải xuống mô hình có dung lượng vài GB.
Núm tăng cứng:
--offlinetrên bộ điều hợp (hoặc bất kỳ lần chạy MarkLLM nào) chỉ tải mô hình tính điểm từ bộ nhớ đệm Hugging Face — đầu ra mạng không có; thất bại nhanh nếu không được lưu trữ. Mã từ xa tùy chỉnh không bao giờ được thực thi (máy biến áptrust_remote_codekhông bao giờ được kích hoạt).WATERMARKS_MARKLLM_RLIMIT_AS=<bytes>(env, POSIX) áp dụng giới hạn không gian địa chỉ cho quy trình con của trình phát hiện MarkLLM. Tắt theo mặc định vì đèn pin/CUDA thường cần không gian địa chỉ lớn.- Các tệp cấu hình được giới hạn ở mức 1 MiB; kiểm tra ngược dòng và hình ảnh cơ sở được ghim bởi SHA/thông báo.
Docker
make docker-markllm-build
docker run --rm --user "$(id -u):$(id -g)" -v "$(pwd):/data" \
watermarks-remover-markllm detect /data/wm.txt --scheme kgw --json
Xác minh cùng khóa Keyed-Gumbel (Aaronson EXP)
Báo cáo kỹ thuật của ARBI mô tả hình mờ văn bản có khóa-Gumbel ("số mũ") - hiện đang được vận chuyển trong công cụ phục vụ arbi nguồn mở (ARBI_WATERMARK_KEY) — trong đó tiếng ồn của bộ lấy mẫu bắt nguồn từ hàm băm có khóa của cửa sổ ngữ cảnh 4 mã thông báo cuối cùng. Phát hiện là một
phát lại không có mô hình: tính toán lại u = PRF(Hash(key, window), token) chỉ từ văn bản và kiểm tra đuôi Gamma, do đó nó không cần GPU, mô hình hoặc nhật ký. Kho lưu trữ này vận chuyển máy dò đó dưới dạng detect_gumbel.py (chỉ stdlib; giá trị p là nhận dạng tổng Poisson chính xác cho hình dạng Gamma số nguyên):
# Text mode (deterministic word/run tokenizer) — quick checks and rewrite-loop
# evaluation; exact replay against a real engine needs its tokenizer:
python3 service/scripts/detect_gumbel.py draft.txt --key 0x... --json
# Exact replay: pass the engine's token ids (JSON array or one per line).
python3 service/scripts/detect_gumbel.py ids.json --tokens --key 0x... --json
Lời cảnh báo trung thực tương tự như MarkLLM: đây là một phát lại cùng một phím — chỉ hợp lệ đối với cùng một khóa, mã thông báo và bố cục PRF được sử dụng khi tạo và kết quả âm tính không có ý nghĩa gì. Bố cục HMAC-SHA256 ở đây là một bản khởi tạo có thể kiểm tra được, không tương thích bit với bất kỳ nhân công cụ cụ thể nào (xem chuỗi tài liệu mô-đun để biết những gì cần điều chỉnh để phát lại chính xác).
Viết lại theo hướng dẫn phát hiện: vượt qua --gumbel-key để rewrite_text.py
(env: WATERMARKS_GUMBEL_KEY, được ưu tiên) và vòng lặp viết lại được điều khiển bởi tính năng phát lại Gumbel cùng khóa — mức độ ưu tiên của người đánh giá trở thành gumbel > MarkLLM > phân kỳ từ vựng — với a gumbel.before/after/cleared báo cáo:
export WATERMARKS_REWRITE_BACKEND=ollama WATERMARKS_REWRITE_MODEL=llama3.2
export WATERMARKS_GUMBEL_KEY=0x...
python3 "$SCRIPTS/rewrite_text.py" wm.txt -o wm.rewritten.txt --json-stats
Chìa khóa không bao giờ xuất hiện trong số liệu thống kê hoặc nhật ký. Người vận hành tự lưu trữ giữ chìa khóa động cơ của họ có thể xác minh việc viết lại đã xóa dấu Gumbel; những người khác chỉ coi Lớp B là nỗ lực cao nhất.
Điểm chuẩn loại bỏ văn bản SynthID tùy chọn
bench_synthid_text.py đo lường mức độ hiệu quả của việc ghi lại Lớp B xóa các hình mờ của lớp văn bản SynthID và chi phí là bao nhiêu. Nó tạo ra các mẫu có hình mờ + không có hình mờ bằng lược đồ MarkLLM SynthID (phát hiện cùng cấu hình, kiểm soát độ chính xác), chạy các biến thể viết lại của bạn (cường độ × lần thử viết lại tối đa; vòng lặp dừng sớm khi vượt qua) cùng với các điều khiển (không xóa, chỉ có Lớp A, kiểm tra đóng dấu lại tùy chọn) và viết một bản ghi có thể chia sẻ report.md /
results.json / results.csv. Hướng dẫn đầy đủ:
docs/synthid-text-benchmark.md.
Yêu cầu thanh toán MarkLLM (setup_markllm.sh / MARKLLM_DIR) và một phần phụ trợ viết lại. Mô hình viết lại là LLM bạn định cấu hình - giống nhau
rewrite_text.py hỗ trợ việc sử dụng kỹ năng. Mặc định của MarkLLM
facebook/opt-1.3b (--markllm-model) chỉ là bộ tạo/phát hiện hình mờ; nó không bao giờ viết lại. Định cấu hình mô hình viết lại thông qua các biến env hoặc cờ chuẩn (chúng phản ánh
bảng cấu hình ở trên):
| biến thể Env | Cờ điểm chuẩn | Mặc định | Ý nghĩa |
|---|---|---|---|
WATERMARKS_REWRITE_BACKEND |
--rewrite-backend |
ollama |
ollama hoặc openai-compatible |
WATERMARKS_REWRITE_MODEL |
--rewrite-model |
(bắt buộc) | LLM thực hiện việc viết lại (ví dụ: llama3.2, deepseek-v4-flash) |
WATERMARKS_REWRITE_BASE_URL |
--rewrite-base-url |
http://127.0.0.1:11434 |
Điểm cuối; mặc định Ollama là loopback |
WATERMARKS_REWRITE_API_KEY |
--rewrite-api-key |
— | Khóa API (chỉ env trong tiến trình con, không bao giờ argv) |
WATERMARKS_REWRITE_ALLOW_REMOTE=1 |
--rewrite-allow-remote |
tắt | Bắt buộc phải gửi nội dung đến các điểm cuối không vòng lặp |
# Ollama (loopback):
python3 service/scripts/bench_synthid_text.py --markllm-dir ~/MarkLLM \
--rewrite-backend ollama --rewrite-model llama3.2
# OpenAI-compatible API (remote):
WATERMARKS_REWRITE_API_KEY=... python3 service/scripts/bench_synthid_text.py \
--markllm-dir ~/MarkLLM --rewrite-backend openai-compatible \
--rewrite-model deepseek-v4-flash --rewrite-base-url https://api.deepseek.com \
--rewrite-allow-remote
Sử dụng một mô hình không có nguồn gốc để viết lại (không viết lại với cùng một mô hình có hình mờ đã tạo ra văn bản) hoặc việc viết lại có thể đóng dấu lại đầu ra; --restamp-control biện pháp này.
Khai thác hình mờ hình ảnh MarkDiffusion tùy chọn
cho thí nghiệm có kiểm soát trên hình ảnh, dây quấn bên ngoài tùy chọn
THU-BPM/MarkDiffusion (Apache-2.0), một hình mờ sáng tạo bộ công cụ dành cho các mô hình khuếch tán tiềm ẩn (nó nhúng các dấu hiệu - nó không loại bỏ chúng). Chúng tôi sử dụng nó cho ba việc:
- Khai thác xác minh (như MarkLLM, nhưng dành cho hình ảnh): tạo hình mờ cho hình ảnh thử nghiệm bằng sơ đồ, chạy loại bỏ và phát hiện lại bằng giống nhau cấu hình lược đồ - ví dụ: chứng minh dấu hiệu lớp Tree-Ring rõ ràng dưới đường ống của bạn. Đó là một khai thác xác minh, không phải là một lời tiên tri: việc phát hiện yêu cầu mô hình tạo (và các khóa cho các lược đồ dựa trên khóa), do đó, nó không thể chứng nhận trình phát hiện của nhà cung cấp sẽ không thành công trên một hình ảnh tùy ý.
- Công cụ loại bỏ pixel tùy chọn: nó
DiffusionPurificationcuộc tấn công tái sinh được phơi bày nhưclean_image.py --remove-pixel diffusion, một giải pháp thay thế cho CtrlRegen. Đó là mù tái tạo (không có điều hòa ControlNet), do đó, nó làm trôi nội dung hình ảnh nhiều hơn CtrlRegen - mặc định cường độ bảo thủ (0.3), được coi là dự phòng/so sánh, không bao giờ là sự đảm bảo. - Máy dò sơ đồ tương tự cục bộ đối với các dấu loại Tree-Ring, lấp đầy một phần khoảng trống "không có trình phát hiện cục bộ cho StegaStamp/Tree-Ring/StableSignature" (nó bao gồm Tree-Ring/Ring-ID/Gaussian-Shading, v.v., không phải StegaStamp/StableSignature/SynthID-media).
Phần phụ trợ là không được đóng gói. setup_markdiffusion.sh tạo một venv và cài đặt markdiffusion==1.0.2 từ PyPI (được ghim), với đèn pin được cài đặt từ chỉ mục nền tảng bên phải; --checkout thay vào đó hãy cài đặt một bản sao có thể chỉnh sửa tại một cam kết được ghim. Mô hình Khuếch tán Ổn định (mặc định
huanzi05/stable-diffusion-2-1-base) lượt tải xuống từ Hugging Face trong lần chạy đầu tiên.
SCRIPTS=service/scripts
# Bootstrap (PyPI pin default; creates ~/markdiffusion/.venv, installs deps).
"$SCRIPTS/setup_markdiffusion.sh"
# 1. Generate a Tree-Ring watermarked image (+ unwatermarked control).
echo "a red fox in snow" > /tmp/prompt.txt
MARKDIFFUSION_DIR=~/markdiffusion \
~/markdiffusion/.venv/bin/python "$SCRIPTS/markdiffusion_harness.py" watermark \
/tmp/prompt.txt -o wm.png -o2 plain.png --scheme tr --json
# 2. Remove with the DiffusionPurification regeneration attack.
MARKDIFFUSION_DIR=~/markdiffusion \
~/markdiffusion/.venv/bin/python "$SCRIPTS/markdiffusion_harness.py" purify \
wm.png -o wm.purified.png --purification-strength 0.3 --json
# 3. Re-detect with the SAME scheme config.
MARKDIFFUSION_DIR=~/markdiffusion \
~/markdiffusion/.venv/bin/python "$SCRIPTS/markdiffusion_harness.py" detect \
wm.purified.png --scheme tr --detector-type l1_distance --json
Hoặc chạy quá trình lọc như một phần của quy trình hình ảnh thông thường:
MARKDIFFUSION_DIR=~/markdiffusion \
~/markdiffusion/.venv/bin/python "$SCRIPTS/clean_image.py" shot.png \
-o shot.cleaned.png --remove-pixel diffusion
Các núm tăng cường phản ánh dây đai MarkLLM: --offline chỉ tải mô hình từ bộ đệm Hugging Face (đầu ra mạng bằng 0, không có mã từ xa), HF_TOKEN
chỉ là env (không bao giờ argv), cấu hình thuật toán được giới hạn ở 1 MiB và quy trình con nhận được giới hạn tài nguyên cao hơn tương tự như CtrlRegen.
Docker
make docker-markdiffusion-build
docker run --rm --user "$(id -u):$(id -g)" -v "$(pwd):/data" \
watermarks-remover-markdiffusion detect /data/wm.png --scheme tr --json
Hình ảnh cài đặt đèn pin CPU; Người dùng CUDA nên chạy setup_markdiffusion.sh
thay vào đó là trên máy chủ. Tải xuống mô hình vẫn đạt trung tâm HF trong lần chạy đầu tiên.
Ma trận bảo hiểm
| Kênh | Claude | Gemini/SynthID | OpenAI | Mở-LLM |
|---|---|---|---|---|
| Văn bản dựa trên Unicode/chỉnh sửa | Lớp A | Lớp A | Lớp A | Lớp A |
| Văn bản lấy mẫu thống kê | Nỗ lực tốt nhất của Lớp B (đường nối Claude khi phát hiện của Anthropic API) | Nỗ lực tối đa của Lớp B (+ Khai thác cùng cấu hình MarkLLM; Google đã ngừng phát hiện nhà cung cấp vào tháng 8 năm 2026) | Lớp B nếu có | Nỗ lực tối đa của Lớp B + khai thác MarkLLM tùy chọn |
| C2PA/siêu dữ liệu tệp | Có (các định dạng được liệt kê) | Có khi có mặt | Có khi có mặt | Có khi có mặt |
| Dấu hiệu hình ảnh pixel | Ngoài phạm vi | Điểm SynthID tùy chọn + loại bỏ CtrlRegen (bên ngoài); tùy chọn phát hiện cùng sơ đồ MarkDiffusion + Loại bỏ DiffusionPurification (bên ngoài) | Ngoài phạm vi | Tùy chọn loại bỏ CtrlRegen / MarkDiffusion (bên ngoài) |
| Đào tạo backdoor | Ngoài phạm vi | Ngoài phạm vi | Ngoài phạm vi | Ngoài phạm vi |
Chi tiết: skills/remove-ai-marks/references/vendor-notes.md, mark-classes.md.
Cách đánh dấu văn bản hoạt động (ngắn)
Hình mờ LLM hiện đại thường ẩn tín hiệu trong token nào được chọn (xu hướng tạo/lấy mẫu), không chỉ ở các ký tự vô hình. Các lược đồ dựa trên chỉnh sửa đưa vào các quy tắc Unicode hoặc từ đồng nghĩa. Đề án tập tin đính kèm C2PA hoặc siêu dữ liệu của trình tạo.
- Lớp A loại bỏ các sóng mang Unicode dựa trên chỉnh sửa (có thể kiểm tra được).
- Lớp B các cuộc tấn công lấy mẫu hình mờ thông qua việc viết lại nhiều (nỗ lực cao nhất; các cuộc tấn công theo tiêu chuẩn văn học như diễn giải/dịch ngược).
- Trình dọn dẹp tập tin loại bỏ C2PA/XMP/props khỏi các vùng chứa được hỗ trợ.
Cho đến khi nhà cung cấp gửi máy dò và chìa khóa công cộng, không có công cụ nào có thể chứng nhận một cách trung thực "điều này không thành công trong việc kiểm tra chính thức." Các báo cáo phải tách biệt công việc có thể kiểm chứng và nỗ lực tốt nhất.
thích một không có nguồn gốc mô hình cho Lớp B (không viết lại văn bản Claude bằng Claude nếu bạn đang cố tránh dán nhãn lại).
Tuyên bố miễn trừ trách nhiệm: chi phí loại bỏ hình mờ văn bản là bao nhiêu
Hình mờ văn bản tồn tại trong chính cách diễn đạt: tín hiệu được trải rộng trên các lựa chọn mã thông báo, vì vậy gần như mọi câu đều mang một chút tín hiệu đó. Hai hậu quả xảy ra sau đó và đó là lý do tại sao Lớp B được mô tả một cách trung thực là nỗ lực hết mình chứ không phải là một cục tẩy thần kỳ.
Loại bỏ có nghĩa là viết lại, không phải tái cấu trúc. Việc xáo trộn các đoạn văn, thay đổi tiêu đề hoặc các thao tác chỉnh sửa nhẹ hầu như không làm thay đổi tín hiệu. Việc loại bỏ dấu thống kê yêu cầu phải viết lại một phần đáng kể của văn bản - theo từng câu chứ không phải từng phần.
Viết lại từ làm giảm chất lượng bản sao. Bất kỳ bản viết lại nào cũng thay thế các lựa chọn từ ban đầu bằng mô hình viết lại, giúp làm phẳng giọng điệu, giọng nói và độ chính xác. Trên bản sao sản xuất (SEO, tiếp thị, công việc với khách hàng), sự xuống cấp đó là có thật và thường được nhìn thấy đối với những người quan tâm nhất đến bài viết. Nó giống như lấy văn bản từ một mô hình cấp cao nhất và yêu cầu một mô hình kém năng lực hơn viết lại từ đầu: kết quả không thể vượt quá mức trần của mô hình viết lại.
Điều này dẫn đến câu hỏi đầy đủ trung thực:
Nếu kế hoạch vẫn là viết lại văn bản bằng một mẫu rẻ hơn thì tại sao ngay từ đầu lại phải trả tiền cho một mẫu cao cấp? Việc tạo trực tiếp bằng mô hình rẻ hơn sẽ đơn giản hơn, rẻ hơn và tạo ra kết quả cuối cùng tương tự — hoặc tốt hơn —.
Lớp B có ý nghĩa khi bạn đặc biệt muốn có mô hình cao cấp suy nghĩ và soạn thảo và chấp nhận giấy phép viết lại để đáp ứng yêu cầu vệ sinh hoặc quyền riêng tư - không phải là một con đường rẻ tiền để viết văn bản không có dấu.
Khi nào nên bỏ qua Lớp B:
- Chất lượng quan trọng hơn vệ sinh: sử dụng đường dẫn không mất dữ liệu - Bộ lọc Unicode lớp A cộng với trình dọn dẹp siêu dữ liệu tệp - và giữ nguyên văn xuôi gốc.
- Dù sao cũng viết lại: sử dụng một không có nguồn gốc mô hình (viết lại bằng mô hình gốc có thể đóng dấu lại văn bản) và ghi nhớ rủi ro còn sót lại - không công cụ nào có thể chứng nhận trình phát hiện của nhà cung cấp sẽ thất bại.
Định dạng tệp
| định dạng | Kiểm tra | Sạch sẽ |
|---|---|---|
| PNG / JPEG / WebP | Khối C2PA / APP11 / RIFF C2PA, gợi ý AI XMP |
Bỏ phân đoạn siêu dữ liệu |
| AVIF / HEIC | ISOBMFF jumb / XMP uuid hộp |
Hộp thả |
| BMP | Theo sau các byte không phải hình ảnh (không có kênh chuẩn hóa) | Cắt bớt siêu dữ liệu ở cuối, sửa trường kích thước tệp |
| GIF | Phần mở rộng ứng dụng Comment/XMP | Bỏ bình luận & XMP, giữ lại NETSCAPE2.0 vòng lặp |
| TIFF (cổ điển + BigTIFF) | Thẻ IFD: XMP, EXIF, GPS, IPTC, MakerNote | Thả thẻ, không tải trọng, giữ lại dải |
| SVG | <metadata>, XMP |
Khối dải |
| Byte/XMP + công cụ tùy chọn | Exiftool sau đó qpdf, sau đó kịch bản ma đối với siêu dữ liệu bên trong các hình ảnh được nhúng; mỗi công cụ bị thiếu sẽ làm suy giảm một lớp khác nhau (dải tài liệu, viết lại cấu trúc, hình ảnh nhúng) | |
| DOCX | docProps / customXml | Xóa đạo cụ, thả customXml |
| EPUB | Siêu dữ liệu OPF, meta XHTML/JSON-LD, phương tiện được nhúng | Xóa OPF, loại bỏ meta XHTML, làm sạch phương tiện + Lớp A (bỏ qua các phần được mã hóa) |
| ODT | meta.xml | Trình tạo thả / meta AI-ish |
| HTML | meta, JSON-LD, dữ liệu-ai* | Loại bỏ thẻ/attrs |
| Giảm giá | YAML phím AI hàng đầu | Thả phím + Thân lớp A |
| MP4 / MOV / M4A / M4V | ISOBMFF jumb/uuid hộp (cơ chế tương tự như AVIF/HEIC) + moov/udta thẻ máy phát điện |
Hộp thả |
| WAV | RIFF C2PA / LIST INFO khối, nhúng id3\x20 đoạn |
Thả khối |
| MP3 | Khung ID3v2 (v2.3/v2.4 trên mỗi khung hình; toàn bộ thẻ v2.2) | Thả các khung hoặc toàn bộ thẻ phù hợp |
| FLAC | Tệp kê khai C2PA trong ID3v2 GEOB frame |
Thả khung phù hợp hoặc toàn bộ thẻ ID3v2 |
Hỗ trợ FLAC bao gồm sóng mang ID3v2 được tiêu chuẩn hóa của C2PA. Các khối siêu dữ liệu FLAC gốc, Nhận xét Vorbis và hình mờ miền dạng sóng không bị ảnh hưởng.
Tại sao PDF cần qpdf, không chỉ Exiftool
ExifTool ghi tệp PDF tăng dần. exiftool -all= nối thêm một
%BeginExifToolUpdate khối giải phóng đối tượng Thông tin và loại bỏ /Info từ đoạn giới thiệu - nhưng các byte siêu dữ liệu gốc vẫn giữ nguyên nguyên văn trong tệp và chính Exiftool có thể hoàn tác chỉnh sửa bằng -PDF-update:all=. Lệnh thoát
0, người xem không hiển thị siêu dữ liệu và tệp sẽ bị lớn hơn, đó là lời kể.
Đối với một công cụ loại bỏ xuất xứ bị rò rỉ thầm lặng, vì vậy clean_pdf theo sau thẻ Exiftool với qpdf --linearize, sắp xếp lại tài liệu từ biểu đồ đối tượng của nó và loại bỏ các đối tượng hiện không được tham chiếu. không có qpdf
cài xong thì vẫn chạy nhưng nó báo như thế này:
warning: exiftool PDF edits are incremental — the original metadata bytes
remain recoverable; install qpdf for a structural rewrite
Tại sao qpdf không đủ cho hình ảnh bên trong PDF
Cả hai bước trên đều hoạt động trên tài liệu: từ điển Thông tin, gói XMP, biểu đồ đối tượng. Cả hai đều không chuyển sang hình ảnh XObject, do đó, bản quét hoặc bản xuất Photoshop - một trang là một JPEG lớn - giữ lại mọi thứ mà hình ảnh mang theo. Trên một tệp PDF thực do Photoshop xuất ra, để lại 27 thẻ sau khi xóa "thành công", IFD0:Software, dấu thời gian chụp và hình thu nhỏ xem trước trong số đó; một bảng kê khai C2PA được đính kèm với cùng một hình ảnh cũng tồn tại.
Vì vậy clean_pdf thêm đường chuyền thứ ba, deep_images, được điều khiển bởi Ghostscript's
pdfwrite. Nó chạy theo hai bậc và dừng ngay khi tệp sạch:
- Không mất mát.
pdfwritevới tính năng truyền qua sẽ xây dựng lại tài liệu từ biểu đồ đối tượng trong khi sao chép từng byte dữ liệu hình ảnh đã nén - được xác minh bằng cách băm các luồng trước và sau. Thao tác này sẽ xóa mọi thứ trong tệp PDF bao quanh hình ảnh. Truyền qua bao gồm các codec mà Ghostscript hỗ trợ cho nó, JPEG (DCTDecode) và JPEG2000 (JPXDecode); Các hình ảnh Flate, CCITT và LZW được giải mã và mã hóa lại, trong thực tế, điều này không bị mất đối với các codec đó nhưng không giống hệt byte.neverlà tùy chọn dành cho tài liệu có luồng phải được giữ nguyên. - Mã hóa lại, chỉ dựa trên bằng chứng. Bất cứ thứ gì tồn tại trong các phân đoạn APPn riêng của JPEG — EXIF trong APP1, tệp kê khai C2PA trong APP11, tài nguyên Photoshop trong APP13 — di chuyển theo các byte mà nó được gắn vào, do đó, quá trình truyền qua sẽ bảo tồn nó. Bậc 2 chạy cùng một lượt với tính năng chuyển qua bị tắt và chỉ khi bậc 1 rõ ràng đã để lại thứ gì đó phía sau: điểm đánh dấu AI/C2PA ở bất kỳ chế độ nào, hoặc, dưới
always, mọi siêu dữ liệu APPn còn sót lại. APP0 (JFIF) và APP2 (ICC) được để riêng - phần đầu tiên mang tính cấu trúc và phần thứ hai quyết định cách đọc màu sắc. Điểm ảnh được sử dụng cho bằng chứng chứ không bao giờ để nghi ngờ.
deep_images mất auto (mặc định: chỉ bậc 1 khi điểm đánh dấu tồn tại trong dải tài liệu, sau đó là bậc 2 nếu chúng tồn tại), always (rung 1 for every PDF, escalating to rung 2 for camera and editor EXIF too), lossless (rung 1 only — never recompress, and report whatever survives through the usual
still_has_c2pa / post_findings trường) và never. An unrecognised value is rejected rather than quietly treated as auto. Báo cáo cho biết bậc thang nào chạy qua meta.deep_image_pass và meta.images_reencoded, and when the pass is skipped it names the option that would go further:
deep image pass not needed for AI/C2PA markers; pass deep_images="always"
to also clear non-AI EXIF inside images
Nếu không cài đặt Ghostscript, bản sạch vẫn chạy và cho biết những gì nó không thể đạt được:
warning: metadata inside embedded images left in place; install ghostscript
for the deep image pass
Hình mờ miền pixel loại bỏ hiện có sẵn dưới dạng phụ trợ CtrlRegen bên ngoài tùy chọn (xem ở trên); nó là một chất tẩy tái sinh, không phải là một sự đảm bảo. Liên kết mềm C2PA (hình mờ trong nội dung có thể liên kết lại bảng kê khai Thông tin xác thực nội dung từ xa sau khi siêu dữ liệu bị xóa) vẫn còn ngoài phạm vi. Tước C2PA ràng buộc cứng không không xóa các kênh đó.
Rủi ro còn sót lại sau khi làm sạch
Công cụ này báo cáo có thể kiểm chứng được xóa (số lượng Unicode, hành động siêu dữ liệu) và nỗ lực hết mình Lớp B viết lại. Nó không thể chứng nhận rằng máy dò của nhà cung cấp sẽ thất bại.
Để tự kiểm tra các tín hiệu dư (tùy chọn, bên ngoài):
| Kênh | Những gì chúng tôi loại bỏ | Những gì có thể còn lại | Kiểm tra bên ngoài (ví dụ) |
|---|---|---|---|
| C2PA / EXIF / XMP ràng buộc cứng | Có | Dấu viền mềm/điểm ảnh | c2patool, Xác minh thông tin xác thực nội dung |
| Phương tiện lớp SynthID | Loại bỏ pixel tùy chọn (CtrlRegen bên ngoài); điểm địa phương khác | Hình mờ âm thanh/video; hình mờ pixel còn sót lại sau khi xóa | Các công cụ của nhà cung cấp (ví dụ: ID tổng hợp của Google / Máy dò Vertex nếu được cung cấp); tùy chọn địa phương SynthID đảo ngược người ghi bàn |
| văn bản thống kê | Viết lại nỗ lực tốt nhất | Điểm mạnh sau chỉnh sửa nhẹ nhàng | Không có máy dò phổ quát công cộng; công cụ của nhà cung cấp khi có sẵn |
Bối cảnh hai lớp của ngành (C2PA + hình mờ không thể nhận thấy): Viện AI PM hướng dẫn.
Tùy chọn loại bỏ (tóm tắt)
| Tùy chọn | Xóa | Ghi chú |
|---|---|---|
| Xóa Unicode (Lớp A) | ZWSP, bidi, thẻ, không gian kỳ lạ, … | Mặc định an toàn cho văn bản |
| Viết lại (Lớp B) | Dấu mã thông báo thống kê (nỗ lực tốt nhất) | Luôn được cung cấp bởi kỹ năng; phong cách chi phí - xem Tuyên bố miễn trừ trách nhiệm |
| Dải vùng chứa/siêu dữ liệu | Xuất xứ tập tin | Xem bảng định dạng |
| Loại bỏ pixel CtrlRegen (tùy chọn) | Dấu hình ảnh miền pixel (SynthID-class, StegaStamp, Tree-Ring, StableSignature) | Phụ trợ bên ngoài; tính toán nặng; mặc định sức mạnh bảo thủ |
| Loại bỏ pixel DiffusionPurification (tùy chọn) | Dấu hình ảnh miền pixel (Loại vòng cây) | Phần phụ trợ MarkDiffusion; tái tạo mù (trôi nhiều hơn CtrlRegen); mặc định sức mạnh bảo thủ |
| Mô hình địa phương trọng lượng mở | Tránh dán tem lại với mẫu gốc | Phương án vận hành thay thế |
Ma trận: skills/remove-ai-marks/references/removal-matrix.md.
Đạo đức và tuyên bố từ chối trách nhiệm
Xem skills/remove-ai-marks/references/ethics.md. Để bảo mật và nghiên cứu về của bạn nội dung - không phải gian lận học thuật hoặc tuyên bố sai lầm “do con người viết”.
Sử dụng có trách nhiệm: Dự án này dành cho nội dung bạn sở hữu hoặc được phép xử lý. Người dùng phải tuân thủ các quy định của địa phương và sử dụng nó một cách có trách nhiệm. Các nhà phát triển từ chối mọi trách nhiệm pháp lý đối với việc người dùng có thể lạm dụng.
Hệ sinh thái
Các dự án của bên thứ ba bao bọc hoặc bổ sung cho kho lưu trữ này, được liệt kê chỉ để khám phá. Chúng không được duy trì, xác nhận hoặc hỗ trợ bởi dự án này. Dự án này không xem xét mã của họ, xác nhận hành vi hoặc đảm bảo của họ hay chịu trách nhiệm về bất kỳ điều gì bạn cài đặt hoặc chạy từ danh sách này. Mỗi dự án được quản lý bởi giấy phép, người bảo trì và tài liệu riêng — hãy đọc chúng trước khi sử dụng.
MetaClean - GUI trên máy tính để bàn
MetaClean là một ứng dụng máy tính để bàn Rust/Tauri độc lập được MIT cấp phép (Windows, macOS, Linux) cung cấp GUI gốc đóng gói để làm sạch siêu dữ liệu kéo và thả, có khay hệ thống và tích hợp Explorer. Đây là một cơ sở mã riêng biệt: nó không gọi dịch vụ Python của kho lưu trữ này và các định dạng được hỗ trợ cũng như đảm bảo dọn dẹp của nó khác với dự án này. Xem README của nó để biết chi tiết.
unmark-web — giao diện người dùng web của trình duyệt
bỏ đánh dấu web là một ứng dụng khách web tĩnh độc lập, được MIT cấp phép. Nó xóa các dấu Unicode vô hình khỏi văn bản và loại bỏ siêu dữ liệu xuất xứ khỏi hình ảnh hoàn toàn trong trình duyệt và có thể tùy chọn gọi dịch vụ HTTP của kho lưu trữ này cho các định dạng mà nó không xử lý cục bộ. Nó là một cơ sở mã riêng biệt và không liên kết với dự án này; xem README của nó để biết phạm vi và giới hạn.
ClaudeWatermarks - trình kiểm tra văn bản cục bộ của trình duyệt
ClaudeHình Nước is an independent, free web tool that inspects pasted text for invisible Unicode carriers entirely in the browser — nothing is uploaded — and lists every finding with its code point, position and surrounding context so the reader decides what to remove. Its inspector engine is published separately as Claude-text-inspector (MIT, TypeScript); các bảng điểm mã và các quy tắc bảo quản trong ngữ cảnh của nó (keo biểu tượng cảm xúc, trình nối tập lệnh, thẻ cờ) tuân theo công cụ Lớp A của kho lưu trữ này. Trang web cũng đọc Thông tin xác thực nội dung C2PA từ các tệp được hỗ trợ cục bộ. Nó không gọi dịch vụ của kho lưu trữ này và tuyên bố rõ ràng rằng nó không thể phát hiện hoặc xóa dấu văn bản thống kê của Claude. Nó là một cơ sở mã riêng biệt và không liên kết với dự án này; xem README của nó để biết phạm vi và giới hạn.
Thêm một dự án
Để đăng ký một dự án tại đây, hãy mở một PR thêm một mục nhập ngắn — tên dự án, những gì nó bao gồm hoặc thêm vào và một liên kết đến kho lưu trữ của chính nó. Giữ các mục ngắn gọn và thực tế; không yêu cầu tính tương thích với hoặc sự chứng thực của dự án này. Vui lòng tránh những tên bắt đầu bằng hoặc gần giống watermarks-remover - những cái tên trông giống nhau khiến khó có thể biết đó là dự án nào.
Móc cam kết trước
Cổng CI đã tồn tại (audit_dir.pyxuất SARIF của, xem Ma trận bảo hiểm bối cảnh) - cam kết trước các hook bên dưới bắt được cùng một loại vấn đề trước đó, trước khi một tệp được đánh dấu thậm chí được cam kết. Cả hai đều bao bọc các CLI hiện có (audit_dir.py / clean_file.py) - không có logic phát hiện riêng biệt.
# .pre-commit-config.yaml
repos:
- repo: https://github.com/guillaumemeyer/watermarks-remover
rev: v0.5.0 # pin to a tag/commit
hooks:
- id: watermarks-remover-check # fails the commit if marks are found
# - id: watermarks-remover-clean # opt-in: cleans staged files in place instead
watermarks-remover-check không thực hiện được cam kết và liệt kê các phát hiện; watermarks-remover-clean được chọn tham gia và viết lại các tệp theo giai đoạn tại chỗ (thoát ra 1 để bạn xem lại khác biệt và giai đoạn lại - quy ước tương tự như các hook tự động sửa như ruff --fix). Khi trình dọn dẹp hoàn toàn không thể xử lý một tập tin — nó bị hỏng, bị hỏng hoặc không tạo ra báo cáo — watermarks-remover-clean thay vào đó, đặt tên tệp đó và thoát ra 3, do đó, trình dọn dẹp bị lỗi sẽ không bao giờ bị nhầm lẫn với tệp đã sạch. Chạy bằng tay với python3 service/scripts/check_staged.py <files...> / clean_staged.py <files...>.
Kiểm tra
python3 -m venv .venv && .venv/bin/pip install pytest
.venv/bin/python -m pytest # or: make test
make smoke # quick CLI smoke on fixtures
Nhật ký thay đổi
Chưa phát hành
Loại bỏ các điểm mã Default_Ignoable dành riêng trong Lớp A:
U+2065,U+FFF0–U+FFF8,U+E0000,U+E0080–U+E00FFvàU+E01F0–U+E0FFFlà các điểm mã chưa được gán mang theoOther_Default_Ignorable_Code_Point=Yes, do đó, các trình kết xuất phù hợp hiển thị chúng một cách vô hình, quá trình chuẩn hóa sẽ bảo tồn chúng và dựa trên danh mục (Cf) việc chà rửa không bao giờ nhìn thấy chúng: các nhà cung cấp dịch vụ bí mật lý tưởng không được sử dụng hợp pháp trong văn bản trao đổi. Lớp A hiện loại bỏ chúng và kiểm tra các báo cáo theo giao diện mớireserved_ignorabletử tế. Áp dụng cho cả công cụ dịch vụ và bản sao kỹ năng nhẹ được cung cấpSửa lớp A thiếu ba sóng mang Default_Ignoreable vô hình:
U+180F(Bộ chọn biến thể miễn phí của Mông Cổ-4, được thêm bằng Unicode 14),U+3164(tiếng đệm Hangul) vàU+FFA0(bộ đệm Hangul nửa độ rộng) là các điểm mã Default_Ignorable hiển thị trống, nhưng các danh mục Unicode của chúng (Mn/Lo) có nghĩa làCftất cả đều không bao giờ nhìn thấy họ và họ vắng mặt trong buổi trình diễn thoát y - vì vậy cả haiinspect_textvàclean_textđã chuyển chúng mà không bị ảnh hưởng ngay cả giữa ASCII đơn giản. Bây giờ chúng đã bị lột bỏ và gắn cờ giống như những người anh em đã được che phủ của chúng (U+180B–U+180D,U+115F/U+1160), với cùng cách bảo quản trong ngữ cảnh:U+180Fđược giữ theo tên một chữ cái Mông Cổ giống hệt như FVS1–3, vàU+3164/U+FFA0được lưu giữ sau một chamo Hangul có dạng trình bày riêng của chúng (jamo tương thíchU+3131–U+318E, nửa độ rộng jamoU+FFA1–U+FFDC) giống hệt như các từ ghép nối nên văn bản một phần âm tiết không bị hỏng. Áp dụng cho cả công cụ dịch vụ và bản sao kỹ năng nhẹ được cung cấpLoại bỏ các ký tự không phải ký tự Unicode trong Lớp A: 66 ký tự không phải ký tự (
U+FDD0–U+FDEFcộng thêmU+FFFE/U+FFFFở cuối mỗi mặt phẳng) được dành riêng vĩnh viễn để sử dụng nội bộ và bị cấm trong văn bản trao đổi, hiển thị dưới dạng không có gì hoặc đậu phụ và vẫn tồn tại trong quá trình chuẩn hóa, tuy nhiên cả hai đềuinspect_textvàclean_textđưa họ đi qua một cách nguyên vẹn: một kênh bí mật được tạo sẵn. Lớp A hiện loại bỏ chúng và kiểm tra các báo cáo theo giao diện mớinoncharactertử tế. Không giống như các phạm vi dành riêng khác, chúng không bao giờ có thể được chỉ định, do đó việc tước bỏ không mang lại rủi ro về Unicode trong tương lai. Áp dụng cho cả công cụ dịch vụ và bản sao kỹ năng nhẹ được cung cấpDừng loại bỏ các điều khiển định dạng bố cục hiển thị bên cạnh tập lệnh của riêng chúng: Điều khiển ô chữ tượng hình Ai Cập (
U+13430–U+1343F), điều khiển tốc ký Duployan (U+1BCA0–U+1BCA3) và các nút điều khiển chùm/buộc/cắt/cụm từ âm nhạc (U+1D173–U+1D17A) là loạiCf, do đó, tổng hợp đã loại bỏ chúng, nhưng chúng chi phối rõ ràng cách hiển thị tập lệnh của chúng (xếp chồng góc phần tư, chồng chéo tốc ký, chiếu): loại bỏ chúng sẽ thay đổi văn bản được hiển thị, mâu thuẫn với bất biến "trình dọn dẹp bảo toàn nội dung tài liệu". Giờ đây chúng được giữ nguyên khi nằm cạnh chữ viết riêng của chúng, giống hệt như cách xử lý tiếng Mông Cổ/Khmer/Hangul hiện có và vẫn bị loại bỏ (và được gắn cờ) khi trôi nổi giữa các văn bản không liên quan;--strip-emoji-gluechế độ hoang tưởng vẫn tước chúng khắp nơi. Áp dụng cho cả công cụ dịch vụ và bản sao kỹ năng nhẹ được cung cấpSkills install into Claude Code and Cowork:
install_skill.pygrew a--target(claude-code,claude-project,cowork,cursor) and a--skillselector covering both shipped skills, plus--list,--link(symlink instead of copy), andCLAUDE_CONFIG_DIRsupport. Thecoworktarget builds a reproducible upload bundle (dist/<skill>.zip, single top-level skill directory) because Cowork, cloud, and routine sessions load the skills enabled for the Claude.ai account rather than~/.claude/skills. Every target validates the skill against the Agent Skills packaging rules (spec-only frontmatter, name/description limits) before writing, plus the 30 MB upload limit for the Cowork bundle. Newmaketargets:install-claude-code-skill,install-claude-code-text-skill,install-claude-project-skill,package-cowork-skill,package-cowork-text-skill.clean-user-facing-text's description no longer names Cursor as the only host, so it triggers in any Agent Skills host.The repository is now a Claude Code plugin and a single-plugin marketplace (
.claude-plugin/plugin.json+.claude-plugin/marketplace.json), so both skills install with/plugin marketplace add guillaumemeyer/watermarks-removersau đó/plugin install watermarks-remover@watermarks-remover, and update in place.make plugin-validatechạyclaude plugin validate . --strict;tests/test_plugin_manifest.pychecks the manifests without the CLI.Deterministic auto-cleaning via a
PostToolUsecái móc (hooks/hooks.json+service/scripts/hook_written_file.py): after the agent writes a file, the harness runs the hook whether or not the model cooperates.check(default) reports marks to the model;cleanstrips them in place and tells the model the file moved, swapping only on a real difference so clean files keep their mtime. Mode comes from the plugin'shook_modesetting orWATERMARKS_HOOK_MODE. Detection reusesaudit_lib.scan_file/is_actionable, so the hook, the pre-commit gate, and the CI SARIF export agree. Mode is read from the environment rather than interpolated as${user_config.hook_mode}, because Claude Code refuses to run a hook referencing an option the user has never set, which would leave the hook silently dead on a fresh install. A hook still cannot rewrite the assistant's chat message — no such hook point exists — so that path stays best-effort.Việc viết lại lớp B hiện được lặp đi lặp lại và dựa trên đánh giá: mỗi vòng tạo ra
--candidatescác biến thể (mặc định 1,WATERMARKS_REWRITE_CANDIDATES) và--max-loops(mặc định 1,WATERMARKS_REWRITE_LOOPS) giới hạn các vòng đánh giá, dừng ngay khi nỗ lực vượt qua quá trình phát hiện hình mờ. Ưu tiên của người đánh giá: MarkLLM (khi--markllm-scheme) > phân kỳ từ vựng bigram-Jaccard (dự phòng; đường nối trình phát hiện nhà cung cấp được dành riêng cho điểm cuối văn bản SynthID trong tương lai).rewrite_text.py --json-statsbây giờ báo cáoevaluator/max_loops/attempts_made/passedvà mỗi lần thửcandidate_scoreshồ sơ (loop,passed,evaluation);markllm.before/after/clearedkhông thay đổi.Điểm chuẩn văn bản SynthID: biến thể mặc định
paraphrase:3; báo cáo và CSV hiện thực hiện các lần thử trên mỗi tài liệu (mean_attempts,attcột;attempts/evaluator/passedcột);--rewrite-loopsgương--max-loops.Xác minh cùng khóa Keyed-Gumbel (Aaronson EXP): chỉ có stdlib mới
detect_gumbel.pytriển khai thử nghiệm phát lại không có mô hình của báo cáo có khóa-Gumbel của ARBI (u = PRF(Hash(key, window), token); giá trị p đuôi Gamma chính xác; che cửa sổ lặp lại) — không có GPU, mô hình hoặc nhật ký.rewrite_text.py --gumbel-key(envWATERMARKS_GUMBEL_KEY, được ưu tiên) làm cho nó trở thành công cụ đánh giá vòng lặp lặp (ưu tiên: gumbel > markllm > phân kỳ từ vựng) với mộtgumbel.before/after/ clearedbáo cáo; máy dò cũng được tiếp xúc nhưgumbeltrong/capabilitiesvà/detect. Chỉ cùng một khóa: hợp lệ đối với cùng một khóa, mã thông báo và bố cục PRF được sử dụng khi tạo - không phải là lời tiên tri của nhà cung cấp. Chìa khóa không bao giờ được ghi lại.
v0.5.0 — phân phối dịch vụ & Docker, HTTP API và khai thác xác minh
Dịch vụ / phân phối Docker
- Phân chia kỹ năng/dịch vụ: kỹ năng (
skills/remove-ai-marks/) hiện là ứng dụng khách từ xa không có mã trên HTTP; tất cả việc thực hiện được chuyển sangservice/scripts/và chạy phía sauserver.py, một điểm vào stdlib HTTP (/health,/inspect,/clean,/capabilities) - dịch vụ HTTP:
service/scripts/server.pyhiển thị đường ống làm sạch trên JSON/base64; tăng cường phản ánh CLI (giới hạn kích thước, bảo vệ nhị phân, ghi nguyên tử, mặc định loopback, tùy chọnWATERMARKS_SERVER_API_KEYxác thực mang) - API mở:
GET /openapi.jsonphục vụ thông số kỹ thuật OpenAPI 3.0.3 được tạo động (được xây dựng từ bảng lộ trình + cấu hình trực tiếp, do đó nó không bao giờ bị lệch khỏi các điểm cuối thực); CI xác nhận nó vớiopenapi-spec-validator - Hình ảnh lõi Docker (
service/Dockerfile): dịch vụ dọn dẹp đầy đủ với Exiftool/qpdf/c2patool được cài đặt sẵn; mọi CLI vẫn có thể chạy được bằng cách ghi đè lệnh - Docker / soạn:
compose.yamlhiển thị toàn bộ cơ sở hạ tầng (coreluôn luôn;markllm/markdiffusionđằng sauprofile: harness;ctrlregen/synthidđằng sauprofile: heavynhư các bản dựng chỉ dành cho địa phương); dịch vụ được tiền tốwr-; khai thác/dịch vụ nặng mặc định làcommand: ["--help"]vậydocker compose up --profile harness --profile heavythoát ra một cách rõ ràng (CLI một lần được chạy vớidocker compose run); mớimake compose-check/compose-check.shxác thực ngăn xếp đang chạy (chỉ mã thoát) - xuất bản GHCR:
.github/workflows/release-images.ymlxuất bảncore,markllm,markdiffusionhình ảnh trênv*thẻ;ctrlregen/synthidkhông bao giờ được xuất bản (cấp phép ngược dòng) - Cấu hình môi trường:
.env.example+ Hướng dẫn cấu hình dịch vụ;docker composetự động tải.env;.envđược gitignored (từ chối theo mặc định) - Repo vệ sinh:
.gitignorevàservice/.dockerignorehiện bị từ chối theo mặc định - chỉ những đường dẫn được cho phép rõ ràng mới có thể được cam kết hoặc gửi trong ngữ cảnh xây dựng (ngữ cảnh hình ảnh chỉ gửiservice/scripts/, đó là tất cả các Dockerfiles COPY) - Kiểm tra:
tests/test_http_server.py(13 trường hợp) cho dịch vụ HTTP; tất cả các dãy phòng đều được trỏ lại vàoservice/scripts/
Khai thác hình mờ hình ảnh MarkDiffusion (tùy chọn)
- Dây nịt tùy chọn mới (bên ngoài
THU-BPM/MarkDiffusion, Apache-2.0):markdiffusion_harness.pyvớiwatermark/detect/purifycác lệnh phụ cho chín sơ đồ hình ảnh (Tree-Ring, Ring-ID, ROBIN, WIND, SFW, Gaussian-Shading, GaussMarker, PRC, SEAL) clean_image.py --remove-pixel diffusionchạy MarkDiffusionDiffusionPurificationtấn công tái tạo như một công cụ loại bỏ pixel thay thế (mặc định cường độ bảo thủ 0,3)setup_markdiffusion.shkhởi động (chân PyPI1.0.2;--checkoutbản sao có thể chỉnh sửa tại cam kết được ghim) +requirements-markdiffusion.txt+Dockerfile.markdiffusionvà Makefilebootstrap-markdiffusion/smoke-markdiffusion/docker-markdiffusion-build/docker-markdiffusion-help- Các bài kiểm tra dựa trên mô phỏng (
tests/test_markdiffusion_harness.py) — không có ngọn đuốc nào trong CI;references/markdiffusion.mdtài liệu tham khảo - Tài liệu: cảnh báo xác minh chỉ dành cho cùng một sơ đồ (không phải lời tiên tri của nhà phát hiện nhà cung cấp) và cảnh báo trôi dạt tái tạo mù trong README, SKILL.md,
removal-matrix.md,markdiffusion.md
Khai thác hình mờ văn bản MarkLLM (tùy chọn)
- Dây nịt tùy chọn mới (bên ngoài
THU-BPM/MarkLLMthanh toán, Apache-2.0):detect_text_watermark.pyvớidetect/watermarkcác lệnh con cho các lược đồ KGW và SynthID rewrite_text.py --markllm-schemechạy trước/sau khi phát hiện xung quanh việc viết lại Lớp B và phát hiện mỗi ứng viên khi--candidates N>1(env-gated; báo cáocleared)setup_markllm.shkhởi động +requirements-markllm.txt(đã ghim deps) +Dockerfile.markllmvà Makefilebootstrap-markllm/smoke-markllm/docker-markllm-build/docker-markllm-help- Làm cứng:
--offlinetải mô hình chỉ có bộ đệm (không có đầu ra HF, không có mã từ xa), nắp cấu hình 1 MiB, tùy chọnWATERMARKS_MARKLLM_RLIMIT_AStrên quy trình con viết lại, ghim ngọn đuốc trong Dockerfile và xác minh bản sao-SHA trongDockerfile.markllm - Các bài kiểm tra dựa trên mô phỏng (
tests/test_markllm_detect.py, 21 trường hợp) - không có đèn pin trong CI; cảnh báo khai thác xác minh (chỉ cùng cấu hình, không phải là nhà tiên tri của trình phát hiện nhà cung cấp) được ghi lại trong README, SKILL.md,removal-matrix.md,vendor-notes.md
Sửa chữa và đánh bóng
- Lớp B:
rewrite_text.pybây giờ gửireasoning_effort: "none"theo mặc định choopenai-compatiblephụ trợ (--reasoning-effort/WATERMARKS_REWRITE_REASONING_EFFORT;offbỏ qua nó). Các mô hình lý luận nhưdeepseek-v4-flashnếu không thì đốt ~ 100 giây chuỗi suy nghĩ khi viết lại một dòng (9.894 so với 12 mã thông báo hoàn thành) - Sửa lỗi xây dựng hình ảnh markllm:
requirements-markllm.txtđược ghimtokenizers==0.23.1, mâu thuẫn vớitransformers==5.15.0(mũtokenizers<=0.23.0; không có bản phát hành 0.23.0 nào tồn tại) — hiện đã được ghimtokenizers==0.22.2; ngọn đuốc di chuyển đến chỉ số bánh xe CPU (torch==2.13.0.*) nên ảnh chỉ có dạng CPUDockerfile.markdiffusion - Sửa lỗi xây dựng hình ảnh ctrlregen: các chân nghiên cứu thời đại 2023 (
safetensors==0.4.3,transformers==4.37.2→tokenizers<0.19) không có bánh xe Python 3.14, vì vậy hình ảnh cơ sở bây giờ làpython:3.11-slim(được ghim tiêu hóa, nhiều vòm) - Sửa hình ảnh khai thác khi chạy:
Dockerfile.markllmvàDockerfile.markdiffusionkhông bao giờ sao chépcommon.pyvào/app(lỗi đã có từ trước) - đã thêm - WebP: kiểm tra chỉ stdlib và làm sạch siêu dữ liệu cho RIFF
C2PACác khối hồ sơ , XMP, EXIF và ICC (#37) - BMP / GIF / TIFF: phát hiện, kiểm tra và dọn dẹp siêu dữ liệu chỉ dành cho stdlib - phần mở rộng XMP/nhận xét GIF bị loại bỏ trong khi
NETSCAPE2.0vòng lặp được bảo tồn; Siêu dữ liệu TIFF IFD (XMP/EXIF/GPS/IPTC/MakerNote) bị loại bỏ với tải trọng bằng 0 và độ lệch dải được giữ nguyên, cho cả cổ điển và BigTIFF; Siêu dữ liệu theo dõi BMP bị cắt bớt với trường kích thước tệp được viết lại - EPUB: Làm sạch vùng chứa chỉ stdlib — siêu dữ liệu OPF và meta/JSON-LD XHTML đã được xóa, loại bỏ phương tiện raster/SVG nhúng, Lớp A được áp dụng cho văn bản nội dung XHTML, các phần siêu dữ liệu mang điểm đánh dấu bị loại bỏ và các phần được mã hóa OCF được chuyển qua nguyên vẹn
- Khử trùng tên tệp: Dịch vụ HTTP từ chối tên đầu ra do khách hàng cung cấp không an toàn
- Sửa lỗi trình dọn dẹp frontmatter markdown gặp sự cố và rò rỉ các khóa AI lồng nhau (#25)
- Công cụ văn bản từ chối đầu vào nhị phân;
--force-textghi đè (#24) --jsonkhông còn chặn mã thoát tín hiệu dư (#30)inspect_filein tên tập tin ở đầu ra của nó (#50)- Giữ nguyên thẻ meta trình tạo CMS hỗn hợp (#42)
- Bảo tồn các tập lệnh chịu tải, dải PUA ở Lớp A (#38, #52)
- Giữ nguyên các phần nối tập lệnh, biểu tượng cảm xúc cờ và dấu Cf tiếng Ả Rập ở Lớp A (#28)
- Tăng cường kiểm tra trang web chống lại SSRF và bom gzip (#49)
- BẢO MẬT.md chỉ tham khảo kênh tư vấn riêng (#51)
- cửa sổ: Cổng PowerShell của bootstraps thiết lập (#40)
- Tài liệu: thêm lá chắn sao/ngã ba và thả biểu đồ lịch sử sao; thêm MarkLLM vào tài liệu tham khảo README; kéo mẫu yêu cầu; kế hoạch triển khai Docker CLI + API
v0.4.0 — loại bỏ pixel, tìm kiếm sự tự tin, Windows và sửa lỗi dương tính giả
Loại bỏ pixel CtrlRegen tùy chọn (phụ trợ bên ngoài)
- Tùy chọn xóa hình mờ miền pixel thông qua bên ngoài
mertizci/noai-watermarkthanh toán:clean_ctrlregen.pybộ chuyển đổi +setup_ctrlregen.shbootstrap (cam kết được ghim, kiểm tra thưa thớt, xác minh venv, SHA), cộng thêmDockerfile.ctrlregenvàmake bootstrap-ctrlregen/docker-ctrlregen-build/smoke-ctrlregen clean_image.py --remove-pixel ctrlregenchạy dải siêu dữ liệu → loại bỏ CtrlRegen → tùy chọn đảo ngược SynthID trước/sau điểm số;inspect_image.pygợi ý về lá cờ có điểm SynthID cao- Sức mạnh vỡ nợ thận trọng
0.25(đặt trước 0,15/0,25/0,35/0,5/0,7); đường dẫn gốc 512×512 được phần phụ trợ tự động xếp lớp để có hình ảnh lớn hơn; quy trình con ngọn đuốc nhận được giới hạn tài nguyên có thể ghi đè trên môi trường cao hơn - Phần cuối không bao giờ được đóng gói:
noai-watermarkkhông gửi tệp GIẤY PHÉP (được coi là bảo lưu mọi quyền) và các đường dẫn mã tự động cài đặt/khởi động lại của nó bị bỏ qua bằng cách sử dụngCtrlRegenEnginetrực tiếp
Tìm kiếm sự tin cậy và kiểm toán tổng hợp
- Các phát hiện hiện đã được phân loại
confirmed/probable/informational/likely_false_positive, được hiển thị trong văn bản/hình ảnh/vùng chứa JSON và báo cáo của con người - Mới
audit_dir.py(cây đệ quy) vàaudit_website.py(khám phá sơ đồ trang web + thu thập thông tin) báo cáo tổng hợp; được ghi lại trong SKILL.md
Sửa lỗi dương tính giả
- DOCX: chỉ quét
docProps/customXml, không phải phần thân nhìn thấy được (#14) - Lớp văn bản A: giữ lại biểu tượng cảm xúc
VS16/ZWJsau một biểu tượng cảm xúc; mới--strip-emoji-gluecờ hoang tưởng (#22) - HTML: coi thẻ trình tạo CMS là thông tin chứ không phải siêu dữ liệu AI (#13)
- PDF: loại trừ tải trọng luồng khỏi quá trình quét byte đánh dấu AI (#13)
- Kiểm tra báo cáo lưu ý các đường dẫn không được hỗ trợ/nỗ lực tốt nhất
Hỗ trợ Windows
- Cổng chỉ dành cho POSIX
preexec_fnvàos.fchmodso write và các công cụ tùy chọn chạy trên Windows (#15, #23) - Định cấu hình lại stdio thành UTF-8 để các luồng Windows được chuyển hướng không còn xuất hiện trên Unicode vô hình nữa; Chân Windows CI + CLI chạy khói (#23)
Tài liệu và chuỗi cung ứng
- Phần README CtrlRegen + tài liệu tham khảo nghiên cứu (CtrlRegen, UnMarker, cảnh báo về hành vi tàng hình), tuyên bố từ chối trách nhiệm về việc sử dụng có trách nhiệm; Cập nhật KỸ NĂNG/ma trận/ghi chú của nhà cung cấp/đạo đức
- Cấu hình Dependabot + CODEOWNER đường dẫn bảo mật; đẩy scipy/numpy/opencv-Python/scikit-learn/pywavelets và hình ảnh cơ sở thành Python 3.14-slim
- Kiểm tra CtrlRegen dựa trên mô hình (không có đèn pin trong CI)
v0.3.2 — tăng cường bảo mật (ghi an toàn, ứng dụng khách HTTP, chuỗi cung ứng CI)
- An toàn, đầu ra nguyên tử ghi: mọi trình dọn dẹp hiện đều ghi thông qua tệp tạm thời + đổi tên nguyên tử (
safe_write_bytes/safe_write_text), từ chối các điểm đến được liên kết tượng trưng và tạo.baksao lưu thông qua cùng một đường dẫn an toàn - các liên kết tượng trưng được đặt trước (ví dụ: trong/tmphoặc tải xuống thư mục) không còn có thể chuyển hướng ghi sạch vào một tệp tùy ý rewrite_text.pyHTTP tăng cường ứng dụng khách: chuyển hướng bị từ chối hoàn toàn, do đó, khóa API trongAuthorizationtiêu đề không bao giờ có thể được gửi lại đến máy chủ không được xác thực; điểm cuối không vòng lặp là bị từ chối theo mặc định (chọn tham gia với--allow-remotehoặcWATERMARKS_REWRITE_ALLOW_REMOTE=1); chỉ có HTTP(s) lược đồ được chấp nhận;--api-keyđã bị xóa - các khóa chỉ dành cho env thông quaWATERMARKS_REWRITE_API_KEY- Giới hạn tài nguyên: đầu vào tối đa mặc định 1 GiB → 256 MiB, giới hạn stdin 64 MiB mới, ngân sách zip DOCX/ODT 512 MiB → 128 MiB và
RLIMIT_AS/RLIMIT_FSIZEđược áp dụng cho các quy trình con Exiftool/c2patool/SynthID (tất cả các chữ hoa đều có thể ghi đè được) - Chuỗi cung ứng: Hành động CI được gắn SHA với
permissions: contents: read, đã ghim dev deps (requirements-dev.txt), mộtpip-auditbước này và quy trình làm việc CodeQL mới; hình ảnh Docker hiện chạy với tư cách người dùng không có đặc quyền được ghim pip - Vua phá lưới: Gối va đập 10.4.0 → 12.3.0 (24 CVE đã biết); Việc sử dụng API đã được xác minh dựa trên cam kết ngược dòng được ghim
- Thử nghiệm: 18 thử nghiệm hồi quy bảo mật mới (tổng cộng 60 thử nghiệm, tất cả đều đạt)
v0.3.1 — viết lại hình mờ thống kê Lớp B mạnh hơn
rewrite_text.pydiễn giải mặc định bây giờ thực hiện một cách rõ ràng lựa chọn từ + cú pháp tấn công (thứ tự mệnh đề, từ nối, từ chuyển tiếp, ranh giới câu, từ chức năng) thay vì viết lại chung chung- Mới
--strength humanize: zero-shot "viết như một con người" nhắm mục tiêu theo cách diễn đạt theo phong cách AI theo công thức - Mới
--strength code: viết lại các nhận xét, chuỗi tài liệu và chuỗi ký tự, đồng thời đổi tên các mã định danh cục bộ trong khi vẫn giữ nguyên hành vi và tên API công khai - Cấu trúc vượt qua hiện phát ra "văn xuôi con người tự nhiên, đa dạng" thay vì "phong cách chuyên nghiệp rõ ràng" điển hình của AI
- Mới
--temperature(mặc định0.9) cho cả phần phụ trợ tương thích với Ollama và OpenAI - Mới
--candidates N: tạo N ghi lại và chọn phân tách từ vựng nhất (khoảng cách Jaccard lớn) với bộ bảo vệ độ dài trôi - Vệ sinh mô hình mạnh mẽ hơn: ưu tiên các mô hình có trọng lượng mở tại địa phương và tránh mọi nhà cung cấp có hình mờ đã biết, không chỉ nguồn gốc bị nghi ngờ
- Báo cáo rủi ro còn lại hiện phân biệt văn bản ngắn/có tính dự đoán cao (rủi ro thấp hơn) với văn xuôi dài, có entropy cao (rủi ro cao hơn)
- Tài liệu được cập nhật trong
SKILL.md,removal-matrix.mdvàvendor-notes.md; các bài kiểm tra bao gồm các lời nhắc mới, tính điểm khác biệt và lựa chọn ứng viên
v0.3.0 - tính điểm pixel SynthID tùy chọn
- Trình ghi điểm SynthID miền pixel tùy chọn thông qua bên ngoài
aloshdenny/reverse-SynthIDthanh toán (score_synthid.py); nổi lên tronginspect_image.py/clean_image.pyvớiREVERSE_SYNTHID_DIRhoặc--synthid-dir setup_synthid.shbootstrap (phụ thuộc chỉ dành cho người ghi bàn;--fullcài đặt các yêu cầu ngược dòng);Dockerfile.synthidcộng thêmmake docker-synthid-build/docker-synthid-help- Makefile
smoke-synthidvàbootstrap-synthidmục tiêu - Kiểm tra bộ điều hợp trình ghi điểm, đường dẫn không khả dụng CLI, phân tích cú pháp JSON và lỗi thời gian chạy
- Tài liệu: chỉ phát hiện/chấm điểm (không loại bỏ pixel); mã ngược dòng không được đóng gói và vẫn theo Giấy phép Nghiên cứu phi thương mại
v0.2.0 — sửa lỗi dương tính giả c2patool
image_meta.py:has_manifestkhông còn cờError: No claim found/No JUMBF data founddưới dạng một bảng kê khai (lỗi ưu tiên của toán tử: các điểm đánh dấu tiêu cực hiện có quyền phủ quyết mọi nhánh tích cực)- Mới
tests/test_c2patool_report.py(4 trường hợp: không có yêu cầu bồi thường, không có JUMBF, bảng kê khai chính hãng, không có công cụ) - Tài liệu: đã sửa
c2patoolliên kết (repo chuyển đếncontentauth/c2pa-rs); đã thêm tuyên bố từ chối trách nhiệm về chi phí chất lượng của việc xóa hình mờ văn bản
v0.1.0 - đánh bóng bao bì + xuất xứ trung thực
Makefile(test/smoke/install-skill) vàpytest.ini- Các mẫu cố định cho Markdown, HTML, SVG; Kiểm tra sạch xuống cấp PDF
- Tài liệu: ngành hai lớp mô hình (C2PA ràng buộc cứng so với liên kết mềm / SynthID-media)
- Bảng rủi ro tồn dư README + liên kết đến các công cụ xác minh bên ngoài
- Tham khảo: Hướng dẫn của Viện AI PM C2PA/SynthID
- Hình mờ liên kết mềm và hình mờ pixel/âm thanh/video rõ ràng nằm ngoài phạm vi về kỹ năng/ma trận/đạo đức
v0.0.1 - phát hành đa nhà cung cấp ban đầu
- Kỹ năng đại lý
remove-ai-marks(chỉ thay thế Clauderemove-claude-marks) - Lớp A: vô hình Unicode / bidi / ký tự thẻ / từ đồng âm không gian (
inspect_text/clean_text) - Lớp B: hướng dẫn viết lại + tùy chọn
rewrite_text.py(nhắc in, tương thích với Ollama, OpenAI) - Tập tin: Dải siêu dữ liệu C2PA/AI cho PNG, JPEG, SVG, PDF, DOCX, ODT, HTML, Markdown
- Hợp nhất
inspect_file.py/clean_file.py - Tài liệu của nhiều nhà cung cấp (Claude, Gemini/SynthID-class, OpenAI, open-LLM)
- Tập lệnh đầu tiên của Stdlib; tùy chọn
c2patool/exiftool
Giấy phép
MIT - xem GIẤY PHÉP.
Thư mục
- Cách Claude đánh dấu nội dung do AI tạo (Anthropic)
- Dathathri và cộng sự, Hình mờ có thể mở rộng để xác định đầu ra mô hình ngôn ngữ lớn (SynthID-Text, Thiên nhiên 2024)
- Google AI dành cho nhà phát triển, Các biện pháp bảo vệ SynthID (Gemini API tài liệu)
- C2PA / c2patool
- Kirchenbauer và cộng sự, Hình mờ cho các mô hình ngôn ngữ lớn
- Evseev, D. (Thành phố trọng tài), Hình mờ văn bản AI chính xác, không tốn kém và vô hình để suy luận AI tự lưu trữ (báo cáo kỹ thuật, tháng 8 năm 2026) — hình mờ có khóa-Gumbel được vận chuyển trong công cụ phục vụ arbi nguồn mở, với tính năng phát hiện kiểm tra chính xác và hỗ trợ giải mã suy đoán — PDF
- THU-BPM/MarkLLM (bộ công cụ thống nhất để đánh giá các thuật toán tạo hình mờ LLM)
- Pan và cộng sự, MarkDiffusion: Bộ công cụ nguồn mở để tạo hình mờ tổng hợp cho các mô hình khuếch tán tiềm ẩn (JMLR) — bộ công cụ nhúng bao gồm gói khai thác hình mờ hình ảnh tùy chọn của repo này — mã, tài liệu
- Zhang và cộng sự, Hình mờ trên cát: Không thể tạo hình mờ mạnh cho các mô hình sáng tạo (ICML 2024)
- Sander và cộng sự, Hình mờ làm cho các mô hình ngôn ngữ trở nên phóng xạ — hình mờ tồn tại trong quá trình tinh chỉnh và đánh dấu các mô hình xuôi dòng được huấn luyện trên dữ liệu hình mờ
- Pan và cộng sự, Hình mờ LLM có thể ngăn chặn mạnh mẽ việc chắt lọc kiến thức trái phép không? — xuất xứ dựa trên hình mờ và bảo vệ chống lại việc chắt lọc kiến thức
- google-deepmind/synthid-văn bản (tài liệu tham khảo nghiên cứu; không được sử dụng để phát hiện ở đây)
- aloshdenny/reverse-SynthID (tài liệu tham khảo nghiên cứu)
- Liu và cộng sự, Hình mờ hình ảnh có thể xóa được bằng cách sử dụng khả năng tái tạo có thể kiểm soát khỏi tiếng ồn sạch (ICLR 2025) — phương pháp tái tạo pixel mà phần phụ trợ CtrlRegen tùy chọn triển khai — mã
- Kassis & Hengartner, UnMarker: Một cuộc tấn công phổ biến vào hình mờ hình ảnh phòng thủ (arXiv:2405.08363; IEEE S&P 2025) — một cuộc tấn công hình mờ phổ quát được so sánh trên một số liệu khác với CtrlRegen
- Goonatilake & Ateniese, Xóa hình mờ là chưa đủ: Tàng hình pháp y trong việc xóa hình mờ bằng AI sáng tạo (arXiv:2605.09203) — thúc đẩy mặc định cường độ bảo thủ: việc xóa vẫn có thể để lại dấu vết pháp y
- mertizci/noai-watermark (Bộ công cụ CLI/Python để xóa SynthID/StableSignature/TreeRing và loại bỏ siêu dữ liệu AI)
- 0xROOTPLS/DeSynth (Xóa SynthID cho hình ảnh OpenAI/Google)
- Viện AI PM, Nguồn gốc nội dung AI và hình mờ: Hướng dẫn của Thủ tướng về C2PA và SynthID (mô hình ngành hai lớp: C2PA + hình mờ không thể nhận thấy / ràng buộc mềm; bối cảnh SB 942 / EU AI Act. 50)
Dự án cùng danh mục
Trợ lý AI cá nhân của riêng bạn. Bất kỳ hệ điều hành nào. Bất kỳ nền tảng nào. Cách tôm hùm. 🦞
Hệ thống tối ưu hóa hiệu suất khai thác tác nhân. Kỹ năng, bản năng, trí nhớ, bảo mật và sự phát triển ưu tiên nghiên cứu cho Claude Code, Codex, Opencode, Cursor và hơn thế nữa.
Đại lý phát triển cùng bạn
Kỹ năng dành cho kỹ sư thực sự. Trực tiếp từ thư mục .agents của tôi.
Triển lãm bảo tàng do đại lý quản lý, được xây dựng trong Rust với Gajae-Code / LazyCodex — được phát triển và duy trì mà không có sự can thiệp của con người.