# ankitkumarai/ragfusion-multimodel-private-rag--backend architecture

> Architecture diagram of the GitHub repository ankitkumarai/ragfusion-multimodel-private-rag--backend, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ankitkumarai/ragfusion-multimodel-private-rag--backend
- Repository: https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend

## Overview

This is a private, owner-scoped multimodal RAG application exposed through FastAPI and a CLI. Its main workflow accepts an authenticated user’s upload, stores the original and metadata, extracts and chunks supported content, embeds it into Qdrant, then retrieves authorized chunks for grounded answer generation. The README also documents authentication, conversation history, document lifecycle and recovery, profile photos, evaluation, and local or Supabase storage. Edges are limited to README statements and shown source references; unsampled subsystem wiring is left unasserted where it cannot be verified.

Main entry points: [`src/multimodal_private_rag/documents/service.py`](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/documents/service.py) (Document lifecycle), [`src/multimodal_private_rag/rag/ingestion.py`](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/rag/ingestion.py) (Ingestion orchestration), [`src/multimodal_private_rag/api/app.py`](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/api/app.py) (FastAPI), [`src/multimodal_private_rag/rag/service.py`](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/rag/service.py) (RAG service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["API and identity"]
  node_http["FastAPI<br/>[app.py]"]
  node_auth["Authentication<br/>[service.py]"]
  node_identity["User identity<br/>[models.py]"]
  node_chat["Chat routes<br/>[chat.py]"]
  node_conversation["Conversation history<br/>[service.py]"]
  node_doc_routes["Document routes<br/>[documents.py]"]
  node_photos["Profile photos<br/>[photos.py]"]
end

subgraph group_documents["Document lifecycle"]
  node_doc_service["Document lifecycle<br/>[service.py]"]
  node_ingest["Ingestion orchestration<br/>[ingestion.py]"]
  node_loaders["Format extraction"]
  node_chunker["Chunking<br/>[chunking.py]"]
end

subgraph group_rag["Retrieval and answers"]
  node_rag_service["RAG service<br/>[service.py]"]
  node_retriever["Candidate retrieval<br/>[retriever.py]"]
  node_reranker["Cross-encoder reranking<br/>[fastembed.py]"]
  node_context["Context selection<br/>[context.py]"]
  node_generation["Answer generation<br/>[gemini.py]"]
end

subgraph group_adapters["Persistence and providers"]
  node_embedding["Embeddings<br/>[fastembed.py]"]
  node_vectors[("Qdrant vectors<br/>[qdrant.py]")]
  node_metadata[("Document metadata<br/>[sqlite.py]")]
  node_originals["Original-file storage<br/>[base.py]"]
  node_supabase["Supabase Storage<br/>[supabase.py]"]
  node_postgres[("PostgreSQL<br/>[database.py]")]
end

subgraph group_operations["Operations and evaluation"]
  node_evaluation["RAG evaluation"]
  node_recovery["Lifecycle recovery<br/>[operations.py]"]
end

node_user(("User"))

node_user -->|"uses API"| node_http
node_http -->|"registers routes"| node_chat
node_http -->|"registers routes"| node_doc_routes
node_http -->|"registers routes"| node_auth
node_auth -->|"establishes identity"| node_identity
node_chat -.->|"requests answers"| node_rag_service
node_chat -.->|"uses history"| node_conversation
node_doc_routes -.->|"handles documents"| node_doc_service
node_doc_service -->|"stores originals"| node_originals
node_doc_service -.->|"persists metadata"| node_metadata
node_doc_service -->|"deletes vectors"| node_vectors
node_doc_service -->|"processes uploads"| node_ingest
node_ingest -->|"loads content"| node_loaders
node_ingest -->|"chunks content"| node_chunker
node_ingest -->|"embeds chunks"| node_embedding
node_ingest -->|"upserts vectors"| node_vectors
node_rag_service -->|"retrieves candidates"| node_retriever
node_retriever -->|"embeds query"| node_embedding
node_retriever -->|"searches vectors"| node_vectors
node_retriever -->|"reranks candidates"| node_reranker
node_rag_service -->|"selects context"| node_context
node_rag_service -->|"generates answer"| node_generation
node_originals -.->|"optional adapter"| node_supabase
node_doc_service -.->|"separate from RAG"| node_photos
node_user -.->|"runs evaluation"| node_evaluation
node_recovery -.->|"reconciles lifecycle"| node_metadata
node_recovery -.->|"reconciles integrity"| node_vectors
node_postgres -.->|"stores production metadata"| node_metadata

click node_http "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/api/app.py"
click node_auth "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/auth/service.py"
click node_identity "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/auth/models.py"
click node_chat "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/api/routers/chat.py"
click node_conversation "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/conversations/service.py"
click node_doc_routes "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/api/routers/documents.py"
click node_doc_service "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/documents/service.py"
click node_ingest "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/rag/ingestion.py"
click node_loaders "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/tree/main/src/multimodal_private_rag/ingestion"
click node_chunker "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/ingestion/chunking.py"
click node_rag_service "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/rag/service.py"
click node_retriever "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/retrieval/retriever.py"
click node_reranker "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/reranking/fastembed.py"
click node_context "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/rag/context.py"
click node_generation "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/generation/gemini.py"
click node_embedding "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/embeddings/fastembed.py"
click node_vectors "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/vectorstore/qdrant.py"
click node_metadata "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/documents/sqlite.py"
click node_originals "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/storage/base.py"
click node_supabase "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/storage/supabase.py"
click node_postgres "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/persistence/database.py"
click node_photos "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/auth/photos.py"
click node_evaluation "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/tree/main/src/multimodal_private_rag/evaluation"
click node_recovery "https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/operations.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_http,node_auth,node_identity,node_chat,node_conversation,node_doc_routes,node_photos,node_user toneBlue
class node_doc_service,node_ingest,node_loaders,node_chunker toneAmber
class node_rag_service,node_retriever,node_reranker,node_context,node_generation toneMint
class node_embedding,node_vectors,node_metadata,node_originals,node_supabase,node_postgres toneRose
class node_evaluation,node_recovery toneIndigo
```

## Components

### API and identity

- [FastAPI](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/api/app.py): `src/multimodal_private_rag/api/app.py`
- [Authentication](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/auth/service.py): `src/multimodal_private_rag/auth/service.py`
- [User identity](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/auth/models.py): `src/multimodal_private_rag/auth/models.py`
- [Chat routes](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/api/routers/chat.py): `src/multimodal_private_rag/api/routers/chat.py`
- [Conversation history](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/conversations/service.py): `src/multimodal_private_rag/conversations/service.py`
- [Document routes](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/api/routers/documents.py): `src/multimodal_private_rag/api/routers/documents.py`
- [Profile photos](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/auth/photos.py): `src/multimodal_private_rag/auth/photos.py`

### Document lifecycle

- [Document lifecycle](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/documents/service.py): `src/multimodal_private_rag/documents/service.py`
- [Ingestion orchestration](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/rag/ingestion.py): `src/multimodal_private_rag/rag/ingestion.py`
- [Format extraction](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/tree/main/src/multimodal_private_rag/ingestion): `src/multimodal_private_rag/ingestion`
- [Chunking](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/ingestion/chunking.py): `src/multimodal_private_rag/ingestion/chunking.py`

### Retrieval and answers

- [RAG service](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/rag/service.py): `src/multimodal_private_rag/rag/service.py`
- [Candidate retrieval](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/retrieval/retriever.py): `src/multimodal_private_rag/retrieval/retriever.py`
- [Cross-encoder reranking](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/reranking/fastembed.py): `src/multimodal_private_rag/reranking/fastembed.py`
- [Context selection](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/rag/context.py): `src/multimodal_private_rag/rag/context.py`
- [Answer generation](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/generation/gemini.py): `src/multimodal_private_rag/generation/gemini.py`

### Persistence and providers

- [Embeddings](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/embeddings/fastembed.py): `src/multimodal_private_rag/embeddings/fastembed.py`
- [Qdrant vectors](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/vectorstore/qdrant.py): `src/multimodal_private_rag/vectorstore/qdrant.py`
- [Document metadata](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/documents/sqlite.py): `src/multimodal_private_rag/documents/sqlite.py`
- [Original-file storage](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/storage/base.py): `src/multimodal_private_rag/storage/base.py`
- [Supabase Storage](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/storage/supabase.py): `src/multimodal_private_rag/storage/supabase.py`
- [PostgreSQL](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/persistence/database.py): `src/multimodal_private_rag/persistence/database.py`

### Operations and evaluation

- [RAG evaluation](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/tree/main/src/multimodal_private_rag/evaluation): `src/multimodal_private_rag/evaluation`
- [Lifecycle recovery](https://github.com/ankitkumarai/ragfusion-multimodel-private-rag--backend/blob/main/src/multimodal_private_rag/operations.py): `src/multimodal_private_rag/operations.py`

### Other components

- **User**

## Connections

- User → FastAPI: uses API (evidence: `README.md`)
- FastAPI → Chat routes: registers routes (evidence: `src/multimodal_private_rag/api/app.py`)
- FastAPI → Document routes: registers routes (evidence: `src/multimodal_private_rag/api/app.py`)
- FastAPI → Authentication: registers routes (evidence: `src/multimodal_private_rag/api/app.py`)
- Authentication → User identity: establishes identity (evidence: `src/multimodal_private_rag/api/routers/auth.py`)
- Chat routes → RAG service: requests answers
- Chat routes → Conversation history: uses history
- Document routes → Document lifecycle: handles documents
- Document lifecycle → Original-file storage: stores originals (evidence: `README.md`)
- Document lifecycle → Document metadata: persists metadata
- Document lifecycle → Qdrant vectors: deletes vectors (evidence: `src/multimodal_private_rag/documents/service.py`)
- Document lifecycle → Ingestion orchestration: processes uploads (evidence: `src/multimodal_private_rag/documents/service.py`)
- Ingestion orchestration → Format extraction: loads content (evidence: `src/multimodal_private_rag/rag/ingestion.py`)
- Ingestion orchestration → Chunking: chunks content (evidence: `src/multimodal_private_rag/rag/ingestion.py`)
- Ingestion orchestration → Embeddings: embeds chunks (evidence: `src/multimodal_private_rag/rag/ingestion.py`)
- Ingestion orchestration → Qdrant vectors: upserts vectors (evidence: `src/multimodal_private_rag/rag/ingestion.py`)
- RAG service → Candidate retrieval: retrieves candidates (evidence: `src/multimodal_private_rag/rag/service.py`)
- Candidate retrieval → Embeddings: embeds query (evidence: `src/multimodal_private_rag/retrieval/retriever.py`)
- Candidate retrieval → Qdrant vectors: searches vectors (evidence: `src/multimodal_private_rag/retrieval/retriever.py`)
- Candidate retrieval → Cross-encoder reranking: reranks candidates (evidence: `src/multimodal_private_rag/retrieval/retriever.py`)
- RAG service → Context selection: selects context (evidence: `src/multimodal_private_rag/rag/service.py`)
- RAG service → Answer generation: generates answer (evidence: `src/multimodal_private_rag/rag/service.py`)
- Original-file storage → Supabase Storage: optional adapter (evidence: `README.md`)
- Document lifecycle → Profile photos: separate from RAG (evidence: `README.md`)
- User → RAG evaluation: runs evaluation (evidence: `README.md`)
- Lifecycle recovery → Document metadata: reconciles lifecycle (evidence: `README.md`)
- Lifecycle recovery → Qdrant vectors: reconciles integrity (evidence: `README.md`)
- PostgreSQL → Document metadata: stores production metadata (evidence: `README.md`)
