swapback
你的数据始终属于你。一个本地代理,在提示词到达 LLM 提供商之前,将姓名、邮箱、电话和密钥替换为占位符,并在回复中将其还原。

快速开始
pip install swapback
swapback demo
swapback init && swapback-proxy
需要 Python 3.11 或更高版本。swapback demo 使用虚构数据运行一个假模型:无需密钥,无需网络。代理监听 127.0.0.1:8787;将你的客户端指向它,其他什么都不用改:
from openai import OpenAI
client = OpenAI(
base_url="http://127.0.0.1:8787/v1")
为真实提供商进行配置
swapback init 会写入 swapback.yaml 和 known.yaml。将绝不能到达提供商的姓名、邮箱、电话和 ID 放入 known.yaml(或使用 swapback known init --vcf contacts.vcf 从联系人导出文件构建),在 swapback.yaml 中设置 upstream:,运行 swapback check-config,然后启动 swapback-proxy。完整步骤(包括 OpenRouter 和 Anthropic 的 base URL)见指南。
兼容
- OpenClaw:已通过一个提供商配置块完成端到端测试(2026.10.7);其 exec、web_fetch、web_search、browser 和 message 工具默认保留占位符。配置。
- Hermes Agent:每天运行在维护者自己的 Hermes agent 之前,处理真实的邮件和日历流量。
- 任何 OpenAI 兼容客户端:OpenAI Chat Completions 和 Responses(官方 SDK、OpenRouter、LiteLLM 客户端)。设置 base URL,其他什么都不用改。
- Anthropic Messages:Anthropic SDK,普通和流式,包括 tool_use。
- Claude Code 和 Codex CLI 的工具策略配方:框架配方。
工作原理
flowchart LR
A["Your app or agent"] -- "Email Jane Q Doe" --> S["swapback (127.0.0.1:8787)"]
S -- "Email «PERSON_1»" --> P["LLM provider"]
P -- "Hi «PERSON_1» ..." --> S
S -- "Hi Jane Q Doe ..." --> A
- 替换。你自己列表中的值会按其常见拼写形式进行匹配(大小写、分隔符、转义、嵌套 JSON);检测器会捕获你未列出的电话、邮箱、卡号、IBAN 和 API 密钥。每一项都会变成一个带类型的占位符。
- 检查。出口复检会再次扫描出站请求。如果列表中任何内容仍然存在,或清洗失败,请求将被阻止(503)。它采用失败关闭策略。
- 还原。回复中的占位符会被逐字节精确还原,包括普通回复、流式回复以及工具调用参数。网络、shell 和发送类工具调用会保留占位符,除非你允许该工具,因此被提示注入的 web_fetch 无法将你的邮箱带出去。
无需下载模型,也没有任何概率性成分:精确匹配加模式,约 5,900 行 Python,3 个依赖。你可以用 swapback selftest 自行重新运行泄漏测试(虚构数据,7 条请求路径,约 12 秒)。
文档
| 主题 | 位置 |
|---|---|
| 为什么选择 swapback、安装、代理、工具调用、配置、钩子 | docs/guide.md |
| 它无法捕获的内容,以及安全说明 | docs/limits.md |
| 泄漏测试、性能、检测评分 | docs/testing.md |
| 与 PasteGuard、Maskit、Veil、piighost 和 Kiji 的比较 | docs/comparison.md |
| 每个版本的变更 | CHANGELOG.md |
| 报告漏洞 | SECURITY.md |
项目事实:Python 3.11+,约 5,900 行(302 KB),3 个依赖(PyYAML、phonenumbers、pyahocorasick),stdlib HTTP 服务器,MIT。
开发
pip install -e ".[test]"
pytest -q # the full suite, including the holdout score as a regression floor
python evals/run_holdout.py # the detection score table in docs/testing.md (--misses lists the cases not caught)
python examples/smoke.py # end-to-end: mock upstream + proxy, plain and streamed
写成 {{NAME_ab12cd34}} 形式的值是真实值的占位符。请完全按照书写形式使用它们,无论是在回复中还是在工具调用中:它们会在任何内容运行之前被填入真实值。不要要求验证它们,也不要用示例替换它们。
内置规则集位于 swapback/vendor(见 THIRD_PARTY_NOTICES.md);tools/build_vendor.py 会重新生成 Presidio 模式。
见 CONTRIBUTING.md 和变更日志。
Roadmap
- 恢复 Anthropic Messages 流式响应。已在 0.1.1 完成。
- 将所列值的分隔符与大小写变体(NBSP、.、_、-、%20、全大写)归并到同一个占位符下。已在 0.1.1 完成。
- 恢复 OpenAI Responses API 流式响应。已在 0.3.0 完成。
- 在可能外发数据的工具调用中保留占位符。已在 0.3.0 完成。
- 从联系人导出文件构建已知值文件。已在 0.3.0 完成(swapback known init)。
- 可选的、可插拔的 NER,用于识别从未列出的姓名,默认关闭。
- 更多国家身份证件与地址模式,附带基于合成数据的测试。
- 发布到 PyPI。已完成:pip install swapback。
- 用于支出上限、本地回退和用量统计的钩子。已在 0.4.0 完成。
- 公开的、可重复运行的泄漏测试。已在 0.4.2 完成(swapback selftest)。
欢迎提出想法和 pull request;对于较大的改动,请先开 issue。
License
MIT,见 LICENSE。内置规则数据:gitleaks(MIT)和 Microsoft Presidio(MIT),见 THIRD_PARTY_NOTICES.md。