Frontend — Next.js 15 / React 19
Interface FR/EN ; proxy même-origine vers l’API (le navigateur ne parle qu’au frontend).
RAGatm Open est une application web modulaire : une interface, une API, des workers, une base PostgreSQL avec pgvector, et une passerelle d’inférence qui est le seul chemin vers les modèles locaux.
Chaque réponse suit le même chemin, observable dans le code publié : import, extraction, découpage, embeddings, recherche hybride, reranking, génération, citations.
Trois dépôts, neuf services dans le profil Compact.
Interface FR/EN ; proxy même-origine vers l’API (le navigateur ne parle qu’au frontend).
API, authentification avec second facteur TOTP obligatoire, rôles par workspace (owner, admin, member, viewer), isolation par espace, ingestion, retrieval, chat SSE, journal d’audit.
Ingestion asynchrone, réindexation, maintenance, analyses ; planificateur beat pour les tâches périodiques.
Données, vecteurs 768 dimensions (index HNSW), recherche plein texte, identité des pipelines d’embeddings ; source de vérité des sauvegardes.
File de tâches, résultats, cache. Jamais une source de vérité.
Unique chemin d’inférence : génération, embeddings, reranking ; registre de modèles strict (digests), erreurs typées, sondes de santé non inférentielles, limites de concurrence.
Exécute localement le modèle de génération et le modèle d’embeddings ; joignable uniquement depuis la passerelle.
Sert le cross-encoder de reranking sur CPU, dans l’espace réseau de la passerelle.
Routeur HTTP devant une ou plusieurs passerelles ; aucune inférence ; absent du profil Compact.
Une machine, neuf services Docker Compose, cinq réseaux dont quatre internes.
| Service | Technologie | Rôle | Réseaux | Mémoire |
|---|---|---|---|---|
frontend | Next.js 15 / React 19 (node:22-alpine) | Interface web FR/EN ; proxy même-origine vers l’API ; seul port publié (127.0.0.1:18080). — 127.0.0.1:18080 | edge, app | 512m |
backend | Django 5.2 + DRF (python:3.12-slim) | API REST, authentification avec MFA TOTP obligatoire, espaces et droits, ingestion, recherche hybride, génération avec citations (SSE). | app, data, ai | 1536m |
worker | Celery 5.6 | Traitements asynchrones : ingestion, réindexation, maintenance, analyses ; concurrence 2. | data, ai | 2g |
beat | Celery beat | Planificateur des tâches périodiques. | data | 256m |
db | PostgreSQL 16 + pgvector | Données relationnelles, vecteurs 768 dimensions (HNSW), recherche plein texte ; source de vérité des sauvegardes. | data | 1g |
redis | Redis 7.2 | File Celery, résultats et cache ; pas une source de vérité. | data | 256m |
ai-gateway | AI Gateway Open — FastAPI (python:3.12-slim) | Unique chemin d’inférence : génération (agrégée ou en flux), embeddings, reranking, registre de modèles strict, erreurs typées. | ai, inference | 512m |
ollama | Ollama 0.30 | Exécution locale des modèles de génération et d’embeddings ; joignable uniquement par la passerelle. | inference | 5g |
reranker | Text Embeddings Inference (CPU) | Cross-encoder bge-reranker-v2-m3 partageant l’espace réseau de la passerelle (boucle locale). | inference (namespace de la passerelle) | 6g |
Le profil Compact appelle directement la passerelle. Le Pool est un composant séparé et facultatif qui relaie le même contrat d’API sans le modifier.
Mode Direct : RAGatm Open (backend et worker) envoie ses requêtes HTTP/JSON à AI Gateway Open, qui appelle Ollama et TEI. Aucun autre composant.
Mode Pool : RAGatm Open envoie les mêmes requêtes à AI Gateway Pool Open, qui les relaie octet pour octet vers une AI Gateway Open éligible (nœud 1 qualifié en parité ; nœuds 2 à n implémentés mais non qualifiés matériellement). Le Pool n’exécute aucun modèle.
Quand un composant manque, l’application le dit. Codes renvoyés par l’API RAGatm Open :
| HTTP | Code | Signification |
|---|---|---|
| 503 | ai_gateway_unavailable | La passerelle est injoignable : aucune réponse fabriquée. |
| 502 | ai_gateway_error | La passerelle a répondu une erreur. |
| 503 | dependency_unavailable | Une dépendance (base, cache, modèle) est indisponible. |
Le code publié vise d’abord une machine. Voici les limites documentées.
Un profil testé, deux architectures cibles proposées. Les statuts sont explicites.
Une machine, 9 services
modèles locaux sur CPU
8 threads · 14 Go RAM · sans GPU
Qualification fonctionnelle exécutée (RC2). Variantes GPU 8 Go et 12 Go décrites, non qualifiées.
Application et modèles séparés
même contrat gateway-api/1.0
ressources augmentées, GPU dédié possible
Architecture cible proposée par le projet, non décrite dans la documentation Open. Le stockage des originaux reste lié à un hôte (ADR-001).
Pool devant plusieurs passerelles
nœuds d’inférence répartis
capacité par nœud, disjoncteur
Politiques multi-nœuds implémentées et testées sur nœuds simulés ; multi-nœuds matériel non qualifié.
La passerelle expose 19 routes décrites par un contrat OpenAPI 3.1 (gateway-api/1.0.yaml, version 1.0.0-candidate.2). Le contrat est en statut candidat, non ratifié : il peut encore évoluer avant une version 1.0 finale. Chaque réponse porte un identifiant de requête (X-Request-ID) relayé de bout en bout.
gateway-api/1.0.yaml (lien externe) · Architecture du Pool (lien externe) · Architecture (dépôt) (lien externe)