# eitan-djavarov/ragent architecture

> Architecture diagram of the GitHub repository eitan-djavarov/ragent, 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/eitan-djavarov/ragent
- Repository: https://github.com/eitan-djavarov/ragent

## Overview

Tech-Doc-Intelligence is an incident-investigation platform: users create or upload incident material, then ask questions and receive structured, cited analysis or SQL-backed metrics. The Streamlit UI calls the .NET API, which persists incident records and proxies ingestion and analysis to the AI service. AI ingestion chunks documents and indexes them; query orchestration rewrites and routes questions, retrieves and expands context, synthesizes answers, and checks grounding. The README documents these capabilities; source excerpts are partial, so uncertain internal wiring is omitted.

Main entry points: [`ai-service/app/agent/orchestrator.py`](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/agent/orchestrator.py) (Agent orchestrator), [`ai-service/app/rag/pipeline.py`](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/rag/pipeline.py) (RAG pipeline), [`frontend-ui/api/client.py`](https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/api/client.py) (HTTP/SSE client), [`frontend-ui/main.py`](https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/main.py) (Streamlit workspace)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Investigation UI"]
  node_streamlit["Streamlit workspace<br/>[main.py]"]
  node_ui_forms["Incident forms<br/>[incident_form.py]"]
  node_ui_analysis["Analysis views<br/>[analysis_view.py]"]
  node_ui_tables["Analytics and documents<br/>[data_tables.py]"]
  node_ui_client["HTTP/SSE client<br/>[client.py]"]
end

subgraph group_backend["Backend API"]
  node_incidents_api["Incident endpoints"]
  node_incident_service["Incident service<br/>[IncidentService.cs]"]
  node_ai_client["AI service client<br/>[AiServiceClient.cs]"]
end

subgraph group_ingestion["Document Ingestion"]
  node_file_ingestion["File ingestion<br/>[file_ingestion.py]"]
  node_document_parser["Document parsing<br/>[document_parser.py]"]
  node_chunker["Hierarchical chunking"]
  node_indexer["Qdrant indexing<br/>[qdrant_indexer.py]"]
end

subgraph group_ai["AI Analysis"]
  node_ai_api["AI v1 endpoints<br/>[endpoints.py]"]
  node_orchestrator["Agent orchestrator<br/>[orchestrator.py]"]
  node_rewriter["Query rewriting<br/>[query_rewriter.py]"]
  node_rag_pipeline["RAG pipeline<br/>[pipeline.py]"]
  node_hybrid_search["Hybrid retrieval<br/>[hybrid_search.py]"]
  node_parent_expansion["Parent expansion"]
  node_sql_tool["Read-only SQL tool<br/>[sql_tool.py]"]
  node_synthesis["Answer synthesis<br/>[llm_synthesis.py]"]
  node_grounding["Grounding guard<br/>[grounding_guard.py]"]
  node_citations["Citation indexing<br/>[indexing.py]"]
end

subgraph group_state["Stores and Providers"]
  node_postgres[("PostgreSQL incidents<br/>[AppDbContext.cs]")]
  node_qdrant[("Qdrant vectors")]
  node_redis[("Redis cache and sessions")]
end

node_investigator(("Investigator"))
node_llm(("OpenAI / Ollama"))

node_investigator -->|"uses"| node_streamlit
node_streamlit -->|"renders"| node_ui_forms
node_streamlit -->|"renders"| node_ui_tables
node_ui_forms -->|"submits"| node_ui_client
node_ui_tables -->|"requests"| node_ui_client
node_ui_client -->|"HTTP / SSE"| node_incidents_api
node_incidents_api -->|"delegates"| node_incident_service
node_incidents_api -->|"proxies AI"| node_ai_client
node_incident_service -->|"reads / writes"| node_postgres
node_incident_service -->|"ingests / deletes"| node_ai_client
node_ai_client -->|"HTTP calls"| node_ai_api
node_ai_api -->|"dispatches uploads"| node_file_ingestion
node_file_ingestion -->|"parses files"| node_document_parser
node_file_ingestion -->|"chunks content"| node_chunker
node_chunker -->|"creates chunks"| node_indexer
node_indexer -->|"writes vectors"| node_qdrant
node_ai_api -->|"dispatches queries"| node_orchestrator
node_orchestrator -->|"rewrites query"| node_rewriter
node_orchestrator -->|"runs retrieval"| node_rag_pipeline
node_orchestrator -->|"routes SQL"| node_sql_tool
node_orchestrator -->|"uses cache / memory"| node_redis
node_rag_pipeline -->|"retrieves hits"| node_hybrid_search
node_hybrid_search -->|"dense search"| node_qdrant
node_hybrid_search -->|"expands parents"| node_parent_expansion
node_rag_pipeline -->|"generates analysis"| node_synthesis
node_rag_pipeline -->|"checks grounding"| node_grounding
node_rag_pipeline -->|"indexes citations"| node_citations
node_synthesis -.->|"completes prompt"| node_llm
node_rewriter -.->|"rewrites prompt"| node_llm
node_ui_client -->|"returns results"| node_ui_analysis

click node_streamlit "https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/main.py"
click node_ui_forms "https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/components/incident_form.py"
click node_ui_analysis "https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/components/analysis_view.py"
click node_ui_tables "https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/components/data_tables.py"
click node_ui_client "https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/api/client.py"
click node_incidents_api "https://github.com/eitan-djavarov/ragent/blob/main/backend-core/Controllers/IncidentsController.cs"
click node_incident_service "https://github.com/eitan-djavarov/ragent/blob/main/backend-core/Services/IncidentService.cs"
click node_ai_client "https://github.com/eitan-djavarov/ragent/blob/main/backend-core/Clients/AiServiceClient.cs"
click node_postgres "https://github.com/eitan-djavarov/ragent/blob/main/backend-core/Data/AppDbContext.cs"
click node_ai_api "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/api/v1/endpoints.py"
click node_file_ingestion "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/rag/file_ingestion.py"
click node_document_parser "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/rag/document_parser.py"
click node_chunker "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/ingestion/hierarchical_chunker.py"
click node_indexer "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/ingestion/qdrant_indexer.py"
click node_orchestrator "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/agent/orchestrator.py"
click node_rewriter "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/agent/query_rewriter.py"
click node_rag_pipeline "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/rag/pipeline.py"
click node_hybrid_search "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/retrieval/hybrid_search.py"
click node_parent_expansion "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/retrieval/parent_expansion.py"
click node_sql_tool "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/agent/sql_tool.py"
click node_synthesis "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/rag/llm_synthesis.py"
click node_grounding "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/agent/grounding_guard.py"
click node_citations "https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/citations/indexing.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_ui_forms,node_ui_analysis,node_ui_tables,node_ui_client toneBlue
class node_incidents_api,node_incident_service,node_ai_client toneAmber
class node_file_ingestion,node_document_parser,node_chunker,node_indexer toneMint
class node_ai_api,node_orchestrator,node_rewriter,node_rag_pipeline,node_hybrid_search,node_parent_expansion,node_sql_tool,node_synthesis,node_grounding,node_citations toneRose
class node_postgres,node_qdrant,node_redis,node_investigator,node_llm toneIndigo
```

## Components

### Investigation UI

- [Streamlit workspace](https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/main.py): `frontend-ui/main.py`
- [Incident forms](https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/components/incident_form.py): `frontend-ui/components/incident_form.py`
- [Analysis views](https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/components/analysis_view.py): `frontend-ui/components/analysis_view.py`
- [Analytics and documents](https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/components/data_tables.py): `frontend-ui/components/data_tables.py`
- [HTTP/SSE client](https://github.com/eitan-djavarov/ragent/blob/main/frontend-ui/api/client.py): `frontend-ui/api/client.py`

### Backend API

- [Incident endpoints](https://github.com/eitan-djavarov/ragent/blob/main/backend-core/Controllers/IncidentsController.cs): `backend-core/Controllers/IncidentsController.cs`
- [Incident service](https://github.com/eitan-djavarov/ragent/blob/main/backend-core/Services/IncidentService.cs): `backend-core/Services/IncidentService.cs`
- [AI service client](https://github.com/eitan-djavarov/ragent/blob/main/backend-core/Clients/AiServiceClient.cs): `backend-core/Clients/AiServiceClient.cs`

### Document Ingestion

- [File ingestion](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/rag/file_ingestion.py): `ai-service/app/rag/file_ingestion.py`
- [Document parsing](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/rag/document_parser.py): `ai-service/app/rag/document_parser.py`
- [Hierarchical chunking](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/ingestion/hierarchical_chunker.py): `ai-service/app/ingestion/hierarchical_chunker.py`
- [Qdrant indexing](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/ingestion/qdrant_indexer.py): `ai-service/app/ingestion/qdrant_indexer.py`

### AI Analysis

- [AI v1 endpoints](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/api/v1/endpoints.py): `ai-service/app/api/v1/endpoints.py`
- [Agent orchestrator](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/agent/orchestrator.py): `ai-service/app/agent/orchestrator.py`
- [Query rewriting](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/agent/query_rewriter.py): `ai-service/app/agent/query_rewriter.py`
- [RAG pipeline](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/rag/pipeline.py): `ai-service/app/rag/pipeline.py`
- [Hybrid retrieval](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/retrieval/hybrid_search.py): `ai-service/app/retrieval/hybrid_search.py`
- [Parent expansion](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/retrieval/parent_expansion.py): `ai-service/app/retrieval/parent_expansion.py`
- [Read-only SQL tool](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/agent/sql_tool.py): `ai-service/app/agent/sql_tool.py`
- [Answer synthesis](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/rag/llm_synthesis.py): `ai-service/app/rag/llm_synthesis.py`
- [Grounding guard](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/agent/grounding_guard.py): `ai-service/app/agent/grounding_guard.py`
- [Citation indexing](https://github.com/eitan-djavarov/ragent/blob/main/ai-service/app/citations/indexing.py): `ai-service/app/citations/indexing.py`

### Stores and Providers

- [PostgreSQL incidents](https://github.com/eitan-djavarov/ragent/blob/main/backend-core/Data/AppDbContext.cs): `backend-core/Data/AppDbContext.cs`
- **Qdrant vectors**
- **Redis cache and sessions**

### Other components

- **Investigator**
- **OpenAI / Ollama**

## Connections

- Investigator → Streamlit workspace: uses
- Streamlit workspace → Incident forms: renders
- Streamlit workspace → Analytics and documents: renders
- Incident forms → HTTP/SSE client: submits
- Analytics and documents → HTTP/SSE client: requests
- HTTP/SSE client → Incident endpoints: HTTP / SSE
- Incident endpoints → Incident service: delegates
- Incident endpoints → AI service client: proxies AI
- Incident service → PostgreSQL incidents: reads / writes
- Incident service → AI service client: ingests / deletes
- AI service client → AI v1 endpoints: HTTP calls
- AI v1 endpoints → File ingestion: dispatches uploads
- File ingestion → Document parsing: parses files
- File ingestion → Hierarchical chunking: chunks content
- Hierarchical chunking → Qdrant indexing: creates chunks
- Qdrant indexing → Qdrant vectors: writes vectors
- AI v1 endpoints → Agent orchestrator: dispatches queries
- Agent orchestrator → Query rewriting: rewrites query
- Agent orchestrator → RAG pipeline: runs retrieval
- Agent orchestrator → Read-only SQL tool: routes SQL
- Agent orchestrator → Redis cache and sessions: uses cache / memory
- RAG pipeline → Hybrid retrieval: retrieves hits
- Hybrid retrieval → Qdrant vectors: dense search
- Hybrid retrieval → Parent expansion: expands parents
- RAG pipeline → Answer synthesis: generates analysis
- RAG pipeline → Grounding guard: checks grounding
- RAG pipeline → Citation indexing: indexes citations
- Answer synthesis → OpenAI / Ollama: completes prompt
- Query rewriting → OpenAI / Ollama: rewrites prompt
- HTTP/SSE client → Analysis views: returns results
