Aller au contenu

Architecture

Les quatre rôles de l'architecture de référence, les flux autorisés et interdits entre eux, et les modes de déploiement.

Lemniscate fournit l’environnement d’exécution confiné des agents de code, déployé dans votre périmètre. L’architecture de référence sépare quatre rôles : le poste du développeur, les services de la passerelle, l’exécution des agents et l’inférence. Lemniscate fournit les trois premiers et se raccorde à votre moteur d’inférence (livre blanc sécurité V3, section 3).

La passerelle est le seul composant qui parle à tous les autres. Elle tient les politiques, le journal et la révocation.

Votre périmètre, aucun flux sortant04 · Serveur d'inférence03 · Hôte d'exécution02 · Hôte des services de la passerelle01 · Poste du développeurTLScanal de contrôleTLS, filtrage réseauOIDC, export des journaux

Moteur et modèle

Extension Lemniscate

VS Code, JetBrains, terminal

gui et core

Passerelle

llm-gateway

Bac à sable par session

sans réseau, copie du dépôt

Annuaire et SIEM existants

Base

gateway-db

Console d'administration

gateway-admin

Chaque rôle occupe une machine, physique ou virtuelle, avec une surface d’exposition connue (livre blanc sécurité V3, section 3.1).

RôleCe qu’il porteCe qui le borne
Poste du développeurl’extension seule : VS Code, JetBrains ou terminalelle transmet la consigne, présente les différences et les demandes de validation, et ne connaît que l’adresse de la passerelle
Hôte des services de la passerellela passerelle, la base et la console d’administrationla passerelle est la seule interface exposée aux postes
Hôte d’exécutionun bac à sable par session, avec une copie de travail du dépôtdistinct de l’hôte de la passerelle, sans état entre deux sessions, un seul canal de contrôle entrant, ouvert par la passerelle
Serveur d’inférencele moteur d’inférence et le modèle à poids ouvertsjoint par la passerelle seule

Le périmètre de confiance du produit se réduit à deux composants : la passerelle et le bac à sable. Le modèle et l’agent en sont exclus. Ils sont traités comme des composants non fiables, et aucun droit ne repose sur leur comportement.

L’annuaire et le SIEM sont les vôtres. La passerelle s’y raccorde pour l’authentification (OpenID Connect) et pour l’export des journaux.

La matrice des flux tient sur huit lignes (livre blanc sécurité V3, section 3.3). Quatre flux sont autorisés, tous internes au périmètre. Quatre sont interdits par construction.

StatutFluxDétail
AutoriséPoste vers passerelleTLS ; seul flux du poste lié à Lemniscate
AutoriséPasserelle vers hôte d’exécutioncanal de contrôle unique, ouvert par la passerelle ; aucun flux dans l’autre sens
AutoriséPasserelle vers moteur d’inférenceTLS et filtrage réseau ; seul l’hôte de la passerelle est autorisé à joindre le moteur
AutoriséPasserelle vers annuaire et SIEMauthentification et export des journaux ; adresses fixées par vous
InterditBac à sable vers tout réseauaucune interface réseau, aucune résolution de noms
InterditPoste vers hôte d’exécution ou moteuraucune route ; l’extension ne connaît que l’adresse de la passerelle
InterditTout composant vers Internetaucun flux sortant du périmètre, aucune télémétrie
InterditHôte d’exécution vers tout composantl’hôte ne prend pas l’initiative d’une connexion

Les bacs à sable sont créés sans interface réseau, aucune route n’existe entre le poste et l’hôte d’exécution ou le moteur, aucun composant ne dispose d’une adresse externe, et l’hôte d’exécution n’est pas client d’un autre composant.

L’accès au moteur d’inférence est contrôlé au niveau réseau : le moteur n’écoute que sur le réseau interne du serveur d’inférence, et votre filtrage n’autorise que l’hôte de la passerelle. Vous pouvez vérifier la matrice avec vos propres sondes. Un flux observé hors de cette matrice se traite comme un incident. Le détail de ce qui circule sur chaque flux est dans Où passent les données.

Lemniscate se pose à côté de ce qui est en place (livre blanc sécurité V3, section 3.4). La passerelle se raccorde à tout moteur d’inférence qui expose une API compatible OpenAI, avec le modèle à poids ouverts que vous retenez. L’annuaire et le SIEM sont les vôtres.

Deux déploiements en découlent :

  • intégré à votre stack : vous gardez votre agent, votre proxy de modèles et votre moteur d’inférence, et Lemniscate ajoute l’exécution confinée, les politiques, le journal et la révocation ; voir Intégrer Lemniscate à votre stack ;
  • assistant de code complet : Lemniscate fournit aussi l’extension, l’agent, la passerelle d’accès aux modèles et la mise en place du serveur d’inférence ; voir Installer l’assistant complet.

Le même produit se déploie dans quatre modes (livre blanc sécurité V3, section 3.4).

ModeCe qui le caractérise
D01, connectéréseau interne classique ; mises à jour par votre registre privé
D02, isoléaucune connexion ; livraison et mises à jour par archive signée sur média, vérifiables hors ligne
D03, sensible ou Diffusion Restreintehôte d’exécution dédié ; rien n’est exécuté sur les postes, aucun moteur de conteneurs n’y est requis
D04, classifiéenclave dédiée ; pièces fournies en appui de votre homologation

L’homologation reste une décision de votre autorité. Les pièces que l’éditeur fournit à l’appui sont décrites dans Posture de conformité.

L’hôte d’exécution dédié est le mode de référence. Une variante exécute le bac à sable sur le poste, dans un conteneur sans privilège et sans réseau ; elle convient aux socles de poste qui admettent déjà un moteur de conteneurs. Les deux sont comparés dans Les garde-fous d’exécution.

La logique commune aux trois formes de l’extension vit dans core/ : le dialogue avec la passerelle pour les appels de modèles (core/llm), les outils que l’agent peut demander (core/tools), les fournisseurs de contexte (core/context), le chargement de la configuration (core/config) et le protocole de messages qui relie le tout (core/protocol).

Le code est lu par exploration du dépôt à la demande. Lemniscate ne construit aucun index du code source : il n’existe pas de copie dérivée et persistante du code à protéger (livre blanc sécurité V3, sections 3.2 et 11.3).

Les enveloppes ne réimplémentent aucune de ces fonctions. Ce qui change d’une enveloppe à l’autre est la façon dont core est hébergé :

EnveloppeHébergement de core
VS Codedans le processus de l’extension, par un messager en mémoire
JetBrainsdans un sous-processus séparé, dialogue en JSON sur l’entrée et la sortie standard
CLI lemnilié au programme à la construction

Côté VS Code, VsCodeExtension.ts instancie core derrière un InProcessMessenger : un appel de fonction, sans frontière de processus.

Côté JetBrains, le plugin est en Kotlin et ne peut pas charger du TypeScript. core est donc empaqueté séparément dans binary/, que CoreMessenger.kt lance comme sous-processus et à qui il envoie des messages JSON portant un messageId, un messageType et une charge utile. Les réponses reviennent par le même canal ; celles qui concernent l’interface sont réémises vers le navigateur embarqué. La variable d’environnement USE_TCP bascule ce canal sur une connexion TCP, pour le débogage.

Côté CLI, la construction d’extensions/cli résout core/ et packages/* par alias : le programme publié contient la logique et ne la charge pas depuis ailleurs.

gui/ est une application React : l’écran complet du produit dans l’IDE, avec la conversation, l’agent, l’historique et la page de réglages. Ce n’est pas une bibliothèque de composants.

Les deux extensions l’embarquent. L’empaquetage de l’extension VS Code construit gui/ et vérifie la présence du bundle avant de produire le VSIX ; le plugin JetBrains sert le même bundle depuis ses ressources, dans un navigateur embarqué JCEF.

L’interface sait dans quel IDE elle tourne parce que la page qui la charge l’écrit dans le stockage local, sous la clé ide : vscode d’un côté, jetbrains de l’autre. gui lit cette valeur pour adapter les raccourcis clavier et quelques écrans.

Le CLI n’utilise pas gui : son interface est celle du terminal.

Les trois services sont installés chez vous, sur un hôte distinct de l’hôte d’exécution et du serveur d’inférence (livre blanc sécurité V3, section 6). La passerelle est le point d’application de toutes les politiques ; la base et la console la servent.

Un serveur Hono. Le relais d’inférence est une route, ALL /:endpoint/* : le premier segment du chemin nomme un endpoint configuré en base ; le reste, chemin et chaîne de requête, est réémis vers l’URL de base du moteur d’inférence associé. D’autres routes sont posées avant ce relais, sous des préfixes réservés (/ide/ pour ce que le poste demande à la passerelle, la documentation hors ligne, l’exécution de commandes) ; un endpoint ne peut pas porter l’un de ces noms.

Avant de relayer, la passerelle enchaîne des contrôles dans un ordre fixe : vérification de l’identité de l’appelant, liste de révocation, résolution de l’endpoint, licence du déploiement, politique d’autorisation, droit de consommer, clé du moteur si celui-ci en déclare une, puis relais. Un endpoint inconnu est refusé sans que le droit de consommer soit consulté.

Elle n’impose aucun schéma au corps de la requête. Un corps qui se lit en JSON voit son champ model remplacé par celui de l’endpoint ; un corps qu’elle ne sait pas lire part inchangé. Une réponse en text/event-stream est relayée au fil de l’eau.

Une base PostgreSQL. Elle porte la configuration que la console écrit (moteurs d’inférence déclarés, modèles, endpoints publiés, politique), la liste de révocation, le journal des décisions d’autorisation, les actes d’agent déposés par les postes et request_logs, une ligne par requête relayée.

Elle ne porte pas la clé d’accès à un moteur d’inférence. Pour chaque moteur déclaré, elle enregistre le nom de la variable d’environnement qui porte la clé et l’en-tête HTTP dans lequel la poser. La clé elle-même n’existe que dans l’environnement du processus llm-gateway.

Une application React servie par son propre serveur, réservée aux administrateurs. Dans une installation chez un client, elle montre trois onglets : les endpoints (Endpoints), la politique (Policy) et les actes de l’agent (Audit). Voir Ouvrir la console d’administration. C’est par elle que passent la déclaration d’un moteur ou d’un modèle, la publication d’un endpoint et l’écriture de la politique.

La console écrit directement dans la base, avec sa propre chaîne de connexion. Elle ne passe pas par la passerelle, et la passerelle ne lui parle pas. Le couplage entre les deux services est la base.

La passerelle relit la base à chaque requête, sans cache : un changement fait dans la console prend effet sur la requête suivante, sans redémarrage.

  • La variante où le bac à sable s’exécute sur le poste. Le dessin montre le mode de référence, l’hôte d’exécution dédié.
  • Le cycle d’une session : authentification, politique du projet, ouverture du bac à sable, travail de l’agent, différence et validation. Il est décrit dans Le cycle d’une session agentique.
  • Ce que la passerelle fait d’un appel de modèle, contrôle par contrôle ; voir Le rôle de la passerelle.
  • Les fonctions héritées du projet dont Lemniscate est issu et qui n’aboutissent pas ; voir Ce qui n’existe pas.