Metadata-Version: 2.5
Name: saklam
Version: 0.1.1
Summary: Saklam PII — Erkennen und Maskieren personenbezogener Daten, lokal (dieselbe Engine wie Saklam-App und Saklam-Bridge)
Project-URL: Homepage, https://saklam.com
Project-URL: Documentation, https://saklam.com/en/docs
Author-email: Stefan Böck <stefan@saklam.com>
License: Proprietary; see LICENSE
License-File: LICENSE
Keywords: anonymisierung,dsgvo,gdpr,masking,ner,pii,privacy
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: Other/Proprietary License
Classifier: Natural Language :: German
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Security
Classifier: Topic :: Text Processing :: Linguistic
Requires-Python: >=3.10
Requires-Dist: cryptography>=41.0
Requires-Dist: numpy>=1.24
Requires-Dist: onnxruntime>=1.17
Requires-Dist: pydantic>=2.0
Requires-Dist: pyyaml>=6.0
Requires-Dist: saklam-model-de-small>=0.1.1
Requires-Dist: tokenizers>=0.15
Provides-Extra: dev
Requires-Dist: build>=1.0; extra == 'dev'
Requires-Dist: pytest>=7.0; extra == 'dev'
Provides-Extra: gliner
Requires-Dist: gliner==0.2.27; extra == 'gliner'
Requires-Dist: torch>=2.0; extra == 'gliner'
Description-Content-Type: text/markdown

# saklam

Erkennt und maskiert personenbezogene Daten in deutschem Text (plus EN, FR, ES,
IT, NL, PL) — **lokal, im eigenen Prozess**. Dieselbe Engine, die die
Saklam-App und die Saklam-Bridge (Docker) fahren, mit demselben
Platzhalter-Format und demselben Lizenzschlüssel.

## Installation

```bash
pip install saklam
```

Das mitgelieferte NER-Modell (`saklam-model-de-small`) kommt mit — danach läuft
alles ohne weiteren Download. Python 3.10–3.12.

**Kein torch, kein CUDA.** Das Modell rechnet direkt in ONNX Runtime; die
Installation ist rund **300 MB** (frische Umgebung, inklusive Modell: macOS
295 MB, linux/amd64 321 MB, linux/arm64 310 MB). Pflicht-Abhängigkeiten:
`onnxruntime`, `tokenizers`, `numpy`, `pydantic`, `pyyaml`, `cryptography`.

Geprüft auf **macOS arm64, Linux amd64/arm64 und Windows amd64** (Linux in
Docker `python:3.11-slim`, Windows und die x86-Kernel in der GitHub-Matrix).

Still gekürzt wird nie: steht kein Modell zur Verfügung, arbeitet `saklam`
ausdrücklich im Regex-Modus (`engine_id == "regex"`, Grund in
`license_status().note`). Und wenn ein Modell zwar lädt, auf dieser Maschine
aber nichts findet, bricht `saklam` beim Laden mit `SelfTestError` ab, statt
kommentarlos ohne Namen weiterzumachen — ein fester Kanon-Satz geht dafür einmal
durch das Modell (Notausgang: `SAKLAM_SKIP_SELFTEST=1`).

> **0.1.0-Nutzer bitte aktualisieren.** Das dort gebündelte Modell war U8S8
> quantisiert und fand auf x86-CPUs ohne VNNI (AMD EPYC/Zen 3-4, ältere Intel)
> **gar keine** Namen, Organisationen und Orte — ohne Warnung. 0.1.1 liefert die
> U8U8-Fassung, die auf diesen CPUs nachweislich rechnet; auf CPUs *mit* VNNI
> kostet sie rund doppelte Rechenzeit. Details in `CHANGELOG.md`.

## In drei Zeilen

```python
from saklam import Saklam

pii = Saklam(license_key="sk-lic-…")                     # oder SAKLAM_LICENSE_KEY
r = pii.mask("Philip Müller aus Zürich, philip@example.org")
r.masked        # '[PER_1864ad4c] aus [LOC_2350dca1], [EMA_c85d5952]'
pii.unmask(r.masked, r.mapping)   # Original zurück
```

Dazu: `pii.detect(text)` für die Spans, `pii.license_status()` für den Zustand
und die Kommandozeile `saklam mask | detect | license | models`.

## Zero-Knowledge

Text und Erkennungsergebnisse verlassen den Host **nie**. Über das Netz geht
ausschliesslich der Lizenzschlüssel gegen den Token-Endpunkt; die Prüfung des
kurzlebigen, Ed25519-signierten Tokens läuft danach bei jedem Aufruf **offline**
gegen den im Paket eingebetteten Public Key. Kein Phone-Home pro Aufruf, keine
Telemetrie, keine Logs mit Rohtext.

## Lizenz

Proprietär. Nutzung nur mit gültigem Saklam-Lizenzschlüssel:
**99 EUR/Monat, ein Key für alle Formfaktoren** — pip-Paket, Docker-Bridge und
App. Ohne gültiges Token lehnen `detect()` und `mask()` ab.

Der Lizenz-Token liegt im Cache unter `~/.cache/saklam/license/` — auf macOS
und Linux mit `0600` in einem `0700`-Verzeichnis. Unter Windows gibt es diese
Bits nicht; dort liegt die Datei wie jede andere Profildatei und erbt die Rechte
des Benutzerprofils (Empfehlung: BitLocker und die üblichen Profilrechte).

Schlüssel und Details: <https://saklam.com> · Doku:
<https://saklam.com/en/docs> · Handbuch (Modell-Leiter, Regex-Modus,
Grenzen, Air-Gap): `docs/HANDBUCH.md` im sdist · Änderungen: `CHANGELOG.md`.

---

*English:* Local PII detection and masking for German-language text, same
engine as the Saklam app and the Saklam Bridge. Text never leaves the host —
only the license key is exchanged for a short-lived token, verified offline on
every call. Commercial license, 99 EUR/month, one key for every form factor.
Docs: <https://saklam.com/en/docs>.
