text.anonymize.legal-de 0.1.0: WASM bridge to the judge-ner host service
Some checks failed
CI / Linux x86_64 (Forgejo) (push) Failing after 1m20s

NER anonymization of German legal texts (plain text + DOCX) via the
JuraNER model by Harshil Darji (MIT). The transformer model runs in
the judge-ner host service; this module forwards documents over
loopback HTTP and maps responses onto the capability contract.
This commit is contained in:
flemming-it 2026-07-10 12:44:32 +02:00
commit 3e018f528a
15 changed files with 1781 additions and 0 deletions

103
MODULE.de.md Normal file
View file

@ -0,0 +1,103 @@
# text.anonymize.legal-de
NER-basierte Anonymisierung deutscher juristischer Texte (JuraNER).
Brückenmodul: das Transformers-Modell läuft im **judge-ner
Host-Service** (`fai_judge/host_services/judge-ner/`); dieses
WASM-Modul reicht das Dokument per Loopback-HTTP weiter und bildet
die Antwort auf den Capability-Contract ab.
## Capability
- `text.anonymize.legal-de@0.1.0`
## Eingaben
| Name | Typ | Beschreibung |
| ---------- | ----- | ------------ |
| `request` | json | `{"mode":"text"\|"docx","options":{...}}` — siehe unten. |
| `document` | bytes | UTF-8-Klartext (mode=text) oder eine DOCX-Datei (mode=docx). |
| `endpoint` | text | Optionale judge-ner-Basis-URL. Default `http://127.0.0.1:8756`. |
### `request.options` (alle optional)
| Schlüssel | Default | Bedeutung |
| --------- | ------- | --------- |
| `importance_levels` | `["High"]` | Zu anonymisierende Entitätsklassen (`High`/`Mid`/`Low`). |
| `confidence_threshold` | `0.8` | Minimale NER-Konfidenz (0.01.0). |
| `manual_phrases` | `[]` | Zusätzlich zu schwärzende Phrasen (Label `RED`). |
| `maintain_consistency` | `true` | Gleiche Oberflächenform erhält überall dasselbe ⟦TYPE#⟧-Token. |
| `remove_rubrum` | `false` | Rubrum-Block erkennen und durch Platzhalter ersetzen. |
## Ausgaben
| Name | Typ | Beschreibung |
| ---------- | ----- | ------------ |
| `result` | json | `{"replacements": [...], "text": "..."}``text` (der anonymisierte Text) nur bei mode=text. `statistics` und `rubrum` werden vom Service durchgereicht, wenn vorhanden. |
| `document` | bytes | Das anonymisierte Dokument: UTF-8-Text (`text/plain`) bei mode=text, das umgeschriebene DOCX bei mode=docx. |
Jeder `replacements`-Eintrag:
`{text, label, label_description, start, end, score, line_number,
anonymized}`; im DOCX-Modus zusätzlich `run_id_start`,
`char_in_start`, `run_id_end`, `char_in_end` zur Adressierung der
exakten `w:t`-Knoten des Originaldokuments. Einträge mit
`"anonymized": null` wurden erkannt, aber nicht ersetzt
(Importance-Level nicht ausgewählt).
## Berechtigungen & benötigte Services
```yaml
permissions:
- "net: localhost"
- "net: 127.0.0.1"
requires_services:
- judge-ner
```
Der Hub führt Steps mit diesem Modul nur aus, wenn der Operator einen
`judge-ner`-Service-Endpunkt in `~/.chain/config.yaml` (`services:`)
deklariert hat. Beachte: Der erste judge-ner-Start lädt das
JuraNER-Modell von HuggingFace — bis dahin antwortet der Service mit
503 und dieses Modul schlägt mit einer klaren „NER model not
available"-Meldung fehl.
## Einrichtung des judge-ner-Host-Services
Das NER-Modell (JuraNER von Harshil Darji, MIT — transformers + torch)
kann nicht in der WASM-Sandbox laufen; es läuft als Host-Service.
```bash
# 1. Service starten (Docker; ~1 GB Modell-Download beim ersten Start,
# persistiert im Named Volume — spätere Starts sind offline-fähig)
docker run -d --name judge-ner \
-p 8756:8756 \
-v judge-ner-models:/models \
judge-ner
# 2. Beim Hub registrieren (~/.chain/config.yaml)
# services:
# judge-ner:
# endpoint: http://127.0.0.1:8756
# health_check:
# url: http://127.0.0.1:8756/health
# 3. Prüfen
curl -s localhost:8756/health # {"status":"ok","model_loaded":true}
chain service status judge-ner
```
Quellcode und Image-Build: `fai_judge/host_services/judge-ner/`
(`docker build -t judge-ner .`).
## Fehler
- Fehlerhafte `request`, Nicht-UTF-8-Textdokument oder 4xx vom
Service → `invalid input: ...`
- Service nicht erreichbar, 5xx, fehlerhafte Service-Antwort →
`internal error: judge-ner at <url> ...`
## Build
```bash
cargo test
cargo build --release --target wasm32-wasip2
```