Développeurs
· 10 min de lecture

Une API de caviardage qui tourne chez vous

Par Amine Gaaliche · brouillon rédigé avec Claude, relu et corrigé à la main

L'API auto-hébergée de promptShield exécute la détection et le caviardage sur votre propre infrastructure, et les documents restent dans votre périmètre. Une connexion sortante subsiste toutefois : une validation de licence toutes les six heures. Nous la décrivons ici, car l'ingénieur qui testera l'API la verra.

Qui détient le document au moment de la détection

Le débat sur le caviardage automatisé oppose souvent deux options. Le cloud est programmable et absorbe les volumes. Le poste de travail est sûr, mais manuel. Ce découpage mélange deux questions : comment appeler le moteur, et où se trouve le document quand un algorithme le lit.

La seconde question est la plus importante : qui détient le document au moment de la détection ? L'article 226-13 du code pénal punit la révélation d'une information secrète par « celui qui en est dépositaire ». L'article 28 du RGPD encadre le sous-traitant par un contrat écrit, des instructions documentées et des garanties dont la CNIL peut demander la preuve.

Une API de caviardage dans le cloud doit d'abord recevoir le document pour le traiter. Son éditeur détient alors la pièce entière, y compris ce qu'il s'apprête à masquer.

Une API auto-hébergée reste programmable et se branche sur votre chaîne de traitement. Elle tourne simplement sur une machine que vous administrez. Au moment de la détection, c'est votre service informatique qui détient le document. Aucun tiers ne reçoit le contenu des pièces, et, pour ce contenu, la question de la sous-traitance ne se pose plus.

Ce qui sort du serveur, et à quel rythme

Une connexion sortante subsiste pourtant. Le serveur d'API revalide sa clé auprès de notre serveur de licences toutes les six heures. Si ce serveur ne répond pas, la dernière validation, gardée en cache, prend le relais pendant trois jours au plus. Ensuite, le service cesse de répondre jusqu'à une nouvelle validation.

Ces deux valeurs viennent du code source. Elles ont déjà changé, et nous mettrons ce texte à jour si elles changent encore.

Les deux chiffres vont ensemble. Pris seul, l'intervalle laisse croire que cet appel est anodin. La durée du cache dit à l'acheteur qui exige un fonctionnement sans connexion que cette API ne lui convient pas.

L'API n'a pas de mode réseau isolé, et aucun réglage n'en crée un. L'application de bureau en a un, sans appel de licence ni rapport d'incident, dans l'offre Pro. Il repose sur un mécanisme distinct et ne s'étend pas au serveur.

Cet appel valide une licence. Il ne transporte ni document, ni extrait de page, ni valeur détectée. Une capture réseau permet de le vérifier.

Nous l'avons longtemps mal expliqué. Une version précédente de cette page affirmait que l'API ne nous contactait jamais en fonctionnement. Elle donnait aussi une commande d'installation jamais publiée et promettait une documentation interactive qu'aucun déploiement ne peut ouvrir. Un lecteur qui découvre un appel non annoncé ne croit plus le reste, même ce qui est exact.

La mention « 100 % hors ligne » ne vaut que pour l'application de bureau. L'application gratuite dans le navigateur envoie un signal anonyme à son lancement, et l'API revalide sa licence. Dans les trois cas, le document reste sur la machine qui le traite.

Le moteur, une fois chez vous

La détection procède par couches. Des motifs repèrent les valeurs de forme reconnaissable : NIR, IBAN, adresses électroniques, numéros de téléphone. Un modèle de reconnaissance d'entités, spaCy, BERT ou GLiNER selon le déploiement, repère les noms, les sociétés et les adresses. Une analyse par modèle de langage est possible, facultative et désactivée par défaut.

Les résultats sont fusionnés, dédoublonnés et filtrés. Ils sont propagés d'une page à l'autre : un nom repéré en page 1 est balisé en page 4. Aucune couche ne repère tous les identifiants, et une relecture humaine reste prévue, même quand les appels viennent d'un script.

Un document numérisé n'a pas de texte, seulement des pixels. Le moteur convertit chaque page en image à 300 dpi et la fait lire par Tesseract, dans la langue du document et en anglais. Il repère les données comme des zones de l'image, couvre ces pixels et reconstruit dessous une couche de texte.

Sept packs de langue sont livrés : anglais, français, allemand, espagnol, italien, néerlandais et portugais. Un scan lu avec le mauvais pack se lit mal, sans avertissement. Vérifiez donc la langue d'un lot avant de le soumettre.

Caviarder retire le contenu au lieu de poser un rectangle noir sur un texte resté lisible. L'export traite aussi ce que la page ne montre pas : textes de substitution d'un PDF balisé, métadonnées XMP, données privées d'application, destinations nommées, champs de formulaire et leur rendu. Ces emplacements reçoivent le code de la valeur encodée, ou un marqueur neutre si elle a été caviardée. Une vignette calculée avant le caviardage est supprimée, car on ne peut pas rechercher du texte dans une image.

Les codes, d'un appel à l'autre

Encoder remplace une valeur par un code court et réversible. La correspondance est gardée dans le Registre de codes, sur la machine du moteur. Décoder restitue la valeur par un appel local, sans service distant.

Un code est propre à son dossier. Les documents d'un même dossier partagent leurs codes, et deux dossiers ne partagent rien. Un document envoyé seul a ses propres codes. Soumettez deux fichiers en deux appels séparés, et la même personne recevra deux codes différents.

Seul un code épinglé à la main vaut pour toute la Bibliothèque. Nous avons nous-mêmes publié l'affirmation inverse, en sept langues. Regroupez donc les pièces d'une même affaire dans un même dossier avant de les soumettre. Sinon, le modèle d'IA qui recevra les pièces verra autant de personnes que d'appels.

Installer et interroger le serveur

Le paquet n'est pas publié sur PyPI à ce jour. Installez-le depuis une copie du dépôt source, dans le répertoire du paquet Python, avec pip install -e .. Lancez ensuite promptshield serve, qui refuse de démarrer sans clé d'API dans la variable PROMPTSHIELD_API_KEY.

Chaque requête doit porter la clé dans l'en-tête Authorization: Bearer. Seule la route /health répond sans elle, pour qu'un orchestrateur puisse sonder le service.

La documentation interactive que FastAPI expose d'ordinaire sous /docs renvoie une erreur 401. Un navigateur n'ajoute pas d'en-tête d'autorisation à une navigation, et le serveur ne démarre pas sans clé. Pour lire le schéma, interrogez-le avec curl en passant l'en-tête.

L'autre versant du sujet, la façon dont les bibliothèques de détection courantes partent d'un texte brut, est traitée dans notre article sur les outils de caviardage conçus pour les développeurs.

Pourquoi le dire

Nous avons intérêt à ce que vous préfériez notre serveur à une API dans le cloud. Taire l'appel de licence rendrait la promesse plus simple. Mais l'ingénieur qui remplit le questionnaire de sécurité des fournisseurs le relèvera. Il vaut mieux qu'il le lise ici, avec sa fréquence, son objet et sa limite de trois jours.

Au moment où le moteur lit un NIR dans une pièce, cette pièce se trouve sur votre machine et sur aucune autre. C'est la phrase que nous aimerions voir dans votre dossier de conformité.

Questions fréquentes

L'API envoie-t-elle mes documents quelque part ?

Pas dans la configuration par défaut. La seule connexion sortante est la validation de licence, toutes les six heures, sans contenu de document. Si vous activez l'analyse par modèle de langage vers un service distant, le texte des pages part vers ce service. Elle est désactivée par défaut.

Peut-elle fonctionner sans connexion réseau ?

Pas durablement. Sans notre serveur de licences, elle s'appuie sur sa dernière validation pendant trois jours au plus, puis s'arrête. Si votre environnement interdit toute connexion sortante, évaluez plutôt l'application de bureau, qui a un mode isolé dans l'offre Pro.

Comment l'installer ?

Avec pip install -e . depuis le dépôt source, puis promptshield serve avec la clé dans PROMPTSHIELD_API_KEY. Vérifiez le démarrage sur /health.

Un même client garde-t-il son code d'un appel à l'autre ?

Seulement si les documents sont dans le même dossier. Pour une valeur qui doit rester identique dans toute la Bibliothèque, épinglez un code à la main.

Ça vous a été utile ? Dites-le-nous.

Partager