# praveenks30/spring-ai architecture

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

- Interactive diagram: https://gitdiagram.com/praveenks30/spring-ai
- Repository: https://github.com/praveenks30/spring-ai

## Overview

This repository is a set of independent Spring AI demos, not one application. The clearest fully evidenced workflow is RAG: an HTTP request triggers document loading and vector indexing, then retrieval-augmented chat returns an answer. Other demos cover vector search, Ollama chat, Azure Entra ID configuration, function-calling weather, file reading, and structured output. Several of those branches are represented from the tree only; their connections are left unverified rather than inferred.

Main entry points: [`springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/controller/AIController.java`](https://github.com/praveenks30/spring-ai/blob/main/springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/controller/AIController.java) (RAG endpoint), [`springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/service/AIService.java`](https://github.com/praveenks30/spring-ai/blob/main/springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/service/AIService.java) (Document indexing), [`springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherService.java`](https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherService.java) (Weather function), [`springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherServieBuilder.java`](https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherServieBuilder.java) (Weather API client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_rag["RAG Chat"]
  node_rag_controller["RAG endpoint<br/>[AIController.java]"]
  node_rag_service["Document indexing<br/>[AIService.java]"]
  node_sample_text["Sample text<br/>[sample.txt]"]
  node_vector_store[("Vector store")]
  node_chat_client["Chat client"]
end

subgraph group_vectors["Vector Search"]
  node_vector_controller["Search endpoint"]
  node_vector_service["Vector search"]
  node_vector_config["Store configuration"]
  node_query_controller["JSON query endpoint"]
  node_query_service["JSON query search<br/>[VectorService.java]"]
  node_query_config["Query store config"]
  node_bike_data["Bike records<br/>[bikes.json]"]
end

subgraph group_chat["Chat Integrations"]
  node_ollama_controller["Ollama chat endpoint<br/>[AIController.java]"]
  node_ollama_service["Ollama chat service<br/>[AIService.java]"]
  node_gpt_controller["GPT-4o endpoint"]
  node_gpt_service["GPT-4o chat service<br/>[ChatService.java]"]
  node_entra_controller["Entra AI endpoint<br/>[AIController.java]"]
  node_entra_config["Entra configuration<br/>[Config.java]"]
end

subgraph group_weather["Weather Functions"]
  node_weather_controller["Weather query endpoint<br/>[AIController.java]"]
  node_weather_ai["Function-enabled chat<br/>[AIService.java]"]
  node_weather_config["Function registration<br/>[Config.java]"]
  node_weather_service["Weather function"]
  node_weather_builder["Weather API client"]
  node_weather_dto["Weather data types<br/>[Weather.java]"]
end

subgraph group_output["File And Structured Output"]
  node_file_controller["File reader endpoint<br/>[AIController.java]"]
  node_file_service["Text reader service<br/>[AIService.java]"]
  node_file_config["File vector config"]
  node_story_data["Story text<br/>[story.txt]"]
  node_structured_controller["Structured chat endpoint"]
  node_books_info["Book response model<br/>[BooksInfo.java]"]
end

node_user(("HTTP user"))
node_weather_api["Weather API"]

node_user -->|"sends request"| node_rag_controller
node_rag_controller -->|"loads documents"| node_rag_service
node_rag_service -->|"reads"| node_sample_text
node_rag_service -->|"adds chunks"| node_vector_store
node_rag_controller -->|"retrieves context"| node_vector_store
node_rag_controller -->|"requests answer"| node_chat_client
node_rag_controller -->|"returns answer"| node_user
node_user -.->|"queries"| node_vector_controller
node_vector_controller -.->|"delegates search"| node_vector_service
node_vector_config -.->|"configures store"| node_vector_service
node_user -.->|"queries JSON"| node_query_controller
node_query_controller -.->|"delegates search"| node_query_service
node_query_config -.->|"configures store"| node_query_service
node_bike_data -.->|"provides records"| node_query_service
node_user -->|"sends request"| node_ollama_controller
node_ollama_controller -->|"delegates chat"| node_ollama_service
node_user -.->|"sends request"| node_gpt_controller
node_gpt_controller -.->|"delegates chat"| node_gpt_service
node_user -.->|"sends request"| node_entra_controller
node_entra_config -.->|"configures AI"| node_entra_controller
node_user -->|"submits query"| node_weather_controller
node_weather_controller -->|"requests weather"| node_weather_ai
node_weather_config -->|"registers function"| node_weather_service
node_weather_service -->|"gets weather"| node_weather_builder
node_weather_builder -->|"calls API"| node_weather_api
node_weather_service -->|"uses types"| node_weather_dto
node_weather_builder -->|"maps response"| node_weather_dto
node_weather_ai -.->|"invokes function"| node_weather_config
node_user -.->|"sends request"| node_file_controller
node_file_controller -.->|"delegates reading"| node_file_service
node_file_config -.->|"configures store"| node_file_service
node_file_service -.->|"reads text"| node_story_data
node_user -.->|"sends request"| node_structured_controller
node_structured_controller -.->|"uses response type"| node_books_info

click node_rag_controller "https://github.com/praveenks30/spring-ai/blob/main/springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/controller/AIController.java"
click node_rag_service "https://github.com/praveenks30/spring-ai/blob/main/springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/service/AIService.java"
click node_sample_text "https://github.com/praveenks30/spring-ai/blob/main/springai_chat_client_rag/src/main/resources/data/sample.txt"
click node_vector_controller "https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-demo/src/main/java/com/example/springaivectorsearchdemo/controller/VectorController.java"
click node_vector_service "https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-demo/src/main/java/com/example/springaivectorsearchdemo/services/VectorServices.java"
click node_vector_config "https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-demo/src/main/java/com/example/springaivectorsearchdemo/config/VectorStoreConfig.java"
click node_query_controller "https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-queryjson/src/main/java/com/example/springaivectorsearchqueryjson/controller/VectorController.java"
click node_query_service "https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-queryjson/src/main/java/com/example/springaivectorsearchqueryjson/services/VectorService.java"
click node_query_config "https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-queryjson/src/main/java/com/example/springaivectorsearchqueryjson/config/VectorStoreConfig.java"
click node_bike_data "https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-queryjson/src/main/resources/data/bikes.json"
click node_ollama_controller "https://github.com/praveenks30/spring-ai/blob/main/springai_ollama_chat/src/main/java/com/course/springai_ollama_chat/controller/AIController.java"
click node_ollama_service "https://github.com/praveenks30/spring-ai/blob/main/springai_ollama_chat/src/main/java/com/course/springai_ollama_chat/service/AIService.java"
click node_gpt_controller "https://github.com/praveenks30/spring-ai/blob/main/springai-gpt-4o-demo/src/main/java/com/example/springaigpt4odemo/controller/chatController.java"
click node_gpt_service "https://github.com/praveenks30/spring-ai/blob/main/springai-gpt-4o-demo/src/main/java/com/example/springaigpt4odemo/service/ChatService.java"
click node_entra_controller "https://github.com/praveenks30/spring-ai/blob/main/springai_openai_entraID/src/main/java/com/course/springai_openai_entraID/controller/AIController.java"
click node_entra_config "https://github.com/praveenks30/spring-ai/blob/main/springai_openai_entraID/src/main/java/com/course/springai_openai_entraID/config/Config.java"
click node_weather_controller "https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/controller/AIController.java"
click node_weather_ai "https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/AIService.java"
click node_weather_config "https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/config/Config.java"
click node_weather_service "https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherService.java"
click node_weather_builder "https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherServieBuilder.java"
click node_weather_dto "https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/dto/Weather.java"
click node_file_controller "https://github.com/praveenks30/spring-ai/blob/main/springai_files_textreader/src/main/java/com/course/springai_files_textreader/controller/AIController.java"
click node_file_service "https://github.com/praveenks30/spring-ai/blob/main/springai_files_textreader/src/main/java/com/course/springai_files_textreader/service/AIService.java"
click node_file_config "https://github.com/praveenks30/spring-ai/blob/main/springai_files_textreader/src/main/java/com/course/springai_files_textreader/config/VectorStoreConfig.java"
click node_story_data "https://github.com/praveenks30/spring-ai/blob/main/springai_files_textreader/src/main/resources/data/story.txt"
click node_structured_controller "https://github.com/praveenks30/spring-ai/blob/main/springai_structured_output_chat_client/src/main/java/com/course/springai_structured_output_chat_client/controller/AIChatController.java"
click node_books_info "https://github.com/praveenks30/spring-ai/blob/main/springai_structured_output_chat_client/src/main/java/com/course/springai_structured_output_chat_client/dto/BooksInfo.java"

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_rag_controller,node_rag_service,node_sample_text,node_vector_store,node_chat_client,node_user toneBlue
class node_vector_controller,node_vector_service,node_vector_config,node_query_controller,node_query_service,node_query_config,node_bike_data toneAmber
class node_ollama_controller,node_ollama_service,node_gpt_controller,node_gpt_service,node_entra_controller,node_entra_config,node_weather_api toneMint
class node_weather_controller,node_weather_ai,node_weather_config,node_weather_service,node_weather_builder,node_weather_dto toneRose
class node_file_controller,node_file_service,node_file_config,node_story_data,node_structured_controller,node_books_info toneIndigo
```

## Components

### RAG Chat

- [RAG endpoint](https://github.com/praveenks30/spring-ai/blob/main/springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/controller/AIController.java): `springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/controller/AIController.java`
- [Document indexing](https://github.com/praveenks30/spring-ai/blob/main/springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/service/AIService.java): `springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/service/AIService.java`
- [Sample text](https://github.com/praveenks30/spring-ai/blob/main/springai_chat_client_rag/src/main/resources/data/sample.txt): `springai_chat_client_rag/src/main/resources/data/sample.txt`
- **Vector store**
- **Chat client**

### Vector Search

- [Search endpoint](https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-demo/src/main/java/com/example/springaivectorsearchdemo/controller/VectorController.java): `springai-vectorsearch-demo/src/main/java/com/example/springaivectorsearchdemo/controller/VectorController.java`
- [Vector search](https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-demo/src/main/java/com/example/springaivectorsearchdemo/services/VectorServices.java): `springai-vectorsearch-demo/src/main/java/com/example/springaivectorsearchdemo/services/VectorServices.java`
- [Store configuration](https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-demo/src/main/java/com/example/springaivectorsearchdemo/config/VectorStoreConfig.java): `springai-vectorsearch-demo/src/main/java/com/example/springaivectorsearchdemo/config/VectorStoreConfig.java`
- [JSON query endpoint](https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-queryjson/src/main/java/com/example/springaivectorsearchqueryjson/controller/VectorController.java): `springai-vectorsearch-queryjson/src/main/java/com/example/springaivectorsearchqueryjson/controller/VectorController.java`
- [JSON query search](https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-queryjson/src/main/java/com/example/springaivectorsearchqueryjson/services/VectorService.java): `springai-vectorsearch-queryjson/src/main/java/com/example/springaivectorsearchqueryjson/services/VectorService.java`
- [Query store config](https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-queryjson/src/main/java/com/example/springaivectorsearchqueryjson/config/VectorStoreConfig.java): `springai-vectorsearch-queryjson/src/main/java/com/example/springaivectorsearchqueryjson/config/VectorStoreConfig.java`
- [Bike records](https://github.com/praveenks30/spring-ai/blob/main/springai-vectorsearch-queryjson/src/main/resources/data/bikes.json): `springai-vectorsearch-queryjson/src/main/resources/data/bikes.json`

### Chat Integrations

- [Ollama chat endpoint](https://github.com/praveenks30/spring-ai/blob/main/springai_ollama_chat/src/main/java/com/course/springai_ollama_chat/controller/AIController.java): `springai_ollama_chat/src/main/java/com/course/springai_ollama_chat/controller/AIController.java`
- [Ollama chat service](https://github.com/praveenks30/spring-ai/blob/main/springai_ollama_chat/src/main/java/com/course/springai_ollama_chat/service/AIService.java): `springai_ollama_chat/src/main/java/com/course/springai_ollama_chat/service/AIService.java`
- [GPT-4o endpoint](https://github.com/praveenks30/spring-ai/blob/main/springai-gpt-4o-demo/src/main/java/com/example/springaigpt4odemo/controller/chatController.java): `springai-gpt-4o-demo/src/main/java/com/example/springaigpt4odemo/controller/chatController.java`
- [GPT-4o chat service](https://github.com/praveenks30/spring-ai/blob/main/springai-gpt-4o-demo/src/main/java/com/example/springaigpt4odemo/service/ChatService.java): `springai-gpt-4o-demo/src/main/java/com/example/springaigpt4odemo/service/ChatService.java`
- [Entra AI endpoint](https://github.com/praveenks30/spring-ai/blob/main/springai_openai_entraID/src/main/java/com/course/springai_openai_entraID/controller/AIController.java): `springai_openai_entraID/src/main/java/com/course/springai_openai_entraID/controller/AIController.java`
- [Entra configuration](https://github.com/praveenks30/spring-ai/blob/main/springai_openai_entraID/src/main/java/com/course/springai_openai_entraID/config/Config.java): `springai_openai_entraID/src/main/java/com/course/springai_openai_entraID/config/Config.java`

### Weather Functions

- [Weather query endpoint](https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/controller/AIController.java): `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/controller/AIController.java`
- [Function-enabled chat](https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/AIService.java): `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/AIService.java`
- [Function registration](https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/config/Config.java): `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/config/Config.java`
- [Weather function](https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherService.java): `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherService.java`
- [Weather API client](https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherServieBuilder.java): `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherServieBuilder.java`
- [Weather data types](https://github.com/praveenks30/spring-ai/blob/main/springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/dto/Weather.java): `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/dto/Weather.java`

### File And Structured Output

- [File reader endpoint](https://github.com/praveenks30/spring-ai/blob/main/springai_files_textreader/src/main/java/com/course/springai_files_textreader/controller/AIController.java): `springai_files_textreader/src/main/java/com/course/springai_files_textreader/controller/AIController.java`
- [Text reader service](https://github.com/praveenks30/spring-ai/blob/main/springai_files_textreader/src/main/java/com/course/springai_files_textreader/service/AIService.java): `springai_files_textreader/src/main/java/com/course/springai_files_textreader/service/AIService.java`
- [File vector config](https://github.com/praveenks30/spring-ai/blob/main/springai_files_textreader/src/main/java/com/course/springai_files_textreader/config/VectorStoreConfig.java): `springai_files_textreader/src/main/java/com/course/springai_files_textreader/config/VectorStoreConfig.java`
- [Story text](https://github.com/praveenks30/spring-ai/blob/main/springai_files_textreader/src/main/resources/data/story.txt): `springai_files_textreader/src/main/resources/data/story.txt`
- [Structured chat endpoint](https://github.com/praveenks30/spring-ai/blob/main/springai_structured_output_chat_client/src/main/java/com/course/springai_structured_output_chat_client/controller/AIChatController.java): `springai_structured_output_chat_client/src/main/java/com/course/springai_structured_output_chat_client/controller/AIChatController.java`
- [Book response model](https://github.com/praveenks30/spring-ai/blob/main/springai_structured_output_chat_client/src/main/java/com/course/springai_structured_output_chat_client/dto/BooksInfo.java): `springai_structured_output_chat_client/src/main/java/com/course/springai_structured_output_chat_client/dto/BooksInfo.java`

### Other components

- **HTTP user**
- **Weather API**

## Connections

- HTTP user → RAG endpoint: sends request (evidence: `springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/controller/AIController.java`)
- RAG endpoint → Document indexing: loads documents (evidence: `springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/controller/AIController.java`)
- Document indexing → Sample text: reads (evidence: `springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/service/AIService.java`)
- Document indexing → Vector store: adds chunks (evidence: `springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/service/AIService.java`)
- RAG endpoint → Vector store: retrieves context (evidence: `springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/controller/AIController.java`)
- RAG endpoint → Chat client: requests answer (evidence: `springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/controller/AIController.java`)
- RAG endpoint → HTTP user: returns answer (evidence: `springai_chat_client_rag/src/main/java/com/course/springai_chat_client_rag/controller/AIController.java`)
- HTTP user → Search endpoint: queries
- Search endpoint → Vector search: delegates search
- Store configuration → Vector search: configures store
- HTTP user → JSON query endpoint: queries JSON
- JSON query endpoint → JSON query search: delegates search
- Query store config → JSON query search: configures store
- Bike records → JSON query search: provides records
- HTTP user → Ollama chat endpoint: sends request (evidence: `springai_ollama_chat/src/main/java/com/course/springai_ollama_chat/controller/AIController.java`)
- Ollama chat endpoint → Ollama chat service: delegates chat (evidence: `springai_ollama_chat/src/main/java/com/course/springai_ollama_chat/controller/AIController.java`)
- HTTP user → GPT-4o endpoint: sends request
- GPT-4o endpoint → GPT-4o chat service: delegates chat
- HTTP user → Entra AI endpoint: sends request
- Entra configuration → Entra AI endpoint: configures AI
- HTTP user → Weather query endpoint: submits query (evidence: `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/controller/AIController.java`)
- Weather query endpoint → Function-enabled chat: requests weather (evidence: `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/controller/AIController.java`)
- Function registration → Weather function: registers function (evidence: `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/config/Config.java`)
- Weather function → Weather API client: gets weather (evidence: `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherService.java`)
- Weather API client → Weather API: calls API (evidence: `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherServieBuilder.java`)
- Weather function → Weather data types: uses types (evidence: `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherService.java`)
- Weather API client → Weather data types: maps response (evidence: `springai_openai_function_calling/src/main/java/com/course/springai_openai_function_calling/service/WeatherServieBuilder.java`)
- Function-enabled chat → Function registration: invokes function
- HTTP user → File reader endpoint: sends request
- File reader endpoint → Text reader service: delegates reading
- File vector config → Text reader service: configures store
- Text reader service → Story text: reads text
- HTTP user → Structured chat endpoint: sends request
- Structured chat endpoint → Book response model: uses response type
