# ranveerd/coursemate-ai architecture

> Architecture diagram of the GitHub repository ranveerd/coursemate-ai, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ranveerd/coursemate-ai
- Repository: https://github.com/ranveerd/coursemate-ai

## Overview

Book RAG Assistant accepts a PDF and a question through its Streamlit interface. The app loads and splits the PDF, stores embedded chunks in Chroma, retrieves relevant chunks for each question, builds a context-grounded prompt, and displays Gemini’s answer. The graph also includes the separate batch indexer documented by its source. The README describes the same principal stages; runtime wiring beyond the sampled files is not assumed.

Main entry points: [`app.py`](https://github.com/ranveerd/coursemate-ai/blob/main/app.py) (Streamlit App), [`create_database.py`](https://github.com/ranveerd/coursemate-ai/blob/main/create_database.py) (Batch Indexer), [`chroma-db`](https://github.com/ranveerd/coursemate-ai/tree/main/chroma-db) (Chroma Store), [`Document Loaders/deeplearning.pdf`](https://github.com/ranveerd/coursemate-ai/blob/main/Document%20Loaders/deeplearning.pdf) (Sample PDF)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["User Interface"]
  node_streamlit["Streamlit App<br/>[app.py]"]
  node_answer["Displayed Answer<br/>[app.py]"]
end

subgraph group_ingestion["Document Ingestion"]
  node_pdf_loader["PDF Loader<br/>[app.py]"]
  node_text_splitter["Text Splitter<br/>[app.py]"]
  node_embeddings["Local Embeddings<br/>[app.py]"]
  node_batch_indexer["Batch Indexer<br/>[create_database.py]"]
  node_sample_pdf["Sample PDF<br/>[deeplearning.pdf]"]
end

subgraph group_retrieval["Retrieval and Storage"]
  node_chroma[("Chroma Store")]
  node_retriever["MMR Retriever<br/>[app.py]"]
end

subgraph group_answering["Answer Generation"]
  node_prompt["Context Prompt<br/>[app.py]"]
end

node_user(("User"))
node_gemini{{"Google Gemini"}}

node_user -->|"uploads PDF"| node_streamlit
node_user -->|"asks question"| node_streamlit
node_streamlit -->|"loads PDF"| node_pdf_loader
node_streamlit -->|"splits pages"| node_text_splitter
node_streamlit -->|"creates vectors"| node_embeddings
node_streamlit -->|"stores chunks"| node_chroma
node_sample_pdf -->|"provides input"| node_batch_indexer
node_batch_indexer -->|"loads PDF"| node_pdf_loader
node_batch_indexer -->|"splits pages"| node_text_splitter
node_batch_indexer -->|"creates vectors"| node_embeddings
node_batch_indexer -->|"stores chunks"| node_chroma
node_streamlit -->|"creates retriever"| node_retriever
node_streamlit -->|"submits query"| node_retriever
node_retriever -->|"searches chunks"| node_chroma
node_retriever -->|"returns chunks"| node_streamlit
node_streamlit -->|"builds context"| node_prompt
node_streamlit -->|"sends prompt"| node_gemini
node_gemini -->|"returns response"| node_streamlit
node_streamlit -->|"renders answer"| node_answer
node_answer -->|"shows response"| node_user

click node_streamlit "https://github.com/ranveerd/coursemate-ai/blob/main/app.py"
click node_pdf_loader "https://github.com/ranveerd/coursemate-ai/blob/main/app.py"
click node_text_splitter "https://github.com/ranveerd/coursemate-ai/blob/main/app.py"
click node_embeddings "https://github.com/ranveerd/coursemate-ai/blob/main/app.py"
click node_batch_indexer "https://github.com/ranveerd/coursemate-ai/blob/main/create_database.py"
click node_sample_pdf "https://github.com/ranveerd/coursemate-ai/blob/main/Document%20Loaders/deeplearning.pdf"
click node_chroma "https://github.com/ranveerd/coursemate-ai/tree/main/chroma-db"
click node_retriever "https://github.com/ranveerd/coursemate-ai/blob/main/app.py"
click node_prompt "https://github.com/ranveerd/coursemate-ai/blob/main/app.py"
click node_answer "https://github.com/ranveerd/coursemate-ai/blob/main/app.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_streamlit,node_answer,node_user toneBlue
class node_pdf_loader,node_text_splitter,node_embeddings,node_batch_indexer,node_sample_pdf toneAmber
class node_chroma,node_retriever toneMint
class node_prompt toneRose
class node_gemini toneIndigo
```

## Components

### User Interface

- [Streamlit App](https://github.com/ranveerd/coursemate-ai/blob/main/app.py): `app.py`
- [Displayed Answer](https://github.com/ranveerd/coursemate-ai/blob/main/app.py): `app.py`

### Document Ingestion

- [PDF Loader](https://github.com/ranveerd/coursemate-ai/blob/main/app.py): `app.py`
- [Text Splitter](https://github.com/ranveerd/coursemate-ai/blob/main/app.py): `app.py`
- [Local Embeddings](https://github.com/ranveerd/coursemate-ai/blob/main/app.py): `app.py`
- [Batch Indexer](https://github.com/ranveerd/coursemate-ai/blob/main/create_database.py): `create_database.py`
- [Sample PDF](https://github.com/ranveerd/coursemate-ai/blob/main/Document%20Loaders/deeplearning.pdf): `Document Loaders/deeplearning.pdf`

### Retrieval and Storage

- [Chroma Store](https://github.com/ranveerd/coursemate-ai/tree/main/chroma-db): `chroma-db`
- [MMR Retriever](https://github.com/ranveerd/coursemate-ai/blob/main/app.py): `app.py`

### Answer Generation

- [Context Prompt](https://github.com/ranveerd/coursemate-ai/blob/main/app.py): `app.py`

### Other components

- **User**
- **Google Gemini**

## Connections

- User → Streamlit App: uploads PDF
- User → Streamlit App: asks question
- Streamlit App → PDF Loader: loads PDF
- Streamlit App → Text Splitter: splits pages
- Streamlit App → Local Embeddings: creates vectors
- Streamlit App → Chroma Store: stores chunks
- Sample PDF → Batch Indexer: provides input
- Batch Indexer → PDF Loader: loads PDF
- Batch Indexer → Text Splitter: splits pages
- Batch Indexer → Local Embeddings: creates vectors
- Batch Indexer → Chroma Store: stores chunks
- Streamlit App → MMR Retriever: creates retriever
- Streamlit App → MMR Retriever: submits query
- MMR Retriever → Chroma Store: searches chunks
- MMR Retriever → Streamlit App: returns chunks
- Streamlit App → Context Prompt: builds context
- Streamlit App → Google Gemini: sends prompt
- Google Gemini → Streamlit App: returns response
- Streamlit App → Displayed Answer: renders answer
- Displayed Answer → User: shows response
