Saklam Bridge — Setup-Guide
Drop-in LLM-Proxy mit automatischer PII-Maskierung. On-Premises in eurer eigenen Infra, Zero-Knowledge gegenüber Saklam, DSGVO-konform — sensible Daten bleiben on-prem.
Diese Anleitung führt euch durch Installation und Inbetriebnahme des Saklam-Bridge-Containers in eurem eigenen Netz. Ihr behaltet die volle Datenhoheit: Klartext verlässt eure Infrastruktur nie unmaskiert.
Architektur in einem Bild
App-Server / Workstations / CI
Claude Code · Cursor · Eigenanwendungen
│
│ ANTHROPIC_BASE_URL=http://bridge.intern.example.com
│ ANTHROPIC_API_KEY=sk-bridge-<euer-master-key>
▼
┌─ Saklam Bridge (Docker in eurer Infra) ─────────────────────────┐
│ 1. Eingehender Request mit sensiblem Klartext │
│ 2. PII-Maskierung (350+ Patterns, EU-27 + EWR) │
│ 3. Forward an Anthropic/OpenAI/Mistral mit eurem API-Key (BYOK) │
│ 4. Response demaskieren │
└──────────────────────────────────────────────────────────────────┘
│
│ Maskierte Tokens, euer API-Key
▼
Anthropic / OpenAI / Mistral
Was Saklam sieht: keine Inhalte, niemals. Einziger Kontakt zum Saklam-Server ist der Lizenz-Token-Abruf (beim Start und danach periodisch) — dabei geht ausschließlich euer Lizenz-Key raus, nie Prompts oder Kundendaten. Nachmessbar: tcpdump am Container zeigt genau zwei Ziele — saklam.com (Lizenz) und euren LLM-Provider.
Was der LLM-Provider sieht: maskierte Tokens, niemals Klartext.
Voraussetzungen
| Komponente | Detail |
|---|---|
| Host-OS | Linux x86_64 oder ARM64 (Container ist multi-arch). Windows/macOS via Docker Desktop. |
| Docker | Docker Engine ≥ 24 oder Docker Desktop ≥ 4.30 mit docker compose v2 Plugin |
| CPU/RAM | 1 vCPU + 2 GB RAM empfohlen (läuft nachweislich auch mit 1 GB); 2 vCPU + 2 GB für niedrigere Latenz / Multi-User |
| Storage | ~1,5 GB Disk (Download ~0,45 GB) — das PII-Modell (GLiNER, ONNX) ist im Image vorinstalliert, kein Laufzeit-Download |
| Netzwerk | Outbound HTTPS zu api.anthropic.com (bzw. eurem gewählten Provider) |
| API-Key | Pay-as-you-go API-Key beim LLM-Provider — nicht Max/Pro/Team-Subscription-OAuth (siehe Auth-Note unten) |
Quick-Install (5 Minuten)
# 1. Verzeichnis anlegen
mkdir -p /opt/saklam-bridge && cd /opt/saklam-bridge
# 2. docker-compose.yml + .env.example herunterladen
curl -fsSL https://saklam.com/bridge/docker-compose.yml -o docker-compose.yml
curl -fsSL https://saklam.com/bridge/env.example -o .env.example
# 3. .env vorbereiten
cp .env.example .env
$EDITOR .env
# - SAKLAM_LICENSE_KEY=sk-lic-… (Pflicht — aus Aktivierungs-Mail/Dashboard)
# - ANTHROPIC_API_KEY=sk-ant-api03-… (Pay-as-you-go-Key)
# - BRIDGE_MASTER_KEY=$(openssl rand -hex 32) (optional, siehe Auth-Modi unten)
# 4. Start
docker compose pull
docker compose up -d
# 5. Smoke-Test
sleep 5
curl -fsS http://localhost:4000/health/readiness
Auth-Modi (Master-Key)
| Setup | Konfiguration | Wann |
|---|---|---|
| Single-User auf Laptop (Bridge nur lokal genutzt) | BRIDGE_BIND_ADDR=127.0.0.1, BRIDGE_MASTER_KEY= (leer) |
Solo-Dev, Dogfooding. Bridge akzeptiert beliebigen x-api-key. Sicher, weil nur Host-Prozesse zugreifen können. |
| Multi-User-Server (zentraler Bridge fürs ganze Team) | BRIDGE_BIND_ADDR=0.0.0.0, BRIDGE_MASTER_KEY=<openssl rand -hex 32>, TLS-Reverse-Proxy davor |
Production-Deployment. Master-Key + TLS sind beide zwingend. |
Erwartete Antwort: {"status":"connected"} (HTTP 200).
Tool-Integration
Claude Code (CLI)
export ANTHROPIC_BASE_URL=http://localhost:4000
export ANTHROPIC_API_KEY=<euer BRIDGE_MASTER_KEY aus .env>
claude
In der gestarteten Claude-Session beliebigen Prompt mit Klartext-PII testen:
> "Schreibe ein Mahnschreiben an Max Mustermann, Musterstr. 12, 80331 München, Forderung 1.245,50 €."
Die Bridge maskiert Max Mustermann → [PER_a1b2c3d4], Musterstr. 12, 80331 München → [LOC_…], sendet die maskierte Version an Anthropic und demaskiert die Antwort vor der Rückgabe.
Cursor
Cursor Settings → Models → API Keys:
- Anthropic API Key:
<BRIDGE_MASTER_KEY> - Anthropic Base URL:
http://localhost:4000(oderhttp://bridge.intern.example.com)
Eigene Skripte (Python anthropic SDK)
from anthropic import Anthropic
client = Anthropic(
base_url="http://localhost:4000",
api_key="<BRIDGE_MASTER_KEY>",
)
resp = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Kunde: Müller, Vorgang 2025/4711, Betrag 18k €."}]
)
n8n (self-hosted)
Eigene Anleitung mit Chat-Workflow, Credential-Setup und Abgrenzung zum n8n-Guardrails-Node: Saklam Bridge + n8n. Kurzform: OpenAI-Credential mit Base URL = http://saklam-bridge:4000/v1 — auch für Claude (n8ns Anthropic-Credential hat kein Base-URL-Feld).
LAN-Erreichbarkeit für Team-Workstations
Default bindet die Bridge auf 127.0.0.1:4000. Für netzweiten Zugriff:
- In
.env:BRIDGE_BIND_ADDR=0.0.0.0 - Reverse-Proxy (nginx/Caddy/Traefik) mit TLS davor — niemals plain HTTP über LAN, weil sensibler Klartext zwischen Workstation und Bridge fließt.
docker compose up -dneu starten.
Im Prozess: pip und npm
Gleiche Engine, gleiches Platzhalter-Format, gleicher Lizenzschlüssel, ohne
Container: pip install saklam und npm install saklam erkennen und maskieren
im eigenen Prozess. Aktuelle Version ist 0.1.1 (10.09.2026).
0.1.0 bitte nicht verwenden: die dort gebündelte Modell-Fassung lieferte auf x86-Prozessoren ohne VNNI-Befehlssatz (AMD EPYC/Zen 3–4, Intel vor Ice Lake) keine KI-Treffer und fiel dabei still auf die Regex-Schicht zurück. 0.1.1 behebt das.
| Bridge (Docker) | Paket im Prozess | |
|---|---|---|
| Formfaktor | Gateway-Container in eurer Infra | eine Abhängigkeit in eurer Anwendung |
| Setup | docker compose up -d |
pip install saklam / npm install saklam |
| Sprachen | beliebig (spricht HTTP) | Python ≥ 3.10, Node ≥ 20 |
| Plattformen | Linux-Host mit Docker (amd64, arm64) | macOS arm64, Linux amd64/arm64, Windows amd64 |
| Roundtrip | maskieren, Provider rufen, demaskieren, alles im Gateway | ihr ruft mask() vor eurem LLM-Call und unmask() danach |
| Provider-Keys | BYOK im Container | euer eigener Client-Code; Saklam steckt gar nicht im Call |
| Lizenz | sk-lic-…, 99 € / Monat |
derselbe Schlüssel, dieselben 99 € / Monat |
Die Bridge nehmt ihr, wenn die Maskierung vor einem fertigen Werkzeug sitzen muss (Claude Code, Cursor, n8n, ein ganzes Team) oder wenn der Stack weder Python noch Node ist. Das Paket nehmt ihr, wenn ihr den Code, der mit dem Modell spricht, ohnehin selbst schreibt und keinen Container betreiben wollt.
Installation
pip install saklam # Python ≥ 3.10
npm install saklam # Node ≥ 20
# geprüft auf macOS arm64, Linux amd64/arm64, Windows amd64
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) # Klartext zurück
Drei Zeilen, Node
import { Saklam } from 'saklam';
const s = new Saklam({ licenseKey: process.env.SAKLAM_LICENSE_KEY });
await s.ready();
const { masked, mapping } = await s.mask(
'Philip Müller aus Zürich, philip@example.org'
);
// masked → '[PER_651b852a] aus [LOC_ae6c7a68], [EMA_203cfcd0]'
const antwort = await llm(masked); // maskiert raus
const klartext = s.unmask(antwort, mapping); // Klartext zurück
Beide Pakete installieren zusätzlich das Kommando saklam:
saklam mask "Philip Müller, philip@example.org"
saklam detect "…" --json
saklam license
Modelle
| Modell | Größe | Herkunft |
|---|---|---|
bundled (npm) / small (pip, Wheel saklam-model-de-small) |
83,7 MiB | im Paket enthalten; läuft direkt nach der Installation offline |
default |
237,9 MiB | lizenzgebundener Download von saklam.com/v1/models/ beim ersten Start, Cache ~/.cache/saklam/models/<model_id>/ |
Das gebündelte Modell ist seit 0.1.1 U8U8-quantisiert (87.791.681 Byte) und
rechnet damit auf x86-64 mit und ohne VNNI-Befehlssatz korrekt; default
ist eine fp32-Fassung. Geprüfte Plattformen: macOS arm64, Linux amd64 und
arm64, Windows amd64 — belegt durch die CI-Matrix auf echten Wirten
(GitHub Actions ubuntu/macos/windows, darunter AMD-EPYC-Runner ohne VNNI). Der
Download für default braucht ein gültiges Lizenz-Token, wird gegen im Paket
gepinnte Prüfsummen gehalten und landet atomisch im Cache.
Selbsttest beim Start: sobald das KI-Modell geladen ist, schickt das Paket
einmal einen festen Kontrollsatz durch die Erkennung. Kommt dabei keine Person
zurück, bricht der Start laut ab (SelfTestError in Python, ready() wirft in
Node, CLI-Exit-Code 4), statt still mit halbierter Erkennung weiterzulaufen.
Notausgang für bewusste Sonderfälle: SAKLAM_SKIP_SELFTEST=1.
Ist kein Modell ladbar, brechen die Pakete nicht ab: sie laufen mit der
Regex-Schicht allein weiter und sagen es (ready().mode in Node,
MaskResult.engine und status() in Python). Die Regex-Schicht findet
strukturierte PII (E-Mail, Telefon, IBAN, Steuer-ID, Ausweis- und
Kreditkartennummern, Adressen), aber keine freien Namen, Orte oder
Organisationen.
Abgeschottete Hosts: ein vorbereitetes Modell-Verzeichnis auf die Platte
legen und SAKLAM_MODEL_DIR daraufzeigen lassen (model_dir= in Python,
modelDir in Node). Dann wird nichts geladen.
Lizenz und Zero-Knowledge
- Der Schlüssel ist derselbe
sk-lic-…wie bei der Bridge, aus der Aktivierungs-Mail oder dem Dashboard. Ein Schlüssel deckt alle Formfaktoren ab: Bridge, pip, npm. Entweder an den Konstruktor übergeben oderSAKLAM_LICENSE_KEYsetzen. - Er wird einmal gegen ein kurzlebiges, Ed25519-signiertes Token getauscht
(
POST https://saklam.com/v1/license/token) und in~/.cache/saklam/license/<sha256(key)[:16]>.tokenabgelegt. Jeder weitere Aufruf prüft dieses Token offline gegen den im Paket eingebetteten Public Key. Kein Phone-Home pro Aufruf. Ist saklam.com nicht erreichbar, gilt das gecachte Token bis zu seinemexp(Gnadenfrist). pip und npm nutzen dieselbe Cache-Datei: eine Aktivierung bedient beide. - Dateirechte nur unter macOS und Linux: dort liegt die Token-Datei mit
0600in einem Verzeichnis mit0700. Windows kennt diese Bits nicht — dort liegt sie unterC:\Users\<name>\.cache\saklam\wie jede andere Datei im Nutzerprofil und erbt dessen Rechte; Empfehlung entsprechend: Profilrechte und BitLocker. - Es verlässt nur der Schlüssel den Host, dazu zwei Betriebsangaben:
client(pipodernpm) undclient_version(die Paketversion). Nie Text, nie Erkennungsergebnisse, keine Hostnamen, keine Nutzungszahlen. - Hard-Gate: ohne gültiges Token verweigern
detect,maskundunmaskdie Arbeit (LicenseError, CLI-Exit-Code 2). Es gibt keinen Env-Schalter, der die Prüfung abschaltet. Der keylose 7-Tage-Trial der Browser-Erweiterung gilt hier nicht; diese Pakete wollen einen echten Schlüssel.
Platzbedarf
pip saklam |
npm saklam |
|
|---|---|---|
| Größe | ~300 MB installiert inklusive Modell (macOS 295 MB, linux/amd64 321 MB, linux/arm64 310 MB), kein torch, kein CUDA | 96,8 MB entpackt, 77,3 MB Tarball |
| Abhängigkeiten | onnxruntime, tokenizers, numpy, pydantic, pyyaml, cryptography |
onnxruntime-node (exakt 1.29.0), sonst nichts |
| Laufzeit | Python ≥ 3.10 | Node ≥ 20 |
| Plattformen | macOS arm64, Linux amd64/arm64, Windows amd64 | macOS arm64, Linux amd64/arm64, Windows amd64 |
Das Modell zu laden dauert einmalig 1 bis 4 Sekunden, danach kostet ein kurzer Satz rund 20 bis 25 ms (macOS arm64).
Ehrlicher Preis des Fixes: auf x86-Prozessoren mit VNNI kostet die U8U8-Fassung rund die doppelte KI-Rechenzeit gegenüber 0.1.0 (gemessen auf einem Xeon: 37 → 72 ms für drei Texte). Auf arm64 und auf x86 ohne VNNI ist der Unterschied Rauschen. Eine Fassung, die auf einem Teil der Rechner gar nichts findet, ist kein Geschwindigkeits-, sondern ein Korrektheitsproblem.
Grenzen
- Die Pakete fahren ein destilliertes Studenten-Modell, die Bridge ihr Produktionsmodell. Spans können an den Rändern abweichen (die Bridge zieht die Anrede in den Personen-Span, das Paket beginnt beim Titel). Der Name selbst ist in beiden Fällen maskiert.
- Healthcare-Texte bleiben bei der Bridge: auf klinischem Material übermaskieren die Studenten-Modelle (Präparatenamen als PERSON). Für pip/npm gibt es kein Healthcare-Versprechen.
- Die Pakete maskieren in eurem Prozess, sie sprechen aber mit keinem Provider. Routing, Streaming, Audit-Trail und das Hybrid-Setup sind Bridge-Funktionen.
Eigene Erkennung (Custom Detection)
Die Bridge erkennt ab Werk 335+ PII-Muster. Eigene sensible Daten —
Projektnamen, Vorgangsnummern, Fachbegriffe — ergänzt ihr über einen
Ordner ./custom neben der docker-compose.yml (Volume in der
Compose-Datei einkommentieren, Container neu starten). Kein Code, kein
Training, kein Image-Neubau. Drei Dateiarten:
| Datei | Zweck | Beispiel |
|---|---|---|
*.txt |
Begriffsliste, 1 Zeile = 1 Begriff; Dateiname = Kategorie | projekte.txt mit „Projekt Phoenix" → [PRO_…] |
*.yaml |
eigene Regex-Muster für feste Formate | Vorgangsnummer WUB-\d{6} → [VOR_…] |
labels.yaml |
eigene KI-Entitäten, zero-shot ohne Training | medikament: MEDIKAMENT erkennt „Pantoprazol" |
# custom/labels.yaml
labels:
medikament: MEDIKAMENT
diagnose: DIAGNOSE
ner_threshold: 0.5 # optional; höher = strenger
Alles ist additiv zu den eingebauten Mustern und läuft durch denselben Maskier-/Demaskier-Roundtrip und Audit-Trail. Hinweis: Mit konfigurierten KI-Entitäten läuft immer die volle NER-Analyse (~1–2 s/Request auf CPU) — Begriffslisten und Regex-Muster haben diesen Effekt nicht. Zero-Shot-Labels vor Produktivbetrieb mit echten Beispieltexten testen; für aufzählbare Begriffe ist die Liste immer die präzisere Wahl.
Arzneimittel-Wache (Opt-in, ab v0.2.18)
Für Klinik-, Praxis- und Arztbrieftexte: Die Erkennung hält Präparatenamen (Ramipril, Xarelto, Rocephin …) sonst gelegentlich für Personen. Die Arzneimittel-Wache verwirft solche Treffer anhand eines Gazetteers mit 5.746 Namen (Wirkstoffe aus ATC/Wikidata plus DACH-Handelsnamen). Sie erkennt nichts Neues und fasst weder Regex-Treffer noch Anreden („Frau Dr. med. …") an.
Aktivieren in der .env, dann Container neu erzeugen (docker compose up -d):
SAKLAM_DOMAIN_MODULES=klinik,kanzlei,generisch,kern,medneg
Im Start-Log erscheint dann Arzneimittel-Wache (medneg): AN (5746 Namen).
Ohne die Zeile bleibt das Verhalten unverändert. Die ganze deterministische
Domänen-Schicht lässt sich mit SAKLAM_DOMAIN_LAYER=0 abschalten.
Updates
cd /opt/saklam-bridge
docker compose pull
docker compose up -d
Wir empfehlen ein Wartungsfenster wöchentlich oder nach Saklam-Release-Notes. Patch-Releases sind kompatibel; Major-Versionen werden im Release-Channel angekündigt.
Auth-Note (wichtig vor Setup)
Saklam Bridge funktioniert ausschließlich mit klassischen API-Keys (pay-as-you-go), nicht mit Subscription-OAuth.
Funktioniert nicht:
- Anthropic Max / Pro / Team OAuth-Subscription-Tokens
- ChatGPT Plus / Team Web-Sessions
Unterstützte Provider (alle BYOK = Bring Your Own Key, Saklam tritt nicht als Reseller auf):
| Provider | Wann sinnvoll | Wo holen |
|---|---|---|
| Anthropic (direkt) | Frontier-Modelle (Claude Sonnet/Opus/Haiku) | console.anthropic.com → API Keys |
| OpenAI (direkt) | GPT-Modelle | platform.openai.com → API Keys |
| Azure OpenAI | Wenn M365-Enterprise-Vertrag vorhanden — gleiche GPT-Modelle mit EU-Data-Residency + Microsoft-DPA | Azure Portal → AI Services → Azure OpenAI |
| Google Gemini (Vertex AI) | Gemini-Familie, EU-Region Frankfurt verfügbar | aistudio.google.com oder Vertex AI |
| AWS Bedrock | Wenn AWS-Vertrag vorhanden — Claude / Llama / Mistral durch eine API mit AWS-DPA, EU-Frankfurt (eu-central-1) |
AWS IAM → Access Key + Bedrock Model Access |
| Mistral (direkt) | EU-Provider La Plateforme | console.mistral.ai |
| Self-hosted | Eigenes Inference-Cluster (Ollama / vLLM / TGI) — maximaler Zero-K | OLLAMA_API_BASE=http://ollama.intern:11434/v1 |
Ihr wählt einen oder mehrere Provider und tragt die entsprechenden Env-Variablen in .env ein. Nur ANTHROPIC_API_KEY ist pflicht (Default-Provider beim ersten Start) — alle anderen optional. Config-Routing erfolgt automatisch über Modellname-Präfix:
claude-*→ Anthropicgpt-*/openai/*→ OpenAI (direkt)azure/*→ Azure OpenAIgemini/*→ Google Geminibedrock/*→ AWS Bedrockmistral/*→ Mistralollama/*→ Self-hosted
Hybrid-Routing: lokales Modell + maskiertes Frontier (ein Gateway)
Ihr müsst euch nicht zwischen „lokales Modell" und „Frontier-Qualität" entscheiden — die Bridge routet beides:
- Routine-Aufgaben → lokales Modell (
ollama/…): Der Request verlässt den Host nie. Zusammenfassungen, Klassifikation, einfache Entwürfe. - Komplexe Aufgaben → Frontier, maskiert (
claude-…,gpt-…): PII wird ersetzt, bevor der Request rausgeht, die Antwort lokal demaskiert.
Beide Pfade laufen durch dieselbe Maskierung und denselben Audit-Trail — eine Policy, ein Nachweis, egal welches Modell.
Ollama direkt im selben Compose-Stack mitstarten (optionales Profil):
# .env: OLLAMA_API_BASE=http://ollama:11434/v1
docker compose --profile local-llm up -d
docker compose exec ollama ollama pull llama3.2
Aufruf wie jedes andere Modell, nur mit ollama/-Präfix (OpenAI-Wire):
curl http://localhost:4000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model": "ollama/llama3.2", "messages": [{"role": "user", "content": "…"}]}'
Läuft Ollama schon woanders im Netz, reicht OLLAMA_API_BASE=http://ollama.intern:11434/v1 — das Profil ist nur die Compose-Bequemvariante. Realistische Erwartung: Lokale Modelle auf CPU-Servern sind spürbar langsamer und schwächer als Frontier — das Hybrid-Muster heißt bewusst „Routine lokal, Komplexes maskiert zu Frontier", nicht „lokal kann alles".
FAQ
Wird das LLM durch die [XXX_yyyyyyyy]-Platzhalter verwirrt oder verweigert es die Antwort?
Nein. Die Bridge injiziert automatisch eine System-Instruktion in jeden Request (wire-bewusst für Anthropic- und OpenAI-Format), die dem LLM erklärt: Tokens im Format [PER_a1b2c3d4], [EMA_…], [TEL_…] etc. sind maskierte personenbezogene Daten — exakt übernehmen, nicht verändern, nicht erfinden, und „wie die echten Daten" behandeln.
Für normale Aufgaben (Zusammenfassen, Texte, E-Mail-Entwürfe, Analysen) bleibt die Output-Qualität damit voll erhalten — der Platzhalter steht semantisch an Stelle der echten Person/IBAN/Adresse. In der Antwort werden die Platzhalter automatisch wieder demaskiert, bevor sie eure App/euren Client erreichen: Ihr seht die echten Werte, das LLM nie.
Grenzfall, der gewollt ist: Bei Aufgaben, die den exakten Originalwert eines maskierten Feldes brauchen — z.B. „prüfe die Prüfsumme dieser IBAN" oder „wie viele Ziffern hat diese Telefonnummer?" — merkt das LLM korrekt an, dass es nur einen Platzhalter sieht. Solche Format-/Validierungs-Prüfungen gehören auf eure Seite (vor oder nach der Bridge), nicht in die maskierte KI-Anfrage.
Praktischer Nebeneffekt für eigene Tests: Fragt ihr das LLM, ob ein maskiertes Feld „echt" ist, antwortet es mit „das ist ein Platzhalter" — ein direkter, sichtbarer Beleg, dass beim Provider nie Klartext ankommt.
Troubleshooting
unhealthy im docker ps
docker compose logs bridge
Typische Ursachen:
- Erste ~10–30s nach Start: GLiNER-Modell wird aus dem Image in den RAM geladen (Warmup, kein Download — Modell ist im Image) —
start_period: 60sim Healthcheck deckt das. Wenn nach 90s nochunhealthy: Logs prüfen. ANTHROPIC_API_KEYungültig → 401 von Anthropic → Bridge meldet keinen Fehler beim Start, aber jeder Request scheitert. Test:curl …/health/liveness(sollte 200 sein selbst ohne Anthropic).
401 Unauthorized bei Anthropic-Calls
Euer API-Key ist ein Max/Team-OAuth-Token statt klassischem sk-ant-…-Key. Siehe Auth-Note oben.
Latenz
Das Modell ist im Image vorinstalliert und wird beim Container-Start in den RAM geladen (kein Download zur Laufzeit, air-gapped-fähig). Der erste PII-Request ist daher nicht durch einen Download verzögert; Anfragen liegen bei ~<100 ms (CPU).
PII wird nicht maskiert
Logs prüfen: docker compose logs bridge | grep -i 'mask'. Häufige Ursachen:
MASK_API_URList gesetzt, aber das Ziel ist nicht erreichbar → Variable in.enventfernen. Default ist in-process (kein externer Mask-Service, kein Netzwerk-Hop).- Prompt enthält nur Domain-spezifische Kürzel die nicht in den 350+ Patterns sind → Custom-Patterns auf Anfrage
"Disclosure": Bridge zwischenspeichert PII während Request-Verarbeitung
Ja, das ist architektonisch zwangsläufig (RAM-only, kein Disk-Persistence). Ein böswilliger Container-Admin könnte den Prozess inspizieren. Daher: Bridge gehört in eure Infra, nicht zu Saklam.
keine gültige Lizenz / Requests werden mit 5xx abgelehnt
Die Bridge braucht eine gültige Lizenz (aktives Abo). Prüfen:
SAKLAM_LICENSE_KEYin.envkorrekt gesetzt (sk-lic-…aus Aktivierungs-Mail/Dashboard)?- Abo aktiv? Status im Dashboard.
- Beim Start holt die Bridge automatisch ein signiertes Lizenz-Token (es verlässt nur der Key den Host, keine Kundendaten). Logs:
docker compose logs bridge | grep -i lizenz. - Einmalig Netz zur Aktivierung nötig; danach trägt ein gecachtes Token über kurze Ausfälle (Gnadenfrist).
Logs & Datenschutz
- Default-Logging: strukturierte JSON-Logs (
json-file-Driver), rotiert nach 50 MB. - PII in Logs: Bridge loggt Request-Metadaten (Model, Token-Counts, Latenz), nicht Prompt-Klartext.
- Externes Log-Forwarding (Splunk, ELK, Loki): Standard-Docker-Logging-Mechanismen.
- Auditfähigkeit (opt-in): Manipulationssicherer Audit-Trail als Nachweis gegenüber eurem DSB — DASS maskiert wurde, ohne Klartext.
Audit-Trail aktivieren (für regulierte Anwender)
In der .env:
SAKLAM_AUDIT_LOG=/var/audit/audit.jsonl
Danach schreibt die Bridge pro maskiertem Request einen klartextfreien Datensatz: Zeitstempel, Modell, Anzahl maskierter Entitäten je Typ (PERSON, GERMAN_IBAN, …), Gesamtzahl — verknüpft in einer Hash-Kette (jeder Datensatz sichert den Vorgänger, Manipulation wird erkennbar). Nie im Log: Klartext, Platzhalter-Mapping, Prompt-Inhalte.
Integrität prüfen:
docker compose exec bridge python bridge_audit.py verify /var/audit/audit.jsonl
# ✓ Audit-Kette intakt — N Datensätze, keine Manipulation erkennbar.
Zusammen mit dem Compliance-Paket (Whitepaper, DSFA-Baustein, Verschwiegenheitsverpflichtung) ist das der Nachweis für die Datenschutz-Dokumentation.
Pricing & Lizenz
| Plan | Preis | Inhalt |
|---|---|---|
| Solo | €99 / Monat oder €990 / Jahr (2 Monate gratis), zzgl. MwSt | 1 Nutzer, unbegrenzt viele Instanzen, unbegrenztes Volumen, BYOK, Auto-Updates, Pattern-Pflege, Email-Support, monatlich kündbar |
Derselbe Schlüssel gilt in jedem Formfaktor: Bridge, pip install saklam und
npm install saklam (siehe Im Prozess: pip und npm). Gezählt
werden Nutzer, nicht Container: die Zahl der Instanzen ist in jeder Stufe
unbegrenzt.
Ein Team oder mehr als ein Nutzer? Schreib mir (stefan@saklam.com) — regeln wir individuell.
Datenverarbeitung: Saklam tritt nicht als Auftragsverarbeiter auf, weil Saklam keine personenbezogenen Daten empfängt — die Bridge läuft on-premise in eurer Infrastruktur. Wir liefern eine Site-License-Vereinbarung + technisches Whitepaper für eure Datenschutz-Dokumentation.
Support
| Kanal | Detail |
|---|---|
| support@saklam.com |
Setup-Hilfe: hands-on mit Stefan per Screen-Share, wenn ihr wollt — in 15–20 Min live.