Fonctionnalités
Chaque fonctionnalité ci-dessous a été vérifiée dans le code publié de l’édition Open, avec son statut dans le profil Compact. Les fonctions optionnelles ou désactivées sont indiquées comme telles.
Périmètre : dépôts ragatm-open, ai-gateway-open et ai-gateway-pool-open, branche main, vérifiés le 11 novembre 2026. Les capacités de vision, d’OCR et d’audio sont détaillées sur la page IA multimodale. IA multimodale · Formats
Documents, recherche et réponses
Espaces, utilisateurs, ingestion, indexation, retrieval, génération et citations.
- Disponible par défaut 46
- Disponible avec configuration 7
- Non activé 1
- Non disponible 1
Disponible par défaut dans le profil Compact
- Workspaces et espaces documentaires (multi-organisation)
- Isolation stricte entre espaces
- Comptes utilisateurs : invitations, réinitialisation, aucune inscription publique
- Second facteur TOTP obligatoire
- Rôles et permissions par workspace
- Console d’administration de la plateforme et admin Django
- Interfaces d’administration du workspace et du cœur
- Corpus métier partagé
- Import de documents (formats par défaut)
- Ingestion asynchrone (Celery)
- Ré-import et déduplication
- Suppression de documents et purge d’un espace
- Réindexation (tâches durables)
- Métadonnées des documents et des fragments
- Extraction du texte natif
- Découpage en fragments
- Embeddings contrôlés via la passerelle (768 dimensions)
- Recherche vectorielle (pgvector)
- Recherche lexicale (PostgreSQL FTS)
- Fusion hybride (RRF)
- Diversification des candidats
- Reranking par cross-encoder via la passerelle
- Seuil de recherche et décision de réponse
- Génération via la passerelle
- Réponses en flux (SSE)
- Citations et format des sources
- Ancrage dans les sources et abstention
- Fils de conversation et mémoire
- Résumés de documents et de corpus
- Analyse globale d’un corpus (tâches)
- Réponses déterministes du chat (intercepteurs)
- Visualiseur de documents
- Retours utilisateurs et incidents
- Journaux d’audit et rétention
- Diagnostics
- Sauvegarde et restauration
- Interface bilingue (FR/EN)
- API REST v1 et contrat OpenAPI
- Limitation de débit
- En-têtes et cookies de sécurité
- Identifiant de requête (X-Request-ID)
- Erreurs explicites en cas de dépendance indisponible
- Quotas documentaires par workspace
- Écran « Capacités documentaires » et sondes de la passerelle
- Observabilité de la recherche et métriques d’exploitation
- Politique de sortie réseau (fermée par défaut)
Configurable, optionnel ou absent
- Portées par propriétaire et droits par espace Disponible avec configuration
- Reranking local intégré (historique) Non activé
- Politique de langue de réponse Disponible avec configuration
- Routeur d’actions Disponible avec configuration
- Requêtes tabulaires déterministes (DuckDB) Disponible avec configuration
- Configuration dynamique (surcouche du cœur) Disponible avec configuration
- Courriels .eml (sur activation) et .msg (retiré) Disponible avec configuration
- Connecteurs de messagerie Non disponible
- Reformulation de la requête par le modèle Disponible avec configuration
Voir le détail des 55 fonctionnalités, avec limites et preuves
| Fonctionnalité | Statut | Description et limites | Détails |
|---|---|---|---|
| Workspaces et espaces documentaires (multi-organisation) | Disponible par défaut | Un workspace (tenant) regroupe des membres et des RagSpaces ; chaque RagSpace porte ses documents, chunks et sa configuration LLM/embeddings. Suppression logique d’un espace (deleted_at) ; purge définitive sur DELETE. | Détails
|
| Isolation stricte entre espaces | Disponible par défaut | Le rag_space est dupliqué sur chaque Chunk et filtré par double clause SQL ; accès re-vérifié avant tout appel Core ; anti-énumération (404). Le cloisonnement par propriétaire à l’intérieur d’un workspace est optionnel (voir « portées de propriétaire »). | Détails
|
| Comptes utilisateurs : invitations, réinitialisation, aucune inscription publique | Disponible par défaut | Comptes créés par invitation (lien à usage unique, hash SHA-256) ou par bootstrap admin ; réinitialisation de mot de passe anti-énumération ; aucune inscription publique. L’envoi de courriels exige une configuration SMTP ; par défaut, les messages sont écrits dans la console. | Détails
|
| Second facteur TOTP obligatoire | Disponible par défaut | Second facteur TOTP (django-otp) obligatoire pour tout compte, non désactivable ; verrouillage django-axes, anti-rejeu, jetons de secours, admin Django protégé par OTP. TOTP et jetons de secours statiques uniquement ; ni WebAuthn ni SMS. | Détails
|
| Rôles et permissions par workspace | Disponible par défaut | Rôles owner/admin/member/viewer ; viewer en lecture seule ; owner/admin gèrent membres, RagSpaces, réglages LLM et audit ; superuser orthogonal (corpus métier, config). Le dernier propriétaire ne peut pas être retiré ; un administrateur ne peut pas retirer un propriétaire. | Détails
|
| Console d’administration de la plateforme et admin Django | Disponible par défaut | Gouvernance cross-workspace (/api/v1/platform/*, écran /platform-admin) : utilisateurs, workspaces, owners, diagnostics ; aucun accès au contenu ; admin Django sous OTP. Le superutilisateur n’a aucun accès implicite aux contenus. | Détails
|
| Interfaces d’administration du workspace et du cœur | Disponible par défaut | Écrans /workspace-admin (membres, RagSpaces, invitations), /admin-core (config Core, capacités documentaires), /ragatm-admin (corpus métier). Les sondes de la passerelle depuis la console sont désactivées par défaut. | Détails
|
| Corpus métier partagé | Disponible par défaut | Couche documentaire partagée entre workspaces (tables domain_corpus_*), administrée par le superuser, ingestion synchrone, retrieval bi-source avec étanchéité conservée. Le corpus partagé ne participe pas par défaut aux réponses (admission calibrée). | Détails
|
| Import de documents (formats par défaut) | Disponible par défaut | Dépôt via /api/v1/documents/upload/ avec détection par contenu ; formats actifs par défaut : PDF, DOCX, PPTX, XLSX, CSV, TXT, MD, HTML, images JPEG/PNG/TIFF/WEBP ; limite 50 Mo ; dédup sha256. Les images sont acceptées à l’import mais échouent à l’extraction dans Compact (pas d’OCR). Limite d’envoi : 50 Mo dans Compact (25 Mo par défaut ailleurs dans la documentation). | Détails
|
| Ingestion asynchrone (Celery) | Disponible par défaut | Ingestion via worker Celery/Redis ; Compact force RAG_INGEST_ASYNC_DEFAULT=1 ; OCR/Excel/PPTX/DXF/IFC forcent l’async ; broker indisponible → 503 dependency_unavailable. Un seul worker, concurrence 2 dans Compact. | Détails
|
| Ré-import et déduplication | Disponible par défaut | Déduplication par (rag_space, sha256) hors FAILED ; un doublon ne crée ni fichier ni tâche ; le même fichier peut être importé dans un autre espace. Aucune limite particulière relevée. | Détails
|
| Suppression de documents et purge d’un espace | Disponible par défaut | Suppression dure et immédiate d’un document (409 si ingestion en cours) ; DELETE d’un RagSpace = purge irréversible (documents, chunks, vecteurs, fils) en conservant ActionAuditEvent. Pas de corbeille. | Détails
|
| Réindexation (tâches durables) | Disponible par défaut | Jobs de réindexation par RagSpace sur la file reindex, reprise des documents en erreur, stratégies auto / force_ocr / extended_timeout ; aucune réindexation implicite lors d’un changement de modèle. Changer de modèle d’embeddings impose une réindexation explicite. | Détails
|
| Métadonnées des documents et des fragments | Disponible par défaut | Document : filename, content_type (sniffé), size, sha256, document_date, status, meta JSON, embedding_provider/model, reindex_required… ; Chunk : chunk_index, page_number, pipeline_id/family, meta (locators par format). Le champ « confidentialité » du document est inerte (lu par aucun code). | Détails
|
| Extraction du texte natif | Disponible par défaut | pypdf (+pdfminer/pdfplumber fallbacks), DOCX via stdlib, python-pptx, openpyxl, csv/html stdlib ; PDF scanné sans OCR → échec explicite pdf_scanned_requires_ocr. DOCX : en-têtes, pieds de page, notes, commentaires et zones de texte non extraits ; moteur PyMuPDF absent (AGPL). | Détails
|
| Découpage en fragments | Disponible par défaut | Découpage déterministe par page : 2500 car./recouvrement 250 ; espaces gouvernés (Gateway) : budget min(2500, plafond modèle) → 1200/180 avec Granite ; stratégies dédiées Excel (40 lignes) et PPTX (1 slide = 1 unité). La limite de 1 200 caractères du modèle d’embeddings borne la taille des fragments. | Détails
|
| Embeddings contrôlés via la passerelle (768 dimensions) | Disponible par défaut | Provider unique ai_gateway ; modèle logique fr-en-retrieval (granite-embedding:278m, 768 dims) ; identité (pipeline_id, digest, identity_verified) vérifiée ; checks E101/E102 ; refus d’indexer/interroger avec un pipeline différent. Profil granite qualifié « expérimental » ; l’ancien profil 768 (nomic) n’est pas installé dans Compact. | Détails
|
| Recherche vectorielle (pgvector) | Disponible par défaut | Leg vectoriel pgvector (cosine) filtré par rag_space et pipeline_family, soumis au seuil RAG_MIN_SCORE. Seuil de similarité hérité d’un autre modèle : il peut vider la branche vectorielle avec granite (voir seuil de retrieval). | Détails
|
| Recherche lexicale (PostgreSQL FTS) | Disponible par défaut | FTS to_tsvector/ts_rank, config simple par défaut, plan de requêtes de la plus sélective à la plus large ; vecteur lexical stocké activable par flag (off). Le chemin « vecteur stocké » exige une migration et RAG_FTS_CONFIG=french. | Détails
|
| Fusion hybride (RRF) | Disponible par défaut | merge_hybrid fusionne FTS et vectoriel par Reciprocal Rank Fusion (K=60) avec renfort lexical conditionnel sur identifiants forts ; RAG_HYBRID_ENABLED=1 par défaut. Aucune limite particulière relevée. | Détails
|
| Diversification des candidats | Disponible par défaut | Pool candidate_k ×3, max 2 par groupe (document), avant décision ; activé par défaut. Aucune limite particulière relevée. | Détails
|
| Reranking par cross-encoder via la passerelle | Disponible par défaut | Reranking des passages via POST /v1/rerank (TEI bge-reranker-v2-m3 derrière la Gateway) ; OFF dans le code, ON en Compact (pool 20, timeout 20 s) ; en échec, repli compté sur l’ordre RRF canonique (fail_open_rrf). Repli = ordre RRF hybride (pas un reranking lexical) ; latence CPU ≈ 1,5 s par paire ; deux réglages de reranking mutuellement exclusifs. | Détails
|
| Seuil de recherche et décision de réponse | Disponible par défaut | should_answer : min_sources, seuil lexical, seuil vectoriel RAG_MIN_SCORE (défaut code 0.76, calibré nomic) ; refus dur seulement si aucun chunk, sinon mode partial/low_confidence. Divergence documentaire sur la valeur par défaut (0,20 vs 0,76) ; 0,76 non calibré pour granite. | Détails
|
| Génération via la passerelle | Disponible par défaut | Toute génération passe par POST /v1/generate de la Gateway (modèle logique compact-generation-8 = qwen2.5:1.5b-instruct en Compact) ; modèle par RagSpace ; chemin Ollama direct réservé aux tests. Le modèle de 1,5 B démontre le chemin, pas la qualité des réponses ; modèles non enregistrés ou non installés refusés. | Détails
|
| Réponses en flux (SSE) | Disponible par défaut | Le chat /chat/stream/ émet du SSE (meta → sources → token(s) → done, + error) ; avec AI_GATEWAY_STREAMING_ENABLED=1 (Compact) les fragments viennent de /v1/generate/stream (NDJSON) ; à 0, pseudo-stream en un bloc. Certaines pages de documentation disent encore « pas de vrai streaming » : dérive documentaire, la configuration Compact active le flux natif. | Détails
|
| Citations et format des sources | Disponible par défaut | Sources v1 (rank, document_id, chunk_id, score, filename, page_number, snippet ≤200) ; contrat de réponse distinguant sources retrouvées / transmises / réellement citées ; ligne « Sources: » seulement pour les citations réelles. La justesse des citations dépend du respect des marqueurs [n] par le modèle. | Détails
|
| Ancrage dans les sources et abstention | Disponible par défaut | Garde-fous de citation en tête de prompt ; no_answer sans LLM si aucune source ; Mode B « hors documents » désactivé ; détection d’abstention FR/EN ; aucune réponse fabriquée en cas de panne (erreurs typées). Mesure d’« answerability » par cross-encoder présente mais non promue ; relance anti-abstention évaluée, non implémentée. | Détails
|
| Fils de conversation et mémoire | Disponible par défaut | ChatThread/ChatMessage persistés, privés à leur auteur ; mémoire hiérarchique (fenêtre 12 messages, résumé au-delà de 18) injectée dans le prompt seulement ; recherche de fils bornée (3 s). Le résumé de mémoire utilise le modèle global, pas celui de l’espace (limite connue). | Détails
|
| Résumés de documents et de corpus | Disponible par défaut | Résumé court synchrone / long en Celery map-reduce, persisté comme ChatMessage ; résumé de documents de corpus métier activé par défaut (non qualifié). Résumés de corpus non qualifiés. | Détails
|
| Analyse globale d’un corpus (tâches) | Disponible par défaut | CorpusAnalysisJob asynchrone (file analytics) avec cycle de vie, progression, annulation ; accès RagSpace re-vérifié à chaque opération. Aucune limite particulière relevée. | Détails
|
| Réponses déterministes du chat (intercepteurs) | Disponible par défaut | Aide produit statique, garde analytique Excel (refus déterministe), listing documentaire : court-circuitent le RAG sans LLM. Aucune limite particulière relevée. | Détails
|
| Visualiseur de documents | Disponible par défaut | Prévisualisation routée par preview_kind : pdf (iframe #page=N), spreadsheet, document (DOCX), presentation (PPTX), text, unsupported ; toujours actif. CSV volontairement non pris en charge par le visualiseur. | Détails
|
| Retours utilisateurs et incidents | Disponible par défaut | Pouce vers le bas → incident diagnosticable (lot 1 actif) ; export/import d’incidents et pseudonymisation par flags (off). Aucune limite particulière relevée. | Détails
|
| Journaux d’audit et rétention | Disponible par défaut | RagQueryLog (90 j), ActionAuditEvent (365 j), LlmEgressAuditEvent / EgressPolicyChangeLog (365 j, plancher protégé par system check), LlmSettingsChangeLog ; purge périodique. Le journal des requêtes RAG stocke question et réponse en clair (données conversationnelles). | Détails
|
| Diagnostics | Disponible par défaut | manage.py check (checks llm_router.*, config.*, rag_core.*), diagnose.sh (non inférentiel), retrieval-diagnostic.sh, contract_check.py, resilience_check.py, offline-check.sh, e2e_qualification.py. Les sondes inférentielles de la passerelle ne sont jamais appelées automatiquement. | Détails
|
| Sauvegarde et restauration | Disponible par défaut | backup.sh (pg_dump custom, archive media, configs, manifeste modèles, SHA256SUMS) et restore.sh dans une instance isolée ; secrets, Redis et poids de modèles exclus. Les documents en cours d’ingestion au moment de la sauvegarde doivent être réindexés après restauration ; secrets à sauvegarder séparément. | Détails
|
| Interface bilingue (FR/EN) | Disponible par défaut | next-intl sans préfixe de route ; locales fr (défaut) et en ; cookie ragatm_locale + préférence de compte ; 21 namespaces symétriques testés. Généralisation aux écrans applicatifs en cours selon la documentation. | Détails
|
| API REST v1 et contrat OpenAPI | Disponible par défaut | ~128 routes DRF sous /api/v1/ (auth, bootstrap, capabilities, workspaces, invitations, rag-spaces, documents, chat, analyses, prompts, audit, core, admin, platform, tabular) ; contrat shared/contracts/openapi.yaml 1.0.0 ; auth cookie token + CSRF ou Authorization: Token. Contrat OpenAPI maintenu à la main, non vérifié automatiquement contre le code. | Détails
|
| Limitation de débit | Disponible par défaut | DRF UserRateThrottle/AnonRateThrottle en production : user 120/min, anon 30/min, auth 20/min, mfa 10/min, feedback 10/min, recherche de fils 60/min, invitations 20/10 par min. Compartiment anonyme partagé par tous les clients derrière le proxy Next (limite connue). | Détails
|
| En-têtes et cookies de sécurité | Disponible par défaut | prod.py : HSTS 1 an + subdomains + preload, nosniff, X-Frame-Options SAMEORIGIN, Referrer-Policy same-origin, cookies Secure/HttpOnly/SameSite=Strict ; TLS attendu au reverse-proxy. Pas de TLS dans la pile Compact ; aucune Content-Security-Policy dans les réglages examinés. | Détails
|
| Identifiant de requête (X-Request-ID) | Disponible par défaut | Middleware : relaie un X-Request-ID conforme ([A-Za-z0-9._:-]{1,128}) sinon génère un UUID4 ; propagé à la Gateway (génération, embeddings, rerank) et aux flux SSE ; présent dans toutes les réponses. Aucune limite particulière relevée. | Détails
|
| Erreurs explicites en cas de dépendance indisponible | Disponible par défaut | 503 ai_gateway_unavailable (+Retry-After, retryable) ; 502 ai_gateway_error (non retryable) ; 503 dependency_unavailable (redis|broker) ; même charge utile dans l’événement SSE error ; jamais de réponse fabriquée. Aucune limite particulière relevée. | Détails
|
| Quotas documentaires par workspace | Disponible par défaut | max_document_count et max_document_bytes copiés depuis les défauts plateforme ; usage agrégé à la demande ; enforcement activé par défaut. Pas de mode illimité. | Détails
|
| Écran « Capacités documentaires » et sondes de la passerelle | Disponible par défaut | Écran superuser en lecture seule exposant l’état réel de chaque capacité (ACTIVE/DISABLED/UNAVAILABLE/UNKNOWN) ; sondes /health/* de la Gateway fermées par défaut. États des services affichés « UNKNOWN » tant que les sondes sont désactivées. | Détails
|
| Observabilité de la recherche et métriques d’exploitation | Disponible par défaut | Trace structurée de chaque query_rag (dégradations observables), compteurs ops bornés (rag_reranker_*), route /ops/metrics hors /api/ avec jeton optionnel, /api/health/ non inférentiel. Aucune limite particulière relevée. | Détails
|
| Politique de sortie réseau (fermée par défaut) | Disponible par défaut | Tout appel LLM exige un LlmExecutionContext avec politique résolue ; tout provider non local refusé ; allow_external_fallback tracé mais sans provider externe existant. Granularité limitée à l’espace documentaire ; champ de confidentialité inerte. | Détails
|
| Portées par propriétaire et droits par espace | Disponible avec configuration | Cloisonnement de plusieurs owners dans un même workspace et ACL par RagSpace ; implémenté de bout en bout mais désactivé par défaut. Non activé dans Compact ; le transfert de portée depuis la console plateforme est en prévisualisation. | Détails
|
| Politique de langue de réponse | Disponible avec configuration | Préférence answer_language (auto/fr/en) pilotant la langue des réponses, distincte de la langue d’interface ; flag off dans le code. Désactivé par défaut dans le code Open ; Compact ne le règle pas. | Détails
|
| Routeur d’actions | Disponible avec configuration | Détection d’actions par le chat (apps.actions) ; mutations jamais déclenchables par phrase ; désactivé par défaut. Aucune limite particulière relevée. | Détails
|
| Requêtes tabulaires déterministes (DuckDB) | Disponible avec configuration | Moteur DuckDB calculant sur le fichier source xlsx/csv (jamais le LLM, jamais les chunks) ; schéma fermé, bornes de lignes/colonnes/temps ; désactivé par défaut et en Compact. Planificateur et narration par LLM non branchés. | Détails
|
| Configuration dynamique (surcouche du cœur) | Disponible avec configuration | Overrides de configuration stockés en base, inertes par défaut ; édition et prise en compte runtime sous flags stricts (off). Aucune limite particulière relevée. | Détails
|
| Courriels .eml (sur activation) et .msg (retiré) | Disponible avec configuration | Ingestion .eml avec pièces jointes, activable par flag et bornée par espace (off) ; .msg Outlook non pris en charge dans l’édition Open (parseur GPL écarté, code msg_unsupported_in_open_edition). Pièces jointes : pas de vision ni d’extraction structurée ; IFC/DWG non pris en charge. | Détails
|
| Reformulation de la requête par le modèle | Disponible avec configuration | Réécriture/keywordisation de requête en mode explicatif ; réécriture LLM désactivée par mesure A/B (gain nul, P95 doublé). Aucune limite particulière relevée. | Détails
|
| Reranking local intégré (historique) | Non activé | Rerank historique chargeant un modèle dans le processus (extra rerank/torch) ; off ; jamais verrouillé pour l’image Compact. Exclusif avec le reranking via la passerelle. | Détails
|
| Connecteurs de messagerie édition privée uniquement | Non disponible | Aucun connecteur de messagerie dans l’édition Open (mention explicite dans le code). Aucune limite particulière relevée. | Détails
|
Passerelle de modèles (AI Gateway Open)
Le seul chemin vers les modèles : génération, embeddings, reranking, registre, limites, erreurs.
- Disponible par défaut 14
- Disponible avec configuration 1
- Non activé 1
- Non disponible 1
- Non qualifié 3
Disponible par défaut dans le profil Compact
- Génération POST /v1/generate
- Flux POST /v1/generate/stream (NDJSON)
- Embeddings POST /v1/embeddings
- Reranking POST /v1/rerank (TEI)
- Registre de modèles strict
- Points de santé (health)
- Délais d’expiration
- Concurrence et saturation
- Limites de taille des requêtes
- Format et codes d’erreur
- Sécurité réseau de la passerelle
- Aucun fournisseur externe (par construction)
- Identifiant de requête côté passerelle
- Image de la passerelle durcie
Configurable, optionnel ou absent
- Contrat gateway-api/1.0 (candidat) Non qualifié
- Chat POST /v1/chat et /v1/chat/stream Non activé
- Profils Compact CPU / GPU 12 Go Disponible avec configuration
- Sortie structurée (JSON Schema) Non qualifié
- Composants exclus de l’édition Open Non disponible
- Matériel : CPU qualifié, GPU non qualifié Non qualifié
Voir le détail des 20 fonctionnalités, avec limites et preuves
| Fonctionnalité | Statut | Description et limites | Détails |
|---|---|---|---|
| Génération POST /v1/generate | Disponible par défaut | prompt, model (logique), temperature, system, options{num_ctx,num_predict}, think, keep_alive, format/response_format ; extra=forbid ; réponse text/tokens/usage/done_reason ; bornes num_ctx ≤16384, num_predict ≤4096 (400). Profil 7 B jamais exécuté dans Open. | Détails
|
| Flux POST /v1/generate/stream (NDJSON) | Disponible par défaut | Événements delta / done (exactement un) / error en application/x-ndjson — pas du SSE ; fermeture client → fermeture upstream ; structured output non streamé. Aucun événement de maintien de connexion. | Détails
|
| Embeddings POST /v1/embeddings | Disponible par défaut | Champ texts (≤64), model, task query|document ; réponse 768 dims, pipeline_id emb-v2:…, model_digest, identity_verified, normalized ; overflow >1200 car. → reject ; dimension incompatible → 400. Repli /api/embeddings seulement si la route /api/embed est absente. | Détails
|
| Reranking POST /v1/rerank (TEI) | Disponible par défaut | query + documents (1..64, ≤2000/4000 car.) → scores bruts (calibrated:false) via TEI BAAI/bge-reranker-v2-m3 sur loopback obligatoire ; off dans Settings, on en .env.example et Compact ; timeout dédié (15 s défaut, 30 s Compact). Aucun repli lexical dans la passerelle ; latence CPU non mesurée dans le dépôt. | Détails
|
| Registre de modèles strict | Disponible par défaut | models_registry.yaml : noms logiques, digests, capabilities, profils de gouvernance ; inconnu → 400 model_not_registered ; enregistré non installé → 503 model_not_installed non réessayable ; jamais de téléchargement. Aucune limite particulière relevée. | Détails
|
| Points de santé (health) | Disponible par défaut | /health/live (non inférentiel), /health/runtime (capabilities, installed, limits, inflight), /health (inventaire) ; /health/ready, /health/embeddings, /health/rerank sont inférentiels (explicit_only) ; /health/asr, /health/vision → disabled. Pas de route /health/startup ; les sondes inférentielles ne doivent pas être câblées à des battements automatiques. | Détails
|
| Délais d’expiration | Disponible par défaut | AI_GATEWAY_TIMEOUT_SECONDS (60 défaut, 300 Compact) borne generate/stream/embed ; flux : timeout de lecture + budget mural → event error upstream_timeout ; rerank 15/30 s ; readiness 5/30 s. Aucune limite particulière relevée. | Détails
|
| Concurrence et saturation | Disponible par défaut | BoundedSemaphore non bloquant : generate/chat 2, embeddings 2, rerank 2, vision 1, ASR 1 → 503 *_saturated + Retry-After ; aucune file applicative, aucun retry vers Ollama/TEI ; Ollama NUM_PARALLEL=1. Charge au-delà d’une génération concurrente non vérifiée. | Détails
|
| Limites de taille des requêtes | Disponible par défaut | Content-Length > 2 Mio → 413 request_too_large ; POST chunked → 411 ; /v1/audio et /v1/vision exemptés. Aucune limite particulière relevée. | Détails
|
| Format et codes d’erreur | Disponible par défaut | {detail:{status,provider,message,code?,retryable?}} avec messages publics fixes ; table de codes au contrat (model_not_registered 400, model_not_installed 503, *_saturated 503, asr_unavailable 503, vision_not_enabled 503…) ; erreurs de validation → 400. Aucune limite particulière relevée. | Détails
|
| Sécurité réseau de la passerelle | Disponible par défaut | Aucune authentification, CORS, rate-limit ni en-têtes de sécurité dans le code ; confiance réseau : standalone publie 127.0.0.1:8100, Compact ne publie aucun port (réseaux internes ai + inference) ; backends rerank/ASR exigés en loopback. Ni authentification, ni TLS, ni quotas, ni journal d’audit (hors périmètre selon la documentation). | Détails
|
| Aucun fournisseur externe (par construction) | Disponible par défaut | Tests interdisant jetons/SDK de fournisseurs et appels de téléchargement dans app/ ; contrat external_providers: none ; OLLAMA_BASE_URL local. Aucune limite particulière relevée. | Détails
|
| Identifiant de requête côté passerelle | Disponible par défaut | Relayé si ^[A-Za-z0-9._:-]{1,128}$, sinon UUID v4 ; présent sur toutes les réponses y compris erreurs middleware. Aucune limite particulière relevée. | Détails
|
| Image de la passerelle durcie | Disponible par défaut | python:3.12-slim épinglé par digest, pip --require-hashes (986 hashes), utilisateur appuser, HEALTHCHECK /health/live, CI pip-audit/detect-secrets/SBOM (non bloquant lint). Avertissements de style (lint) non bloquants. | Détails
|
| Profils Compact CPU / GPU 12 Go | Disponible avec configuration | compact-generation-8 (qwen2.5:1.5b, experimental, digest relevé) = profil CPU qualifié fonctionnellement ; compact-generation (qwen2.5:7b, candidate, sans digest) = profil 12 Go NON qualifié, jamais exécuté dans Open. Budgets GPU estimés, non mesurés. | Détails
|
| Contrat gateway-api/1.0 (candidat) | Non qualifié | OpenAPI 3.1, version 1.0.0-candidate.2, statut CANDIDATE_FOR_RATIFICATION, 19 routes ; conformité fichier↔API testée ; SHA déclarée dans le CHANGELOG ≠ SHA du fichier commité. Non ratifié ; points ouverts : 503 vs 424, identifiant de requête dans le corps, authentification inter-services. | Détails
|
| Sortie structurée (JSON Schema) | Non qualifié | format json ou response_format json_schema avec sous-ensemble fermé de JSON Schema (pas de $ref/pattern/combinators ; 32 Kio, profondeur 16, 512 nœuds), revalidation Draft 2020-12 ; 502 output_invalid/mismatch. Non diffusable en flux. | Détails
|
| Matériel : CPU qualifié, GPU non qualifié | Non qualifié | Profil CPU qualifié ; GPU optionnel, budgets 8/12 Go = estimations non mesurées ; Ollama 0.30.8 et TEI cpu-1.8 épinglés par digest. Aucune limite particulière relevée. | Détails
|
| Chat POST /v1/chat et /v1/chat/stream | Non activé | Routes de chat gouverné (messages, reasoning, response_format) exigeant un modèle à capability chat + reasoning_profile ; aucun modèle Compact ne le déclare → 400 model_not_registered / chat_not_supported. RAGatm Open n’utilise que /v1/generate*. | Détails
|
| Composants exclus de l’édition Open édition privée uniquement | Non disponible | Modules de vision avancée, d’extraction structurée et de contrôle d’admission hôte : absents, drapeaux refusés au démarrage (ConfigurationError), états UNAVAILABLE dans /health/runtime. Aucune limite particulière relevée. | Détails
|
Déploiement et montée en charge
Mode Direct, Pool facultatif, files de tâches, limites de concurrence documentées.
- Disponible par défaut 5
- Module optionnel 3
- Non disponible 1
- Non qualifié 2
Disponible par défaut dans le profil Compact
- Mode Direct (backend → passerelle)
- Séparation des composants (9 services)
- Files de tâches Celery et worker
- Gestion de capacité et limites de concurrence
- Stockage documentaire mono-hôte
Configurable, optionnel ou absent
- AI Gateway Pool (routeur optionnel) Module optionnel
- Admission, disjoncteur et basculement (Pool) Module optionnel
- Affinité des tâches de transcription (Redis) Module optionnel
- Mise à l’échelle horizontale automatique Non disponible
- Limites de charge documentées Non qualifié
- Multi-nœuds / multi-GPU (Pool) Non qualifié
Voir le détail des 11 fonctionnalités, avec limites et preuves
| Fonctionnalité | Statut | Description et limites | Détails |
|---|---|---|---|
| Mode Direct (backend → passerelle) | Disponible par défaut | Les trois URL Gateway (génération, embeddings, rerank) pointent sur http://ai-gateway:8100 ; AI_GATEWAY_POOL_HOSTS vide ⇒ route direct ; profil nominal Compact. Aucune limite particulière relevée. | Détails
|
| Séparation des composants (9 services) | Disponible par défaut | Compact : db (pgvector), redis, backend (gunicorn 2×4), worker (Celery), beat, frontend (Next), ai-gateway, ollama, reranker (TEI) sur 5 réseaux dont 4 internes ; budgets mémoire par service. Un seul hôte ; aucun déploiement multi-machines vérifié. | Détails
|
| Files de tâches Celery et worker | Disponible par défaut | Files publiques celery, reindex, maintenance, analytics consommées par un worker (concurrence 2, max-tasks-per-child 50) ; files dédiées ingest_visual/audio/ifc/dwg définies mais sans consommateur dans Compact. Ingestion séquentielle à l’échelle d’un poste. | Détails
|
| Gestion de capacité et limites de concurrence | Disponible par défaut | Gateway 2 générations concurrentes (503 au-delà), Ollama NUM_PARALLEL=1 / 2 modèles chargés, worker concurrence 2, gunicorn 2 workers × 4 threads, timeout 600 s ; aucune file côté Gateway. Charge au-delà d’une génération concurrente non vérifiée. | Détails
|
| Stockage documentaire mono-hôte | Disponible par défaut | Les originaux sont écrits sur un volume local (media) : stockage lié à un hôte unique. Pas de stockage objet ni partagé. | Détails
|
| AI Gateway Pool (routeur optionnel) | Module optionnel | Routeur HTTP autonome relayant les 19 routes gateway-api/1.0 vers 1..N Gateways (SINGLE_NODE, WEIGHTED_ROUND_ROBIN, LEAST_INFLIGHT), registre de nœuds avec allowlist, gouvernance de modèle (pas de substitution, identité par digest) ; absent de Compact ; bascule tout-ou-rien (llm_router.E008). ASR/vision non qualifiés via le Pool ; RAG complet via le Pool non démontré dans les dépôts. | Détails
|
| Admission, disjoncteur et basculement (Pool) | Module optionnel | max_inflight par nœud → AT_CAPACITY (refus, pas de file) ; disjoncteur CLOSED/OPEN/HALF_OPEN sur pannes de transport ; suspension douce sur 503+Retry-After ; basculement seulement avant tout octet envoyé (connect errors) ; compteurs par processus. État local au processus, sans coordination distribuée ; ni file d’attente, ni priorités, ni limitation de débit. | Détails
|
| Affinité des tâches de transcription (Redis) | Module optionnel | Store d’affinité job→nœud (none/memory/sqlite/redis) pour les jobs ASR asynchrones ; Redis = seul usage de Redis par le Pool ; backend none en Compact (routes audio refusées). Aucune limite particulière relevée. | Détails
|
| Limites de charge documentées | Non qualifié | README : charge au-delà d’une génération concurrente non vérifiée ; Pool : débit en forte concurrence non remesuré ; ingestion séquentielle. Aucune limite particulière relevée. | Détails
|
| Multi-nœuds / multi-GPU (Pool) | Non qualifié | Configuration multi-nœuds préparée (exemple EXAMPLE_ONLY) ; MULTINODE_HARDWARE_QUALIFIED = NO ; LIVE_MULTI_GPU NOT_EXECUTED. Aucune limite particulière relevée. | Détails
|
| Mise à l’échelle horizontale automatique | Non disponible | Aucune fonction d’autoscaling ni de coordination multi-réplicas : Pool mono-processus, états par processus ; seule l’affinité ASR est partagée. Aucune limite particulière relevée. | Détails
|
Sécurité : fonctions et limites
Les mécanismes ci-dessous existent dans le code publié. Ils réduisent les risques ; ils ne les suppriment pas.
- Disponible par défaut 15
- Non activé 1
Disponible par défaut dans le profil Compact
- Aucun fournisseur d’IA externe
- Un seul port publié (127.0.0.1)
- Réseaux internes et exécution hors ligne
- Aucun secret versionné
- Conteneurs non-root
- Images épinglées par digest
- Dépendances verrouillées à empreintes
- Politique de sécurité et contact
- Licence Apache-2.0
- Licences tierces (LGPL/MPL ; GPL/AGPL optionnels)
- Pas de TLS ni d’authentification inter-services
- Contrôles de la chaîne d’approvisionnement en CI
- Cookies HttpOnly, CSRF et anti-énumération
- Validation défensive des fichiers
- Rétention d’audit avec durée minimale de sécurité
Configurable, optionnel ou absent
- Champ « confidentialité » inerte Non activé
Voir le détail des 16 fonctionnalités, avec limites et preuves
| Fonctionnalité | Statut | Description et limites | Détails |
|---|---|---|---|
| Aucun fournisseur d’IA externe | Disponible par défaut | System checks config.E009 / llm_router.E009 refusent toute variable OPENAI_*/ANTHROPIC_*… ; AI_GATEWAY_FALLBACK_PROVIDER=none seul admis ; politique d’egress fail-closed ; Gateway sans provider distant par construction. Aucune limite particulière relevée. | Détails
|
| Un seul port publié (127.0.0.1) | Disponible par défaut | Seul le frontend publie 127.0.0.1:${COMPACT_FRONTEND_PORT:-18080} ; backend, Gateway, Ollama, TEI, db, redis non publiés. L’exposition sur le réseau local exige un reverse proxy TLS. | Détails
|
| Réseaux internes et exécution hors ligne | Disponible par défaut | Réseaux app/data/ai/inference internal: true ; Ollama joignable uniquement par la Gateway ; approvisionnement des modèles en phase distincte (compose.provision.yml) ; HF_HUB_OFFLINE=1 ; aucun téléchargement en requête. L’hôte Docker lui-même peut atteindre les réseaux internes (documenté ; aucune règle de pare-feu livrée). | Détails
|
| Aucun secret versionné | Disponible par défaut | gen-secrets.sh crée .env (0600) avec secrets aléatoires et refuse les valeurs de démonstration ; .env ignoré par git ; manage.py check refuse les valeurs de démo ; aucun secret dans images/Dockerfile/.env.example. Aucune limite particulière relevée. | Détails
|
| Conteneurs non-root | Disponible par défaut | Backend uid 10001 (app), frontend utilisateur node (npm/yarn retirés), Gateway appuser, Pool uid 10001. Les images tierces (Ollama, TEI, Redis, pgvector) gardent leurs réglages amont. | Détails
|
| Images épinglées par digest | Disponible par défaut | python:3.12-slim, node:22-alpine, pgvector/pgvector:pg16, redis:7.2-alpine, ollama/ollama (0.30.8), TEI référencées par digest sha256. Le Dockerfile de qualification du Pool utilise un digest de base différent de son image de service. | Détails
|
| Dépendances verrouillées à empreintes | Disponible par défaut | backend/requirements.lock (uv, 1241 hashes, --require-hashes), Gateway requirements.txt (986 hashes), Pool requirements.lock (253 hashes), frontend package-lock.json ; CI vérifie cohérence des locks. La dérive des verrous par rapport à PyPI est consultative en CI. | Détails
|
| Politique de sécurité et contact | Disponible par défaut | SECURITY.md dans les 3 dépôts : contact@ragatm.com (canal privé), divulgation coordonnée ≤90 jours, seule main maintenue, pas de délai contractuel. Aucune limite particulière relevée. | Détails
|
| Licence Apache-2.0 | Disponible par défaut | LICENSE + NOTICE Apache-2.0 dans les trois dépôts (code original) ; THIRD_PARTY_NOTICES séparés. Deux pages de documentation Compact disent encore « licence à poser » (obsolète). | Détails
|
| Licences tierces (LGPL/MPL ; GPL/AGPL optionnels) | Disponible par défaut | psycopg LGPL-3.0, ifcopenshell LGPL (extra), certifi MPL-2.0, libvips LGPL (frontend node_modules), caniuse-lite CC-BY-4.0 ; LibreDWG GPL-3.0 et PyMuPDF AGPL-3.0 jamais inclus par défaut (garde automatisée) ; modèles Apache-2.0, aucun poids redistribué. Aucune limite particulière relevée. | Détails
|
| Pas de TLS ni d’authentification inter-services | Disponible par défaut | La pile Compact n’embarque pas de TLS et aucune authentification entre backend, Gateway, Pool, TEI, Ollama (confiance réseau). Placer un reverse proxy TLS pour tout accès hors boucle locale. | Détails
|
| Contrôles de la chaîne d’approvisionnement en CI | Disponible par défaut | Workflows : installation à empreintes vérifiées, cohérence des locks, pip-audit, npm audit (0 avis), detect-secrets, inventaire de licences, build d’images sans push ; lint non bloquant. L’en-tête du workflow de la passerelle dit encore « non exécutée » (obsolète). | Détails
|
| Cookies HttpOnly, CSRF et anti-énumération | Disponible par défaut | Jeton d’auth en cookie HttpOnly + CSRF double-submit, SameSite=Strict, challenge MFA en cookie dédié ; 404 pour ressources non lisibles ; messages identiques introuvable/refusé. Aucune limite particulière relevée. | Détails
|
| Validation défensive des fichiers | Disponible par défaut | Détection par contenu (jamais l’extension), refus des macros .docm/.xlsm/.pptm, OLE2 legacy, archives, vidéos, exécutables, XML avec DOCTYPE/ENTITY ; bornes anti zip-bomb (200 Mo décompressé, ratio 200). Aucune limite particulière relevée. | Détails
|
| Rétention d’audit avec durée minimale de sécurité | Disponible par défaut | Rétention par catégorie (90/365/365/30 j) ; security_audit ne peut descendre sous SECURITY_AUDIT_MIN_DAYS (check bloquant). Aucune limite particulière relevée. | Détails
|
| Champ « confidentialité » inerte | Non activé | Document.confidentiality existe (défaut internal) mais n’est lu par aucun code : ne constitue pas un contrôle. Ne doit pas être présenté comme une protection. | Détails
|
L’application en images
Captures réelles de l’édition Open (profil Compact, instance isolée, documents fictifs).














Captures réalisées sur une instance RAGatm Open isolée (édition Open, profil Compact sur CPU, reranker désactivé pour la capture), avec les documents fictifs publiés dans le dépôt et un compte de démonstration.
Statuts évalués pour le profil Compact publié.