# mihir-lakhani/mihir-portfolio architecture

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

- Interactive diagram: https://gitdiagram.com/mihir-lakhani/mihir-portfolio
- Repository: https://github.com/mihir-lakhani/mihir-portfolio

## Overview

This repository combines a personal portfolio site, interactive project demos, and a source-grounded portfolio-question assistant. The main visitor flow runs from the browser through Flask’s RAG routes and assistant service, which uses approved portfolio knowledge to retrieve evidence, generate an answer, and validate citations. Retrieval can use local hybrid search or Gemini File Search; Gemini and Ollama generation are optional integrations. The site also exposes cardiovascular-risk and mobility/handover demos. The README is empty and excerpts are partial, so some subsystem wiring is shown only where supported by the available evidence.

Main entry points: [`rag/service.py`](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/service.py) (Assistant service), [`rag/routes.py`](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/routes.py) (Assistant routes), [`app.py`](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/app.py) (Flask application), [`rag/generator.py`](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/generator.py) (Answer generation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Portfolio site"]
  node_portfolio["Portfolio pages<br/>[index.html]"]
  node_browser["Browser interactions<br/>[script.js]"]
  node_flask["Flask application<br/>[app.py]"]
end

subgraph group_assistant["Portfolio assistant"]
  node_rag_api["Assistant routes<br/>[routes.py]"]
  node_assistant_service["Assistant service<br/>[service.py]"]
  node_conversation["Conversation handling<br/>[conversation.py]"]
  node_session_memory["Session memory<br/>[session_memory.py]"]
  node_settings["RAG settings<br/>[config.py]"]
  node_generator["Answer generation<br/>[generator.py]"]
  node_gemini_generator["Gemini generator<br/>[gemini.py]"]
  node_ollama_generator["Ollama generator<br/>[ollama.py]"]
end

subgraph group_knowledge["Knowledge and retrieval"]
  node_sources["Source registry<br/>[sources.py]"]
  node_public_docs["Approved portfolio sources"]
  node_taxonomy["Query taxonomy"]
  node_query_hints["Query hints<br/>[query_hints.py]"]
  node_retriever["Retrieval selection<br/>[retriever.py]"]
  node_local_retriever["Hybrid retrieval<br/>[local_retriever.py]"]
  node_local_index[("Local search index<br/>[local_index.py]")]
  node_gemini_search["Gemini File Search<br/>[retriever.py]"]
end

subgraph group_demos["ML demonstrations"]
  node_cardio_demo["Cardiovascular demo<br/>[app.py]"]
  node_cardio_model[("Cardio model<br/>[cardio_model.pkl]")]
  node_mobility_demo["Mobility handover demo<br/>[mobility.py]"]
  node_mobility_model[("Mobility model")]
end

node_visitor(("Visitor"))
node_gemini_service{{"Google Gemini"}}
node_ollama_service{{"Ollama service"}}

node_visitor -->|"opens"| node_portfolio
node_portfolio -->|"loads interactions"| node_browser
node_browser -->|"submits questions"| node_rag_api
node_rag_api -->|"handles requests"| node_assistant_service
node_rag_api -->|"validates turns"| node_conversation
node_rag_api -->|"manages sessions"| node_session_memory
node_assistant_service -->|"uses settings"| node_settings
node_assistant_service -->|"checks sources"| node_sources
node_sources -->|"approves"| node_public_docs
node_assistant_service -->|"selects sources"| node_query_hints
node_query_hints -->|"reads concepts"| node_taxonomy
node_assistant_service -->|"requests evidence"| node_retriever
node_retriever -->|"selects local mode"| node_local_retriever
node_local_retriever -->|"searches"| node_local_index
node_retriever -->|"selects hosted mode"| node_gemini_search
node_assistant_service -->|"requests answer"| node_generator
node_generator -->|"selects provider"| node_gemini_generator
node_generator -.->|"selects provider"| node_ollama_generator
node_gemini_generator -.->|"generates with"| node_gemini_service
node_ollama_generator -.->|"generates with"| node_ollama_service
node_gemini_search -.->|"searches store"| node_gemini_service
node_flask -->|"registers routes"| node_rag_api
node_flask -->|"serves demo"| node_cardio_demo
node_cardio_demo -->|"loads model"| node_cardio_model
node_flask -->|"serves demo"| node_mobility_demo
node_mobility_demo -->|"loads model"| node_mobility_model

click node_portfolio "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/templates/index.html"
click node_browser "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/static/script.js"
click node_flask "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/app.py"
click node_rag_api "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/routes.py"
click node_assistant_service "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/service.py"
click node_conversation "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/conversation.py"
click node_session_memory "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/session_memory.py"
click node_settings "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/config.py"
click node_sources "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/sources.py"
click node_public_docs "https://github.com/mihir-lakhani/mihir-portfolio/tree/master/knowledge/public"
click node_taxonomy "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/knowledge/portfolio_taxonomy.json"
click node_query_hints "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/query_hints.py"
click node_retriever "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/retriever.py"
click node_local_retriever "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/local_retriever.py"
click node_local_index "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/local_index.py"
click node_gemini_search "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/retriever.py"
click node_generator "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/generator.py"
click node_gemini_generator "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/gemini.py"
click node_ollama_generator "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/ollama.py"
click node_cardio_demo "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/app.py"
click node_cardio_model "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/models/cardio_model.pkl"
click node_mobility_demo "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/backend/mobility.py"
click node_mobility_model "https://github.com/mihir-lakhani/mihir-portfolio/blob/master/models/mobility_model_final.pkl"

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_portfolio,node_browser,node_flask toneBlue
class node_rag_api,node_assistant_service,node_conversation,node_session_memory,node_settings,node_generator,node_gemini_generator,node_ollama_generator toneAmber
class node_sources,node_public_docs,node_taxonomy,node_query_hints,node_retriever,node_local_retriever,node_local_index,node_gemini_search toneMint
class node_cardio_demo,node_cardio_model,node_mobility_demo,node_mobility_model toneRose
class node_visitor,node_gemini_service,node_ollama_service toneIndigo
```

## Components

### Portfolio site

- [Portfolio pages](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/templates/index.html): `templates/index.html`
- [Browser interactions](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/static/script.js): `static/script.js`
- [Flask application](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/app.py): `app.py`

### Portfolio assistant

- [Assistant routes](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/routes.py): `rag/routes.py`
- [Assistant service](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/service.py): `rag/service.py`
- [Conversation handling](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/conversation.py): `rag/conversation.py`
- [Session memory](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/session_memory.py): `rag/session_memory.py`
- [RAG settings](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/config.py): `rag/config.py`
- [Answer generation](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/generator.py): `rag/generator.py`
- [Gemini generator](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/gemini.py): `rag/gemini.py`
- [Ollama generator](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/ollama.py): `rag/ollama.py`

### Knowledge and retrieval

- [Source registry](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/sources.py): `rag/sources.py`
- [Approved portfolio sources](https://github.com/mihir-lakhani/mihir-portfolio/tree/master/knowledge/public): `knowledge/public`
- [Query taxonomy](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/knowledge/portfolio_taxonomy.json): `knowledge/portfolio_taxonomy.json`
- [Query hints](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/query_hints.py): `rag/query_hints.py`
- [Retrieval selection](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/retriever.py): `rag/retriever.py`
- [Hybrid retrieval](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/local_retriever.py): `rag/local_retriever.py`
- [Local search index](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/local_index.py): `rag/local_index.py`
- [Gemini File Search](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/rag/retriever.py): `rag/retriever.py`

### ML demonstrations

- [Cardiovascular demo](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/app.py): `app.py`
- [Cardio model](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/models/cardio_model.pkl): `models/cardio_model.pkl`
- [Mobility handover demo](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/backend/mobility.py): `backend/mobility.py`
- [Mobility model](https://github.com/mihir-lakhani/mihir-portfolio/blob/master/models/mobility_model_final.pkl): `models/mobility_model_final.pkl`

### Other components

- **Visitor**
- **Google Gemini**
- **Ollama service**

## Connections

- Visitor → Portfolio pages: opens
- Portfolio pages → Browser interactions: loads interactions
- Browser interactions → Assistant routes: submits questions
- Assistant routes → Assistant service: handles requests
- Assistant routes → Conversation handling: validates turns
- Assistant routes → Session memory: manages sessions
- Assistant service → RAG settings: uses settings
- Assistant service → Source registry: checks sources
- Source registry → Approved portfolio sources: approves
- Assistant service → Query hints: selects sources
- Query hints → Query taxonomy: reads concepts
- Assistant service → Retrieval selection: requests evidence
- Retrieval selection → Hybrid retrieval: selects local mode
- Hybrid retrieval → Local search index: searches
- Retrieval selection → Gemini File Search: selects hosted mode
- Assistant service → Answer generation: requests answer
- Answer generation → Gemini generator: selects provider
- Answer generation → Ollama generator: selects provider
- Gemini generator → Google Gemini: generates with
- Ollama generator → Ollama service: generates with
- Gemini File Search → Google Gemini: searches store
- Flask application → Assistant routes: registers routes
- Flask application → Cardiovascular demo: serves demo
- Cardiovascular demo → Cardio model: loads model
- Flask application → Mobility handover demo: serves demo
- Mobility handover demo → Mobility model: loads model
