Features
Every feature below was verified in the published code of the Open edition, with its status in the Compact profile. Optional or disabled functions are marked as such.
Scope: ragatm-open, ai-gateway-open and ai-gateway-pool-open repositories, main branch, verified on 11 November 2026. Vision, OCR and audio capabilities are detailed on the Multimodal AI page. Multimodal AI · Formats
Documents, retrieval and answers
Spaces, users, ingestion, indexing, retrieval, generation and citations.
- Enabled by default 46
- Configurable 7
- Disabled 1
- Unavailable 1
Enabled by default in the Compact profile
- Workspaces and document spaces (multi-tenant)
- Strict isolation between document spaces
- User accounts: invitations, password reset, no public sign-up
- Mandatory TOTP second factor
- Roles and permissions per workspace
- Platform admin console and Django admin
- Workspace and core administration screens
- Shared business corpus
- Document import (default formats)
- Asynchronous ingestion (Celery)
- Re-import and deduplication
- Document deletion and space purge
- Reindexing (durable jobs)
- Document and chunk metadata
- Native text extraction
- Chunking
- Governed embeddings via the gateway (768 dimensions)
- Vector search (pgvector)
- Lexical search (PostgreSQL FTS)
- Hybrid fusion (RRF)
- Candidate diversification
- Cross-encoder reranking via the gateway
- Retrieval threshold and answer decision
- Generation via the gateway
- Streamed answers (SSE)
- Citations and source format
- Grounding in sources and abstention
- Conversation threads and memory
- Document and corpus summaries
- Global corpus analysis (jobs)
- Deterministic chat responses (interceptors)
- Document viewer
- User feedback and incidents
- Audit logs and retention
- Diagnostics
- Backup and restore
- Bilingual interface (FR/EN)
- REST API v1 and OpenAPI contract
- Rate limiting
- Security headers and cookies
- Request identifier (X-Request-ID)
- Explicit errors when a dependency is unavailable
- Document quotas per workspace
- “Document capabilities” screen and gateway probes
- Retrieval observability and operations metrics
- Egress policy (fail-closed)
Configurable, optional or absent
- Owner scopes and per-space access control Configurable
- Legacy in-process reranking Disabled
- Answer-language policy Configurable
- Action router Configurable
- Deterministic tabular queries (DuckDB) Configurable
- Dynamic configuration (core overlay) Configurable
- .eml e-mails (opt-in) and .msg (removed) Configurable
- Mailbox connectors Unavailable
- Query rewriting by the model Configurable
Show all 55 features, with limits and evidence
| Feature | Status | Description and limits | Details |
|---|---|---|---|
| Workspaces and document spaces (multi-tenant) | Enabled by default | A workspace (tenant) holds members and RagSpaces; each RagSpace owns its documents, chunks and LLM/embedding configuration. Soft deletion of a space (deleted_at); hard purge on DELETE. | Details
|
| Strict isolation between document spaces | Enabled by default | rag_space is duplicated on every Chunk and filtered by a double SQL clause; access re-checked before Core calls; anti-enumeration (404). Owner-level scoping inside a workspace is optional (see "owner scopes"). | Details
|
| User accounts: invitations, password reset, no public sign-up | Enabled by default | Accounts created by one-shot invitation links (SHA-256 hashed) or admin bootstrap; anti-enumeration password reset; no public sign-up. Sending e-mail requires an SMTP configuration; by default messages go to the console. | Details
|
| Mandatory TOTP second factor | Enabled by default | Mandatory TOTP second factor (django-otp) for every account, no opt-out flag; django-axes lockout, anti-replay, backup tokens, OTP-protected Django admin. TOTP and static backup tokens only; no WebAuthn or SMS. | Details
|
| Roles and permissions per workspace | Enabled by default | Roles owner/admin/member/viewer; viewer read-only; owner/admin manage members, RagSpaces, LLM settings and audit; superuser is orthogonal (shared corpus, config). The last owner cannot be removed; an admin cannot remove an owner. | Details
|
| Platform admin console and Django admin | Enabled by default | Cross-workspace governance (/api/v1/platform/*, /platform-admin screen): users, workspaces, owners, diagnostics; no content access; Django admin behind OTP. The superuser has no implicit access to content. | Details
|
| Workspace and core administration screens | Enabled by default | Screens /workspace-admin (members, RagSpaces, invitations), /admin-core (Core config, document capabilities), /ragatm-admin (shared corpus). Gateway probes from the console are off by default. | Details
|
| Shared business corpus | Enabled by default | Shared document layer across workspaces (domain_corpus_* tables), superuser-administered, synchronous ingestion, bi-source retrieval with isolation preserved. The shared corpus does not take part in answers by default (calibrated admission). | Details
|
| Document import (default formats) | Enabled by default | Upload via /api/v1/documents/upload/ with content sniffing; default formats PDF, DOCX, PPTX, XLSX, CSV, TXT, MD, HTML, JPEG/PNG/TIFF/WEBP images; 50 MB limit; sha256 dedup. Images are accepted at upload but fail extraction in Compact (no OCR). Upload limit: 50 MB in Compact (25 MB default elsewhere in the documentation). | Details
|
| Asynchronous ingestion (Celery) | Enabled by default | Ingestion through a Celery/Redis worker; Compact sets RAG_INGEST_ASYNC_DEFAULT=1; OCR/Excel/PPTX/DXF/IFC force async; broker down → 503 dependency_unavailable. Single worker, concurrency 2 in Compact. | Details
|
| Re-import and deduplication | Enabled by default | Dedup by (rag_space, sha256) excluding FAILED; a duplicate creates no file or task; the same file can be imported in another space. No particular limit noted. | Details
|
| Document deletion and space purge | Enabled by default | Hard immediate document deletion (409 while ingesting); RagSpace DELETE = irreversible purge (documents, chunks, vectors, threads) keeping ActionAuditEvent. No recycle bin. | Details
|
| Reindexing (durable jobs) | Enabled by default | Per-RagSpace reindex jobs on the reindex queue, retry of failed documents, strategies auto / force_ocr / extended_timeout; no implicit reindex on model change. Changing the embedding model requires an explicit reindex. | Details
|
| Document and chunk metadata | Enabled by default | Document: filename, sniffed content_type, size, sha256, document_date, status, JSON meta, embedding provider/model, reindex_required…; Chunk: chunk_index, page_number, pipeline_id/family, meta (per-format locators). The document "confidentiality" field is inert (read by no code). | Details
|
| Native text extraction | Enabled by default | pypdf (+pdfminer/pdfplumber fallbacks), DOCX via stdlib, python-pptx, openpyxl, csv/html stdlib; scanned PDF without OCR → explicit failure pdf_scanned_requires_ocr. DOCX: headers, footers, footnotes, comments and text boxes not extracted; PyMuPDF engine absent (AGPL). | Details
|
| Chunking | Enabled by default | Deterministic per-page chunking: 2500 chars / 250 overlap; governed spaces use min(2500, model cap) → 1200/180 with Granite; dedicated Excel (40 rows) and PPTX (one slide = one unit) strategies. The embedding model’s 1,200-character limit bounds chunk size. | Details
|
| Governed embeddings via the gateway (768 dimensions) | Enabled by default | Single provider ai_gateway; logical model fr-en-retrieval (granite-embedding:278m, 768 dims); identity (pipeline_id, digest, identity_verified) enforced; checks E101/E102; refuses to index/query with a different pipeline. granite profile qualified "experimental"; the legacy 768 profile is not installed in Compact. | Details
|
| Vector search (pgvector) | Enabled by default | pgvector cosine leg filtered by rag_space and pipeline_family, subject to the RAG_MIN_SCORE threshold. Similarity threshold inherited from another model: it may empty the vector leg with granite (see retrieval threshold). | Details
|
| Lexical search (PostgreSQL FTS) | Enabled by default | PostgreSQL FTS to_tsvector/ts_rank, config simple by default, query plan from most to least selective; stored tsvector column behind a flag (off). The stored-vector path requires a migration and RAG_FTS_CONFIG=french. | Details
|
| Hybrid fusion (RRF) | Enabled by default | merge_hybrid fuses FTS and vector legs by Reciprocal Rank Fusion (K=60) with conditional lexical boost on strong identifiers; RAG_HYBRID_ENABLED=1 by default. No particular limit noted. | Details
|
| Candidate diversification | Enabled by default | Candidate pool ×3, max 2 per group (document) before decision; on by default. No particular limit noted. | Details
|
| Cross-encoder reranking via the gateway | Enabled by default | Passage reranking via POST /v1/rerank (TEI bge-reranker-v2-m3 behind the Gateway); OFF in code defaults, ON in Compact (pool 20, timeout 20 s); on failure, counted fallback to the canonical RRF order (fail_open_rrf). Fallback = hybrid RRF order (not a lexical rerank); CPU latency ≈ 1.5 s per pair; two reranking settings mutually exclusive. | Details
|
| Retrieval threshold and answer decision | Enabled by default | should_answer: min_sources, lexical threshold, vector threshold RAG_MIN_SCORE (code default 0.76, calibrated for nomic); hard refusal only when zero chunks, else partial/low_confidence mode. Documentation drift on the default value (0.20 vs 0.76); 0.76 not calibrated for granite. | Details
|
| Generation via the gateway | Enabled by default | All generation goes through the Gateway's POST /v1/generate (logical model compact-generation-8 = qwen2.5:1.5b-instruct in Compact); per-RagSpace model; direct Ollama path reserved for tests. The 1.5 B model demonstrates the path, not answer quality; unregistered or uninstalled models refused. | Details
|
| Streamed answers (SSE) | Enabled by default | /chat/stream/ emits SSE (meta → sources → token(s) → done, + error); with AI_GATEWAY_STREAMING_ENABLED=1 (Compact) fragments come from /v1/generate/stream (NDJSON); at 0, single-block pseudo-stream. Some documentation pages still say "no real streaming": documentation drift, the Compact configuration enables native streaming. | Details
|
| Citations and source format | Enabled by default | Sources v1 schema (rank, document_id, chunk_id, score, filename, page_number, snippet ≤200); answer contract separating retrieved / prompted / actually cited sources; 'Sources:' line only for real citations. Citation correctness depends on the model honouring the [n] markers. | Details
|
| Grounding in sources and abstention | Enabled by default | Citation guards at prompt head; no_answer without any LLM call when no source; 'off-documents' Mode B disabled; FR/EN abstention detection; no fabricated answer on failure (typed errors). Cross-encoder answerability measured but not promoted; anti-over-abstention retry evaluated, not implemented. | Details
|
| Conversation threads and memory | Enabled by default | Persisted ChatThread/ChatMessage, private to their author; hierarchical memory (12-message window, summary beyond 18) injected only into the prompt; bounded thread search (3 s). The memory summary uses the global model, not the space model (known limit). | Details
|
| Document and corpus summaries | Enabled by default | Short synchronous / long Celery map-reduce summaries persisted as ChatMessage; shared-corpus document summaries on by default (not qualified). Corpus summaries not qualified. | Details
|
| Global corpus analysis (jobs) | Enabled by default | Asynchronous CorpusAnalysisJob (analytics queue) with lifecycle, progress, cancellation; RagSpace access re-checked on every operation. No particular limit noted. | Details
|
| Deterministic chat responses (interceptors) | Enabled by default | Static product help, Excel analytic guard (deterministic refusal), document listing: short-circuit RAG without any LLM call. No particular limit noted. | Details
|
| Document viewer | Enabled by default | Preview routed by preview_kind: pdf (iframe #page=N), spreadsheet, document (DOCX), presentation (PPTX), text, unsupported; always on. CSV deliberately unsupported by the viewer. | Details
|
| User feedback and incidents | Enabled by default | Thumbs-down → diagnosable incident (lot 1 on); incident export/import and pseudonymisation behind flags (off). No particular limit noted. | Details
|
| Audit logs and retention | Enabled by default | RagQueryLog (90 d), ActionAuditEvent (365 d), LlmEgressAuditEvent / EgressPolicyChangeLog (365 d with a check-enforced floor), LlmSettingsChangeLog; periodic purge. The RAG query log stores question and answer in clear text (conversational data). | Details
|
| Diagnostics | Enabled by default | manage.py check (llm_router.*, config.*, rag_core.* checks), diagnose.sh (non-inferential), retrieval-diagnostic.sh, contract_check.py, resilience_check.py, offline-check.sh, e2e_qualification.py. Inferential gateway probes are never called automatically. | Details
|
| Backup and restore | Enabled by default | backup.sh (custom pg_dump, media archive, configs, model manifest, SHA256SUMS) and restore.sh into an isolated instance; secrets, Redis and model weights excluded. Documents being ingested at backup time must be reindexed after restore; secrets must be backed up separately. | Details
|
| Bilingual interface (FR/EN) | Enabled by default | next-intl without route prefix; locales fr (default) and en; ragatm_locale cookie + account preference; 21 symmetric namespaces under test. Roll-out to application screens in progress per the documentation. | Details
|
| REST API v1 and OpenAPI contract | Enabled by default | ~128 DRF routes under /api/v1/ (auth, bootstrap, capabilities, workspaces, invitations, rag-spaces, documents, chat, analyses, prompts, audit, core, admin, platform, tabular); contract shared/contracts/openapi.yaml 1.0.0; cookie token + CSRF or Authorization: Token. Hand-maintained OpenAPI contract, not automatically checked against the code. | Details
|
| Rate limiting | Enabled by default | DRF User/Anon throttles in production: user 120/min, anon 30/min, auth 20/min, mfa 10/min, feedback 10/min, thread search 60/min, invitations 20/10 per min. Anonymous bucket shared by all clients behind the Next proxy (known limit). | Details
|
| Security headers and cookies | Enabled by default | prod.py: 1-year HSTS + subdomains + preload, nosniff, X-Frame-Options SAMEORIGIN, Referrer-Policy same-origin, Secure/HttpOnly/SameSite=Strict cookies; TLS expected at a reverse proxy. No TLS inside the Compact stack; no Content-Security-Policy in the settings reviewed. | Details
|
| Request identifier (X-Request-ID) | Enabled by default | Middleware relays a conformant X-Request-ID ([A-Za-z0-9._:-]{1,128}) or generates a UUID4; propagated to the Gateway (generation, embeddings, rerank) and SSE streams; present on all responses. No particular limit noted. | Details
|
| Explicit errors when a dependency is unavailable | Enabled by default | 503 ai_gateway_unavailable (+Retry-After, retryable); 502 ai_gateway_error (not retryable); 503 dependency_unavailable (redis|broker); same payload in the SSE error event; never a fabricated answer. No particular limit noted. | Details
|
| Document quotas per workspace | Enabled by default | max_document_count and max_document_bytes copied from platform defaults; usage aggregated on demand; enforcement on by default. No unlimited mode. | Details
|
| “Document capabilities” screen and gateway probes | Enabled by default | Read-only superuser screen exposing each capability's real state (ACTIVE/DISABLED/UNAVAILABLE/UNKNOWN); Gateway /health/* probes closed by default. Service states shown "UNKNOWN" until probes are enabled. | Details
|
| Retrieval observability and operations metrics | Enabled by default | Structured trace per query_rag (observable degradations), bounded ops counters (rag_reranker_*), /ops/metrics outside /api/ with optional token, non-inferential /api/health/. No particular limit noted. | Details
|
| Egress policy (fail-closed) | Enabled by default | Every LLM call needs an LlmExecutionContext with a resolved policy; any non-local provider is refused; allow_external_fallback is traced but no external provider exists. Granularity stops at the document space; inert confidentiality field. | Details
|
| Owner scopes and per-space access control | Configurable | Partitioning several owners inside one workspace plus per-RagSpace ACL; implemented end-to-end but off by default. Not enabled in Compact; scope transfer from the platform console is preview-only. | Details
|
| Answer-language policy | Configurable | answer_language preference (auto/fr/en) driving generated-answer language, distinct from UI locale; flag off in code. Off by default in the Open code; Compact does not set it. | Details
|
| Action router | Configurable | Chat action routing (apps.actions); mutations never triggered by phrasing; off by default. No particular limit noted. | Details
|
| Deterministic tabular queries (DuckDB) | Configurable | DuckDB engine computing on the source xlsx/csv file (never the LLM, never chunks); closed schema, row/column/time bounds; off by default and in Compact. LLM planner and narration not wired. | Details
|
| Dynamic configuration (core overlay) | Configurable | Database-stored configuration overrides, inert by default; editing and runtime effect behind strict flags (off). No particular limit noted. | Details
|
| .eml e-mails (opt-in) and .msg (removed) | Configurable | .eml ingestion with attachments behind a flag and per-space scope (off); Outlook .msg unsupported in the Open edition (GPL parser dropped, code msg_unsupported_in_open_edition). Attachments: no vision or structured extraction; IFC/DWG unsupported. | Details
|
| Query rewriting by the model | Configurable | Query rewrite/keywordisation in explanatory mode; LLM rewrite disabled after A/B measurement (no gain, doubled P95). No particular limit noted. | Details
|
| Legacy in-process reranking | Disabled | Legacy rerank loading a model in-process (rerank/torch extra); off; never locked for the Compact image. Exclusive with reranking through the gateway. | Details
|
| Mailbox connectors private edition only | Unavailable | No mailbox connector in the Open edition (explicit code comment). No particular limit noted. | Details
|
Model gateway (AI Gateway Open)
The only path to the models: generation, embeddings, reranking, registry, limits, errors.
- Enabled by default 14
- Configurable 1
- Disabled 1
- Unavailable 1
- Not yet qualified 3
Enabled by default in the Compact profile
- Generation POST /v1/generate
- Stream POST /v1/generate/stream (NDJSON)
- Embeddings POST /v1/embeddings
- Reranking POST /v1/rerank (TEI)
- Strict model registry
- Health endpoints
- Timeouts
- Concurrency and saturation
- Request size limits
- Error envelope and codes
- Gateway network security
- No external provider (by construction)
- Request identifier on the gateway side
- Hardened gateway image
Configurable, optional or absent
- gateway-api/1.0 contract (candidate) Not yet qualified
- Chat POST /v1/chat and /v1/chat/stream Disabled
- Compact CPU / 12 GB GPU profiles Configurable
- Structured output (JSON Schema) Not yet qualified
- Components excluded from the Open edition Unavailable
- Hardware: CPU qualified, GPU not qualified Not yet qualified
Show all 20 features, with limits and evidence
| Feature | Status | Description and limits | Details |
|---|---|---|---|
| Generation POST /v1/generate | Enabled by default | prompt, logical model, temperature, system, options{num_ctx,num_predict}, think, keep_alive, format/response_format; extra=forbid; response text/tokens/usage/done_reason; bounds num_ctx ≤16384, num_predict ≤4096 (400). 7 B profile never executed in Open. | Details
|
| Stream POST /v1/generate/stream (NDJSON) | Enabled by default | delta / done (exactly one) / error events as application/x-ndjson — not SSE; client close → upstream close; structured output not streamable. No heartbeat/keep-alive event. | Details
|
| Embeddings POST /v1/embeddings | Enabled by default | Field texts (≤64), model, task query|document; 768-dim response with pipeline_id emb-v2:…, model_digest, identity_verified, normalized; >1200 chars → reject; incompatible dimension → 400. /api/embeddings fallback only if the /api/embed route is absent. | Details
|
| Reranking POST /v1/rerank (TEI) | Enabled by default | query + documents (1..64, ≤2000/4000 chars) → raw scores (calibrated:false) via TEI BAAI/bge-reranker-v2-m3 on mandatory loopback; off in Settings, on in .env.example and Compact; dedicated timeout (15 s default, 30 s Compact). No lexical fallback inside the gateway; CPU latency not measured in the repository. | Details
|
| Strict model registry | Enabled by default | models_registry.yaml: logical names, digests, capabilities, governance profiles; unknown → 400 model_not_registered; registered-not-installed → 503 model_not_installed non-retryable; never downloads. No particular limit noted. | Details
|
| Health endpoints | Enabled by default | /health/live (non-inferential), /health/runtime (capabilities, installed, limits, inflight), /health (inventory); /health/ready, /health/embeddings, /health/rerank are inferential (explicit_only); /health/asr, /health/vision → disabled. No /health/startup route; inferential probes must not be wired to automatic heartbeats. | Details
|
| Timeouts | Enabled by default | AI_GATEWAY_TIMEOUT_SECONDS (60 default, 300 Compact) bounds generate/stream/embed; stream: read timeout + wall-clock budget → error upstream_timeout; rerank 15/30 s; readiness 5/30 s. No particular limit noted. | Details
|
| Concurrency and saturation | Enabled by default | Non-blocking BoundedSemaphore: generate/chat 2, embeddings 2, rerank 2, vision 1, ASR 1 → 503 *_saturated + Retry-After; no application queue, no retries toward Ollama/TEI; Ollama NUM_PARALLEL=1. Load beyond one concurrent generation not verified. | Details
|
| Request size limits | Enabled by default | Content-Length > 2 MiB → 413 request_too_large; chunked POST → 411; /v1/audio and /v1/vision exempt. No particular limit noted. | Details
|
| Error envelope and codes | Enabled by default | {detail:{status,provider,message,code?,retryable?}} with fixed public messages; contract code table (model_not_registered 400, model_not_installed 503, *_saturated 503, asr_unavailable 503, vision_not_enabled 503…); validation errors → 400. No particular limit noted. | Details
|
| Gateway network security | Enabled by default | No authentication, CORS, rate-limit or security headers in code; network trust: standalone publishes 127.0.0.1:8100, Compact publishes no port (internal networks ai + inference); rerank/ASR backends required on loopback. No auth, TLS, quotas or audit log (out of scope per the documentation). | Details
|
| No external provider (by construction) | Enabled by default | Tests forbid provider tokens/SDKs and download calls in app/; contract external_providers: none; local OLLAMA_BASE_URL. No particular limit noted. | Details
|
| Request identifier on the gateway side | Enabled by default | Relayed if ^[A-Za-z0-9._:-]{1,128}$, else UUID v4; present on all responses incl. middleware errors. No particular limit noted. | Details
|
| Hardened gateway image | Enabled by default | python:3.12-slim pinned by digest, pip --require-hashes (986 hashes), appuser, HEALTHCHECK /health/live, CI pip-audit/detect-secrets/SBOM (lint advisory). Non-blocking style (lint) warnings. | Details
|
| Compact CPU / 12 GB GPU profiles | Configurable | compact-generation-8 (qwen2.5:1.5b, experimental, digest recorded) = functionally qualified CPU profile; compact-generation (qwen2.5:7b, candidate, no digest) = 12 GB profile NOT qualified, never run in Open. GPU budgets are estimates, not measured. | Details
|
| gateway-api/1.0 contract (candidate) | Not yet qualified | OpenAPI 3.1, version 1.0.0-candidate.2, status CANDIDATE_FOR_RATIFICATION, 19 routes; file↔served-spec conformance tested; CHANGELOG SHA ≠ committed file SHA. Not ratified; open points: 503 vs 424, request id in body, inter-service auth. | Details
|
| Structured output (JSON Schema) | Not yet qualified | format json or response_format json_schema with a closed JSON-Schema subset (no $ref/pattern/combinators; 32 KiB, depth 16, 512 nodes), Draft 2020-12 revalidation; 502 output_invalid/mismatch. Not streamable. | Details
|
| Hardware: CPU qualified, GPU not qualified | Not yet qualified | CPU profile qualified; GPU optional, 8/12 GB budgets are unmeasured estimates; Ollama 0.30.8 and TEI cpu-1.8 pinned by digest. No particular limit noted. | Details
|
| Chat POST /v1/chat and /v1/chat/stream | Disabled | Governed chat routes (messages, reasoning, response_format) requiring a model with chat capability + reasoning_profile; no Compact model declares it → 400 model_not_registered / chat_not_supported. RAGatm Open only uses /v1/generate*. | Details
|
| Components excluded from the Open edition private edition only | Unavailable | Advanced vision, structured-extraction and host-admission modules: absent, flags refused at startup (ConfigurationError), UNAVAILABLE states in /health/runtime. No particular limit noted. | Details
|
Deployment and scaling
Direct mode, optional Pool, task queues, documented concurrency limits.
- Enabled by default 5
- Optional 3
- Unavailable 1
- Not yet qualified 2
Enabled by default in the Compact profile
- Direct mode (backend → gateway)
- Component separation (9 services)
- Celery task queues and worker
- Capacity management and concurrency limits
- Single-host document storage
Configurable, optional or absent
- AI Gateway Pool (optional router) Optional
- Admission control, circuit breaker and failover (Pool) Optional
- Transcription job affinity (Redis) Optional
- Automatic horizontal scaling Unavailable
- Documented load limits Not yet qualified
- Multi-node / multi-GPU (Pool) Not yet qualified
Show all 11 features, with limits and evidence
| Feature | Status | Description and limits | Details |
|---|---|---|---|
| Direct mode (backend → gateway) | Enabled by default | The three Gateway URLs (generation, embeddings, rerank) point to http://ai-gateway:8100; empty AI_GATEWAY_POOL_HOSTS ⇒ direct route; nominal Compact profile. No particular limit noted. | Details
|
| Component separation (9 services) | Enabled by default | Compact: db (pgvector), redis, backend (gunicorn 2×4), worker (Celery), beat, frontend (Next), ai-gateway, ollama, reranker (TEI) on 5 networks, 4 internal; per-service memory budgets. Single host; no multi-machine deployment verified. | Details
|
| Celery task queues and worker | Enabled by default | Public queues celery, reindex, maintenance, analytics consumed by one worker (concurrency 2, max-tasks-per-child 50); dedicated ingest_visual/audio/ifc/dwg queues defined but without consumer in Compact. Sequential ingestion at workstation scale. | Details
|
| Capacity management and concurrency limits | Enabled by default | Gateway 2 concurrent generations (503 beyond), Ollama NUM_PARALLEL=1 / 2 loaded models, worker concurrency 2, gunicorn 2 workers × 4 threads, 600 s timeout; no Gateway-side queue. Load beyond one concurrent generation not verified. | Details
|
| Single-host document storage | Enabled by default | Originals are written to a local volume (media): storage tied to a single host. No object or shared storage. | Details
|
| AI Gateway Pool (optional router) | Optional | Standalone HTTP router relaying the 19 gateway-api/1.0 routes to 1..N Gateways (SINGLE_NODE, WEIGHTED_ROUND_ROBIN, LEAST_INFLIGHT), node registry with allowlist, model governance (no substitution, digest identity); absent from Compact; all-or-nothing switch (llm_router.E008). ASR/vision not qualified through the Pool; full RAG through the Pool not demonstrated in the repositories. | Details
|
| Admission control, circuit breaker and failover (Pool) | Optional | Per-node max_inflight → AT_CAPACITY (refusal, no queue); CLOSED/OPEN/HALF_OPEN breaker on transport failures; soft suspension on 503+Retry-After; failover only before any byte is sent (connect errors); process-local counters. Process-local state, no distributed coordination; no queueing, priorities or rate limiting. | Details
|
| Transcription job affinity (Redis) | Optional | Job→node affinity store (none/memory/sqlite/redis) for asynchronous ASR jobs; the Pool's only Redis use; backend none in Compact (audio routes refused). No particular limit noted. | Details
|
| Documented load limits | Not yet qualified | README: load beyond one concurrent generation unverified; Pool: high-concurrency throughput not re-measured; sequential ingestion. No particular limit noted. | Details
|
| Multi-node / multi-GPU (Pool) | Not yet qualified | Multi-node configuration prepared (EXAMPLE_ONLY); MULTINODE_HARDWARE_QUALIFIED = NO; LIVE_MULTI_GPU NOT_EXECUTED. No particular limit noted. | Details
|
| Automatic horizontal scaling | Unavailable | No autoscaling or multi-replica coordination feature: single-process Pool, process-local state; only ASR affinity is shared. No particular limit noted. | Details
|
Security: functions and limits
The mechanisms below exist in the published code. They reduce risks; they do not remove them.
- Enabled by default 15
- Disabled 1
Enabled by default in the Compact profile
- No external AI provider
- Single published port (127.0.0.1)
- Internal networks and offline runtime
- No secret under version control
- Non-root containers
- Images pinned by digest
- Hash-locked dependencies
- Security policy and contact
- Apache-2.0 licence
- Third-party licences (LGPL/MPL; optional GPL/AGPL)
- No TLS or inter-service authentication
- Supply-chain checks in CI
- HttpOnly cookies, CSRF and anti-enumeration
- Defensive file validation
- Audit retention with a security minimum
Configurable, optional or absent
- Inert “confidentiality” field Disabled
Show all 16 features, with limits and evidence
| Feature | Status | Description and limits | Details |
|---|---|---|---|
| No external AI provider | Enabled by default | System checks config.E009 / llm_router.E009 refuse any OPENAI_*/ANTHROPIC_*… variable; AI_GATEWAY_FALLBACK_PROVIDER=none only; fail-closed egress policy; Gateway with no remote provider by construction. No particular limit noted. | Details
|
| Single published port (127.0.0.1) | Enabled by default | Only the frontend publishes 127.0.0.1:${COMPACT_FRONTEND_PORT:-18080}; backend, Gateway, Ollama, TEI, db, redis not published. LAN exposure requires a TLS reverse proxy. | Details
|
| Internal networks and offline runtime | Enabled by default | Networks app/data/ai/inference internal: true; Ollama reachable only by the Gateway; model provisioning as a distinct phase (compose.provision.yml); HF_HUB_OFFLINE=1; no download during requests. The Docker host itself can reach the internal networks (documented; no firewall rule shipped). | Details
|
| No secret under version control | Enabled by default | gen-secrets.sh creates .env (0600) with random secrets and refuses demo values; .env git-ignored; manage.py check refuses demo values; no secret in images/Dockerfile/.env.example. No particular limit noted. | Details
|
| Non-root containers | Enabled by default | Backend uid 10001 (app), frontend node user (npm/yarn removed), Gateway appuser, Pool uid 10001. Third-party images (Ollama, TEI, Redis, pgvector) keep their upstream defaults. | Details
|
| Images pinned by digest | Enabled by default | python:3.12-slim, node:22-alpine, pgvector/pgvector:pg16, redis:7.2-alpine, ollama/ollama (0.30.8), TEI referenced by sha256 digest. The Pool qualification Dockerfile uses a different base digest than its service image. | Details
|
| Hash-locked dependencies | Enabled by default | backend/requirements.lock (uv, 1241 hashes, --require-hashes), Gateway requirements.txt (986 hashes), Pool requirements.lock (253 hashes), frontend package-lock.json; CI checks lock consistency. Lock drift against PyPI is advisory in CI. | Details
|
| Security policy and contact | Enabled by default | SECURITY.md in all 3 repos: contact@ragatm.com (private channel), coordinated disclosure ≤90 days, only main maintained, no contractual SLA. No particular limit noted. | Details
|
| Apache-2.0 licence | Enabled by default | LICENSE + NOTICE Apache-2.0 in all three repos (original code); separate THIRD_PARTY_NOTICES. Two Compact documentation pages still say "licence to be set" (stale). | Details
|
| Third-party licences (LGPL/MPL; optional GPL/AGPL) | Enabled by default | 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 and PyMuPDF AGPL-3.0 never included by default (automated guard); Apache-2.0 models, no weights redistributed. No particular limit noted. | Details
|
| No TLS or inter-service authentication | Enabled by default | The Compact stack ships no TLS and no authentication between backend, Gateway, Pool, TEI, Ollama (network trust). Place a TLS reverse proxy for any non-loopback access. | Details
|
| Supply-chain checks in CI | Enabled by default | Workflows: hash-verified install, lock consistency, pip-audit, npm audit (0 advisories), detect-secrets, licence inventory, image build without push; lint advisory. The gateway workflow header still says "not executed" (stale). | Details
|
| HttpOnly cookies, CSRF and anti-enumeration | Enabled by default | Auth token in HttpOnly cookie + double-submit CSRF, SameSite=Strict, MFA challenge in dedicated cookie; 404 for unreadable resources; identical not-found/denied messages. No particular limit noted. | Details
|
| Defensive file validation | Enabled by default | Content sniffing (never extension), refusal of .docm/.xlsm/.pptm macros, legacy OLE2, archives, videos, executables, XML with DOCTYPE/ENTITY; anti zip-bomb bounds (200 MB uncompressed, ratio 200). No particular limit noted. | Details
|
| Audit retention with a security minimum | Enabled by default | Per-category retention (90/365/365/30 d); security_audit cannot go below SECURITY_AUDIT_MIN_DAYS (blocking check). No particular limit noted. | Details
|
| Inert “confidentiality” field | Disabled | Document.confidentiality exists (default internal) but no code reads it: not a control. Must not be presented as a protection. | Details
|
The application in pictures
Real screenshots of the Open edition (Compact profile, isolated instance, fictitious documents).














Screenshots taken on an isolated RAGatm Open instance (Open edition, Compact profile on CPU, reranker disabled for the capture), with the fictitious documents published in the repository and a demo account.
Statuses evaluated for the published Compact profile.