# viswam-aws/enterpise_rag_v3 architecture

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

- Interactive diagram: https://gitdiagram.com/viswam-aws/enterpise_rag_v3
- Repository: https://github.com/viswam-aws/enterpise_rag_v3

## Overview

This repository contains two local-first RAG chatbots: one for Jira tickets and one for Confluence documents. The main Jira workflow ingests ticket exports, splits them at ticket boundaries, preserves metadata through chunking, indexes them, and serves authenticated questions through a staged router and retrieval/LLM path. Confluence has a parallel document-ingestion and chat experience with conversation history. The graph retains major README-described capabilities; many implementation variants are indexed but not sampled, so uncertain links are omitted rather than inferred.

Main entry points: [`jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py`](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py) (Query router), [`jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py`](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py) (Vector indexing), [`confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py`](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py) (Flask interface), [`confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py`](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py) (Vector indexing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_jira_ingest["Jira ingestion"]
  node_jira_files["Jira exports"]
  node_jira_loader["Ticket loader"]
  node_jira_boundary["Ticket slicing"]
  node_jira_chunks["Metadata chunks"]
  node_jira_index[("Vector indexing")]
end

subgraph group_jira_chat["Jira chat"]
  node_jira_web["Flask interface"]
  node_jira_router["Query router"]
  node_jira_session[("Pinned context")]
  node_jira_lookup["Ticket lookup"]
  node_jira_hybrid["Hybrid matching"]
  node_jira_chain["Fallback RAG"]
end

subgraph group_conf_ingest["Confluence ingestion"]
  node_conf_files["Knowledge files"]
  node_conf_loader["Document loader"]
  node_conf_chunks["Text chunking"]
  node_conf_index[("Vector indexing")]
  node_conf_topics["Topic clustering"]
end

subgraph group_conf_chat["Confluence chat"]
  node_conf_web["Flask interface"]
  node_conf_retrieval["Context retrieval"]
  node_conf_history[("Conversation history")]
  node_conf_chain["Answer chain"]
end

node_user(("User"))
node_ollama{{"Local Ollama"}}

node_jira_files -->|"loads"| node_jira_loader
node_jira_loader -->|"splits tickets"| node_jira_boundary
node_jira_boundary -->|"chunks metadata"| node_jira_chunks
node_jira_chunks -->|"embeds and stores"| node_jira_index
node_ollama -->|"embeds"| node_jira_index
node_user -->|"asks"| node_jira_web
node_jira_web -->|"routes query"| node_jira_router
node_jira_router -->|"pins context"| node_jira_session
node_jira_router -->|"checks ticket ID"| node_jira_lookup
node_jira_router -->|"matches titles"| node_jira_hybrid
node_jira_router -->|"falls back"| node_jira_chain
node_jira_lookup -->|"filters retrieval"| node_jira_index
node_jira_hybrid -->|"searches vectors"| node_jira_index
node_jira_chain -->|"retrieves context"| node_jira_index
node_jira_chain -->|"generates answer"| node_ollama
node_conf_files -->|"loads"| node_conf_loader
node_conf_loader -->|"splits text"| node_conf_chunks
node_conf_chunks -->|"indexes chunks"| node_conf_index
node_conf_index -->|"clusters embeddings"| node_conf_topics
node_ollama -->|"embeds"| node_conf_index
node_user -->|"asks"| node_conf_web
node_conf_web -->|"prepares context"| node_conf_retrieval
node_conf_retrieval -.->|"retrieves documents"| node_conf_index
node_conf_web -->|"reads history"| node_conf_history
node_conf_web -.->|"invokes chain"| node_conf_chain
node_conf_chain -.->|"generates answer"| node_ollama
node_conf_chain -.->|"records exchange"| node_conf_history

click node_jira_files "https://github.com/viswam-aws/enterpise_rag_v3/tree/main/jira_bot/jira_data"
click node_jira_loader "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py"
click node_jira_boundary "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py"
click node_jira_chunks "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py"
click node_jira_index "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py"
click node_jira_web "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py"
click node_jira_router "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py"
click node_jira_session "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py"
click node_jira_lookup "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py"
click node_jira_hybrid "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py"
click node_jira_chain "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py"
click node_conf_files "https://github.com/viswam-aws/enterpise_rag_v3/tree/main/confluence_bot/confluence_data"
click node_conf_loader "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py"
click node_conf_chunks "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py"
click node_conf_index "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py"
click node_conf_topics "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py"
click node_conf_web "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py"
click node_conf_retrieval "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py"
click node_conf_history "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v1.py"
click node_conf_chain "https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.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_jira_files,node_jira_loader,node_jira_boundary,node_jira_chunks,node_jira_index,node_user toneBlue
class node_jira_web,node_jira_router,node_jira_session,node_jira_lookup,node_jira_hybrid,node_jira_chain toneAmber
class node_conf_files,node_conf_loader,node_conf_chunks,node_conf_index,node_conf_topics toneMint
class node_conf_web,node_conf_retrieval,node_conf_history,node_conf_chain toneRose
class node_ollama toneIndigo
```

## Components

### Jira ingestion

- [Jira exports](https://github.com/viswam-aws/enterpise_rag_v3/tree/main/jira_bot/jira_data): `jira_bot/jira_data`
- [Ticket loader](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py): `jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py`
- [Ticket slicing](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py): `jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py`
- [Metadata chunks](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py): `jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py`
- [Vector indexing](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py): `jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py`

### Jira chat

- [Flask interface](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py): `jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py`
- [Query router](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py): `jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py`
- [Pinned context](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py): `jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py`
- [Ticket lookup](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py): `jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py`
- [Hybrid matching](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py): `jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py`
- [Fallback RAG](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py): `jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py`

### Confluence ingestion

- [Knowledge files](https://github.com/viswam-aws/enterpise_rag_v3/tree/main/confluence_bot/confluence_data): `confluence_bot/confluence_data`
- [Document loader](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py): `confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py`
- [Text chunking](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py): `confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py`
- [Vector indexing](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py): `confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py`
- [Topic clustering](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py): `confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py`

### Confluence chat

- [Flask interface](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py): `confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py`
- [Context retrieval](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py): `confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py`
- [Conversation history](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v1.py): `confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v1.py`
- [Answer chain](https://github.com/viswam-aws/enterpise_rag_v3/blob/main/confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py): `confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py`

### Other components

- **User**
- **Local Ollama**

## Connections

- Jira exports → Ticket loader: loads (evidence: `README.md`)
- Ticket loader → Ticket slicing: splits tickets (evidence: `jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py`)
- Ticket slicing → Metadata chunks: chunks metadata (evidence: `README.md`)
- Metadata chunks → Vector indexing: embeds and stores (evidence: `jira_bot/jira_vectorizing/working_main_chroma_index_iterate_new_cc_count_export_name_v2.py`)
- Local Ollama → Vector indexing: embeds (evidence: `README.md`)
- User → Flask interface: asks (evidence: `README.md`)
- Flask interface → Query router: routes query (evidence: `jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py`)
- Query router → Pinned context: pins context (evidence: `jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py`)
- Query router → Ticket lookup: checks ticket ID (evidence: `README.md`)
- Query router → Hybrid matching: matches titles (evidence: `README.md`)
- Query router → Fallback RAG: falls back (evidence: `README.md`)
- Ticket lookup → Vector indexing: filters retrieval (evidence: `jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py`)
- Hybrid matching → Vector indexing: searches vectors (evidence: `README.md`)
- Fallback RAG → Vector indexing: retrieves context (evidence: `jira_bot/widget_jira_bot/working_flask_bot_list_cc_new_v4_greet.py`)
- Fallback RAG → Local Ollama: generates answer (evidence: `README.md`)
- Knowledge files → Document loader: loads (evidence: `confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py`)
- Document loader → Text chunking: splits text (evidence: `confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py`)
- Text chunking → Vector indexing: indexes chunks (evidence: `confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py`)
- Vector indexing → Topic clustering: clusters embeddings (evidence: `confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py`)
- Local Ollama → Vector indexing: embeds (evidence: `confluence_bot/confluence_vectorizing/working_confuluence_chroma_cluster.py`)
- User → Flask interface: asks (evidence: `confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py`)
- Flask interface → Context retrieval: prepares context (evidence: `confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py`)
- Context retrieval → Vector indexing: retrieves documents
- Flask interface → Conversation history: reads history (evidence: `confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py`)
- Flask interface → Answer chain: invokes chain (evidence: `confluence_bot/widget_confluence_bot/working_flask_confluence_bot_history_v4.py`)
- Answer chain → Local Ollama: generates answer
- Answer chain → Conversation history: records exchange
