RepoTrending
Về bảng xếp hạng
GitHubAI AgentPython

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

18k sao2.1k fork

README

_ _ _ ____ ___ ____ ____ _  _ ____ ____ _  _ ____    ____ ____ _  _ ____ _  _ ____ ____
| | | |__|  |  |___ |__/ |\/| |__| |__/ |_/  [__  __ |__/ |___ |\/| |  | |  | |___ |__/
|_|_| |  |  |  |___ |  \ |  | |  | |  \ | \_ ___]    |  \ |___ |  | |__|  \/  |___ |  \

loại bỏ hình mờ

CI Release Stars Forks

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/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.pyrewrite_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/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ờ (/detectdetect_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 /detect chạ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.
  • /inspect chấp nhận chọn tham gia "detect": true cờ nối thêm kết quả dò tìm vào báo cáo văn bản (và có thể lật suspicious).
  • /clean chấ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 /capabilitiestext_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
…:markllm-<tag> / :markllm-latest Khai thác hình mờ văn bản MarkLLM (ngược dòng Apache-2.0)
…:markdiffusion-<tag> / :markdiffusion-latest Khai thác hình ảnh MarkDiffusion (ngược dòng Apache-2.0)
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

.envbị 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.pyclean_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 REF--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 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:

  1. 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 đó.
  2. 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:

  • --offline trê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 áp trust_remote_code khô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:

  1. 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 ý.
  2. Công cụ loại bỏ pixel tùy chọn: nó DiffusionPurification cuộ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à 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.
  3. 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ỳ.

  1. 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.

  2. 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
PDF 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 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:

  1. Không mất mát. pdfwrite vớ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. never là tùy chọn dành cho tài liệu có luồng phải được giữ nguyên.
  2. 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_passmeta.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 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+FFF0U+FFF8, U+E0000, U+E0080U+E00FFU+E01F0U+E0FFF là các điểm mã chưa được gán mang theo Other_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ới reserved_ignorable tử tế. Áp dụng cho cả công cụ dịch vụ và bản sao kỹ năng nhẹ được cung cấp

  • Sử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à Cf tấ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ả hai inspect_textclean_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+180BU+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ích U+3131U+318E, nửa độ rộng jamo U+FFA1U+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ấp

  • Loạ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+FDD0U+FDEF cộng thêm U+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 đều inspect_textclean_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ới noncharacter tử 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ấp

  • Dừ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+13430U+1343F), điều khiển tốc ký Duployan (U+1BCA0U+1BCA3) và các nút điều khiển chùm/buộc/cắt/cụm từ âm nhạc (U+1D173U+1D17A) là loại Cf, 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-glue chế độ 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ấp

  • Skills install into Claude Code and Cowork: install_skill.py grew a --target (claude-code, claude-project, cowork, cursor) and a --skill selector covering both shipped skills, plus --list, --link (symlink instead of copy), and CLAUDE_CONFIG_DIR support. The cowork target 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. New make targets: 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-remover sau đó /plugin install watermarks-remover@watermarks-remover, and update in place. make plugin-validate chạy claude plugin validate . --strict; tests/test_plugin_manifest.py checks the manifests without the CLI.

  • Deterministic auto-cleaning via a PostToolUse cá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; clean strips 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's hook_mode setting or WATERMARKS_HOOK_MODE. Detection reuses audit_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 --candidates cá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-stats bây giờ báo cáo evaluator / max_loops / attempts_made / passed và mỗi lần thử candidate_scores hồ sơ (loop, passed, evaluation); markllm.before/after/cleared khô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, att cột; attempts / evaluator / passed cột); --rewrite-loops gương --max-loops.

  • Xác minh cùng khóa Keyed-Gumbel (Aaronson EXP): chỉ có stdlib mới detect_gumbel.py triể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 (env WATERMARKS_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ột gumbel.before/after/ cleared báo cáo; máy dò cũng được tiếp xúc như gumbel trong /capabilities/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 sang service/scripts/ và chạy phía sau server.py, một điểm vào stdlib HTTP (/health, /inspect, /clean, /capabilities)
  • dịch vụ HTTP: service/scripts/server.py hiể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ọn WATERMARKS_SERVER_API_KEY xác thực mang)
  • API mở: GET /openapi.json phụ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ới openapi-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.yaml hiển thị toàn bộ cơ sở hạ tầng (core luôn luôn; markllm / markdiffusion đằng sau profile: harness; ctrlregen / synthid đằng sau profile: heavy như 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ậy docker compose up --profile harness --profile heavy thoát ra một cách rõ ràng (CLI một lần được chạy với docker compose run); mới make compose-check / compose-check.sh xác thực ngăn xếp đang chạy (chỉ mã thoát)
  • xuất bản GHCR: .github/workflows/release-images.yml xuất bản core, markllm, markdiffusion hình ảnh trên v* thẻ; ctrlregen / synthid khô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 compose tự động tải .env; .env được gitignored (từ chối theo mặc định)
  • Repo vệ sinh: .gitignoreservice/.dockerignore hiệ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ửi service/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ào service/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.py với watermark / detect / purify cá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 diffusion chạy MarkDiffusion DiffusionPurification tấ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.sh khởi động (chân PyPI 1.0.2; --checkout bản sao có thể chỉnh sửa tại cam kết được ghim) + requirements-markdiffusion.txt + Dockerfile.markdiffusion và Makefile bootstrap-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.md tà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/MarkLLM thanh toán, Apache-2.0): detect_text_watermark.py với detect / watermark các lệnh con cho các lược đồ KGW và SynthID
  • rewrite_text.py --markllm-scheme chạ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áo cleared)
  • setup_markllm.sh khởi động + requirements-markllm.txt (đã ghim deps) + Dockerfile.markllm và Makefile bootstrap-markllm / smoke-markllm / docker-markllm-build / docker-markllm-help
  • Làm cứng: --offline tả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ọn WATERMARKS_MARKLLM_RLIMIT_AS trên quy trình con viết lại, ghim ngọn đuốc trong Dockerfile và xác minh bản sao-SHA trong Dockerfile.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.py bây giờ gửi reasoning_effort: "none" theo mặc định cho openai-compatible phụ trợ (--reasoning-effort / WATERMARKS_REWRITE_REASONING_EFFORT; off bỏ qua nó). Các mô hình lý luận như deepseek-v4-flash nế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 ghim tokenizers==0.23.1, mâu thuẫn với transformers==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 ghim tokenizers==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 CPU Dockerfile.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.2tokenizers<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.markllmDockerfile.markdiffusion không bao giờ sao chép common.py và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.0 vò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-text ghi đè (#24)
  • --json không còn chặn mã thoát tín hiệu dư (#30)
  • inspect_file in 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-watermark thanh toán: clean_ctrlregen.py bộ chuyển đổi + setup_ctrlregen.sh bootstrap (cam kết được ghim, kiểm tra thưa thớt, xác minh venv, SHA), cộng thêm Dockerfile.ctrlregenmake bootstrap-ctrlregen / docker-ctrlregen-build / smoke-ctrlregen
  • clean_image.py --remove-pixel ctrlregen chạ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.py gợ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-watermark khô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ụng CtrlRegenEngine trự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/ZWJ sau một biểu tượng cảm xúc; mới --strip-emoji-glue cờ 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_fnos.fchmod so 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 .bak sao 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 /tmp hoặ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.py HTTP 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 trong Authorization tiê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-remote hoặc WATERMARKS_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 qua WATERMARKS_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ột pip-audit bướ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.py diễ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 định 0.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.mdvendor-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-SynthID thanh toán (score_synthid.py); nổi lên trong inspect_image.py / clean_image.py với REVERSE_SYNTHID_DIR hoặc --synthid-dir
  • setup_synthid.sh bootstrap (phụ thuộc chỉ dành cho người ghi bàn; --full cài đặt các yêu cầu ngược dòng); Dockerfile.synthid cộng thêm make docker-synthid-build / docker-synthid-help
  • Makefile smoke-synthidbootstrap-synthid mụ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_manifest không còn cờ Error: No claim found / No JUMBF data found dướ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 c2patool liên kết (repo chuyển đến contentauth/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ế Claude remove-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

Dự án cùng danh mục

openclaw/openclaw

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. 🦞

387k81k27 phút trước
GitHubAI AgentTypeScript

affaan-m/ECC

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.

243k37k18 giờ trước
GitHubAI AgentJavaScript

NousResearch/hermes-agent

Đại lý phát triển cùng bạn

236k48k1 giờ trước
GitHubAI AgentPython

mattpocock/skills

Kỹ năng dành cho kỹ sư thực sự. Trực tiếp từ thư mục .agents của tôi.

235k20k9 giờ trước
GitHubAI AgentShell

anomalyco/opencode

Tác nhân mã hóa nguồn mở.

201k26k29 phút trước
GitHubAI AgentTypeScript

ultraworkers/claw-code

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.

195k109k8 ngày trước
GitHubAI AgentRust
guillaumemeyer/watermarks-remover — Repo Trending