Vous envoyez le document
PDF, DOCX, TXT, Markdown, HTML — peu importe. L'API accepte un upload multipart ou une URL signée. Le fichier est tenu en mémoire, jamais sur disque.
lexform reçoit votre PDF, extrait le texte en Markdown propre, remplace chaque entreprise, personne et email par des jetons neutres — puis vous rend une table de correspondance pour retrouver les vraies données après coup.
POST /v1/anonymizeCONTRAT DE PRESTATION Entre Acme Corporation, représentée par Jane Dubois (jane@acme.com), et Globex SA, il est convenu ce qui suit. Acme Corporation s'engage à fournir à Globex SA un ensemble de prestations pour un montant forfaitaire. Initech Ltd interviendra en tant que sous-traitant de Acme Corporation sur la partie infrastructure.
PDF, DOCX, TXT, Markdown, HTML — peu importe. L'API accepte un upload multipart ou une URL signée. Le fichier est tenu en mémoire, jamais sur disque.
Extraction du texte en Markdown, détection des entités (entreprises, personnes, emails, IBAN, numéros). Chacune reçoit un jeton neutre : COMPANY_1, PERSON_2…
Un Markdown propre et anonymisé, plus une table JSON qui associe chaque jeton à sa valeur d'origine. La table reste chez vous — on la renvoie, on ne la garde pas.
Envoyez le Markdown anonymisé à OpenAI, Anthropic, un modèle local — aucun risque de fuite. Au retour, faites un remap local avec la table et retrouvez les vrais noms.
Pas de compte, pas de clé, pas de credit card. Rate-limit généreux, SDK Node et Python, source ouverte.
curl -X POST https://lexform.zevra.tech/api/anonymize \ -F "file=@contrat.pdf" \ -F "kinds=COMPANY,PERSON,EMAIL,IBAN"
{
"markdown": "# CONTRAT DE PRESTATION\n\nEntre COMPANY_1, représentée par PERSON_1 (EMAIL_1), et COMPANY_2…",
"mapping": {
"COMPANY_1": "Acme Corporation",
"COMPANY_2": "Globex SA",
"COMPANY_3": "Initech Ltd",
"PERSON_1": "Jane Dubois",
"EMAIL_1": "jane@acme.com"
},
"stats": { "pages": 3, "entities": 5, "ms": 812 }
}100 % local. Le fichier est traité en RAM puis effacé. Aucun LLM, aucun envoi externe.
Copie ce prompt et colle-le dans Claude Code, Cursor ou n'importe quel agent IA codeur. Il génèrera le wrapper, modifiera tes appels LLM existants, et ajoutera la couche de désanonymisation au retour.
Intègre lexform dans ce projet pour anonymiser tout document
ou texte avant envoi à un LLM (OpenAI, Anthropic, Mistral, etc.).
API
POST https://lexform.zevra.tech/api/anonymize
Content-Type: multipart/form-data
Body: file=<binary> (PDF, DOCX, TXT, MD, max 30 Mo)
kinds=COMPANY,PERSON… (optionnel)
Réponse 200 OK :
{
"markdown": "<contenu anonymisé>",
"mapping": { "COMPANY_1": "Acme SAS", "PERSON_1": "Jean Dupont", ... },
"stats": { "entities": N, "uniqueEntities": N, "ms": N, "nerActive": true }
}
Tâches
1. Crée un module `lib/lexform.ts` (ou équivalent dans le langage du
projet) exposant deux fonctions :
anonymize(input: File | Buffer | string) → { markdown, mapping }
deanonymize(text: string, mapping: Record<string,string>) → string
2. Identifie chaque appel sortant vers un LLM dans la codebase.
Avant l'appel : remplace le payload utilisateur par sa version
anonymisée. Après la réponse : applique deanonymize() au texte
retourné par le LLM en utilisant la mapping table.
3. Ne persiste JAMAIS la mapping table en base ou dans les logs.
Garde-la en mémoire le temps de la requête, jette-la ensuite.
4. Adapte le style de code à celui du projet (TS strict / async /
gestion d'erreurs cohérente avec le reste).
Tests
- Smoke test sur un document avec entités connues, vérifier que la
réponse du LLM ré-injecte correctement les vraies valeurs après
deanonymize.
- Vérifier qu'aucune valeur originale n'apparaît dans les logs ni
dans les payloads sortants vers le LLM.Aucun document n'est écrit sur disque. Aucune mapping table n'est loggée. Aucun apprentissage n'est fait sur votre contenu. Quand la réponse part, toute trace disparaît.