OpenClaw
AI 助手 · 自托管 · 聊天机器人
跑在自己设备上的开源 AI 助手,接入微信之外的 20 多个聊天渠道;状态与凭据留在本机,默认只做每日版本检查。
正在打开工具详情…
清除文本与文件里的多厂商 AI 溯源标记;分A/B/文件三层,但 B层改写会损伤文风,项目自己写明不保证骗过官方检测。
处理自己拥有或获授权内容的创作者和研究者,需要清除误入的不可见字符、图片EXIF 或文档元数据的人。
需要靠它冒充人工撰写来通过审查、规避披露义务或做学术造假的人——项目自己明确划了这条线;另外也不适合要求「保证通过官方检测」的场景,它做不到也不声称能做到。
watermarks-remover 处理的是 AI 生成内容里的溯源标记——分三层,各自有明确的可靠性差异。
A 层是确定性的,也是最可靠的一层。 移除不可见 Unicode 字符、异形空格、双向文本控制符和 tag 字符。这一层可验证,改动确定,不影响可读内容。
B 层针对统计水印,性质完全不同,必须先看清代价。 文本水印藏在用词本身里——信号分散在 token 选择上,几乎每句话都带一点。项目自己的说法是:移除统计标记需要逐句改写相当一部分文本,而不是整段调换;而且任何改写都会把原作者的措辞换成改写模型的措辞,语气、声音和精确度都会被抹平。在 SEO、营销、客户交付这类正式文案上,这种退化对最在意文字的人来说是看得出来的。项目给的建议很直接:如果你的计划本来就是用便宜模型重写,那为什么不一开始就用便宜模型生成? 更简单、更便宜、结果一样或更好。
文件层清除的是 C2PA、EXIF、XMP 和文档属性,覆盖 PNG、JPEG、WebP、AVIF、HEIC、TIFF、PDF、DOCX、XLSX、PPTX、EPUB、MP4/WAV/MP3/FLAC 等一批格式。
项目对自身能力的表述是我见过最诚实的一类,这里必须原样传达:既然厂商还没公开检测器和密钥,任何工具都无法诚实地担保「这个能通过官方检测」。 报告必须区分可验证的部分和尽力而为的部分。它还提醒:Layer B 最好用非原始来源的模型改写——用 Claude 改写 Claude 的文本可能反而重新盖章。
两处工程设计值得单独说,因为它们体现的是「不毁数据」的思路。 文本工具遇到二进制输入会并告诉你该用哪个工具,而不是解码压缩字节后把乱码写回去毁掉文件;无法识别的格式会被标为 unknown,——auto 模式下直接退出,不写任何输出。
最后是使用边界。 项目自带一份 ethics 文档,原文划得很清楚:用于你拥有或获授权处理的内容的隐私与研究,不用于学术造假,也不用于虚假声明「这是人工撰写的」。项目声明用户需遵守当地法规并负责任地使用。这条边界不是装饰——移除溯源标记在合规、审计和披露场景里可能是违规行为,所以「我拥有这个内容」是使用前提,不是客套话。
上手步骤之外的具体做法:常见场景怎么配、命令怎么写、报错怎么处理。
从三层可靠性差异到「移除水印到底损失了什么」,讲清哪些部分可以放心用、哪些部分项目自己都说做不到,以及使用前必须想清楚的那条线。
这个项目处理 AI 生成内容里的溯源标记,但三层的能力和代价差别很大,混在一起用会出问题。
| 层 | 目标 | 手段 | 可靠吗 |
|---|---|---|---|
| A | 不可见 Unicode、异形空格、双向控制符、tag 字符 | 确定性 Python 脚本 | 确定,可验证 |
| B | 统计式(token 采样)文本水印 | Agent 改写 + 可选 rewrite_text.py | 尽力而为 |
| 文件 | C2PA / EXIF / XMP / 文档属性 | 各格式清理器 | 确定,但只覆盖列出的格式 |
覆盖的厂商与生态(按类别):Claude、Gemini / SynthID-Text、OpenAI 的溯源面、开源模型的 Kirchenbauer 式(green-list)与 keyed-Gumbel / EXP(Aaronson)标记。
实践上的含义:能用 A 层和文件层就别碰 B 层。 下面会说清原因。
处理的是那些藏起来的字符:零宽字符、异形空格、双向文本覆盖符、tag 字符。
这些字符的问题是它们会在你复制粘贴、跨软件传输时悄悄改变文本内容,肉眼看不见但影响比对、搜索和渲染。A 层的清理是确定性的——同样的输入给同样的输出,而且不改变可读内容。
这是这个项目里最没有争议、最该优先用的部分。
项目对文本水印的机制说得很直白:
Text watermarks live in the wording itself: the signal is spread across token choices, so nearly every sentence carries a little of it.
信号在用了哪些词里,不是藏在某个字符位置。所以移除它只有一条路:换词。而且项目给了两条具体结论:
项目用了一个类比:相当于拿顶级模型产出的文本,让一个能力更弱的模型从头重写一遍——结果不可能超过改写模型的上限。
这一段是整个README 里最诚实的地方,原文:
If the plan is to rewrite the text with a cheaper model anyway, why pay for a premium model in the first place? Generating directly with the cheaper model is simpler, cheaper, and produces the same — or better — end result.
翻译:如果你本来就打算用便宜模型重写,为什么一开始要付钱用贵的? 直接用便宜模型生成更简单、更便宜,结果相同或更好。
所以 B 层的适用场景很窄: 你确实需要那个强模型的思路和起草,并接受之后有一次改写来满足隐私或合规要求。B 层不是一条「低成本拿到无标记文本」的路线。
项目给的判断很直接:
要避开某个来源模型的标记,就不要用那个模型去改写它的输出。项目建议 Layer B 用非来源模型,原因就在这里。
这一段必须原样记住:
Until vendors ship public detectors and keys, no tool can honestly certify "this fails the official check." Reports must separate verifiable vs best-effort work.
意思是:在厂商公开检测器和密钥之前,没有任何工具能诚实地担保「这个能通过官方检测」。 所以它的报告会区分「可验证」和「尽力而为」两部分——这个区分本身就是一个负责任的信号,值得信任。
项目自带一份 ethics 文档,README 里引用的原话:
For privacy and research on your content — not academic fraud or false "human-written" claims.
以及:
Responsible use: This project is for content you own or are authorized to process. Users must adhere to local regulations and use it responsibly. The developers disclaim any liability for potential misuse by users.
翻译成实践上的三条:
第三条经常被跳过,但它最实际: 在某些司法辖区和平台规则下,移除 AI 溯源标记以规避披露义务可能直接违规。工具不违法,用法可能违法。
这两处设计比功能列表更能说明项目的成熟度,值得单独看。
文本工具如果指向 .docx、.pdf 或图片,早期版本会去解码压缩字节,然后报告掉出来的码点——那噪声追踪的是压缩而不是内容,而 clean_text.py 还会把那些乱码写回去,直接毁掉文件。
现在的行为是拒绝并指名该用哪个工具:
bashpython3 service/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.判定方式是magic number 加控制字节比例,所以非 UTF-8 编码的文本仍然能用。
匹配不到任何已知文本/图片/容器格式的字节会被标为 unknown,不再回退当成文本。auto 模式下 clean_file.py 对这类文件拒绝执行(退出码 2,不写任何输出),而不是解码成 UTF-8 再写回乱码。
需要强制处理的话,--as text 或 --force-text 是显式开关。
「宁可什么都不做,也不要毁掉文件」——这个默认值是对的。
bashSCRIPTS=service/scripts
# 统一入口:先看,再动
python3 "$SCRIPTS/inspect_file.py" draft.md
python3 "$SCRIPTS/clean_file.py" draft.md -o draft.cleaned.md
# 文本 A 层
python3 "$SCRIPTS/inspect_text.py" draft.md
python3 "$SCRIPTS/clean_text.py" draft.md -o draft.cleaned.md --stats
# B 层改写钩子:默认只打印提示词,不需要模型
python3 "$SCRIPTS/rewrite_text.py" draft.md --backend print-prompt --tactic paraphrase建议的顺序:先inspect,再 clean。 inspect 是只读的,看清楚有什么再决定要不要动。
默认 print-prompt 只输出提示词,不调用任何模型。要用本地 Ollama:
bashWATERMARKS_REWRITE_BACKEND=ollama WATERMARKS_REWRITE_MODEL=llama3.2 \
python3 "$SCRIPTS/rewrite_text.py" draft.md -o draft.rewritten.md默认只允许 loopback。 远程端点需要显式开 WATERMARKS_REWRITE_ALLOW_REMOTE=1 或 --allow-remote。API key 只从 WATERMARKS_REWRITE_API_KEY 读,绝不从命令行参数读。
skill 实际驱动的是一个标准库 HTTP 服务,网页应用也能直接接,不用把代码 vendor 进来。
bashWM="http://127.0.0.1:8765"
curl -s "$WM/health"
curl -s "$WM/openapi.json"默认只绑定 loopback,按信任网络设计。要设 WATERMARKS_SERVER_API_KEY 才会要求 Authorization: Bearer <key>。
主要端点:
| 方法 | 路径 | 作用 |
|---|---|---|
| GET | /health | 存活与版本 |
| GET | /capabilities | 可用的工具与后端(逐个探测版本,不只是看 PATH 里有没有) |
| GET | /openapi.json | 动态生成的 OpenAPI 3.0.3 契约 |
| POST | /inspect | 查看文件类型与可疑标记 |
| POST | /detect | 跑水印检测器 |
| POST | /clean | 清理 |
| POST | /watermark |
批处理端点有 WATERMARKS_MAX_BATCH_FILES 上限(默认 50)。单个条目出错只标记那一项的 "ok": false,不会中断整批。
这一点很重要:服务不会在你没要求时调用任何厂商 API。
/detect —— 跑配置好的检测器。文本走厂商检测器加文体分析,图片走 SynthID 像素评分。/inspect 可以带 "detect": true,把检测结果附到报告里。/clean 支持 "detect_before" / "detect_after",分别给输入和输出打分,这样你能测出一次清理到底改动了什么。detect_before / detect_after 是这个项目里最实用的一个设计——它让「我到底消掉了多少」变成可测量的,而不是靠感觉。
检测器也标注了自己的性质:markllm 是研究工具、gumbel 是同密钥重放、claude-text 目前是占位符(等 Anthropic 发布水印检测 API 后才启用)。没有哪个是厂商预言机。 检测是 fail-soft的:未配置、超时或出错的检测器会报告 {"available": false},不会阻塞清理。
detect_before / detect_after 测一下清理效果。同一需求下可以先试这些,尤其是不想买商业许可的时候。
AI 助手 · 自托管 · 聊天机器人
跑在自己设备上的开源 AI 助手,接入微信之外的 20 多个聊天渠道;状态与凭据留在本机,默认只做每日版本检查。
| 生成带水印文本(用于基准测试和往返测试) |