# mukulb22-gh/ai_resume_tailor architecture

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

- Interactive diagram: https://gitdiagram.com/mukulb22-gh/ai_resume_tailor
- Repository: https://github.com/mukulb22-gh/ai_resume_tailor

## Overview

Smart Resume & Job Matcher is a Streamlit application that turns an uploaded resume and job description into a tailored, ATS-friendly resume. The user workflow validates inputs, extracts and chunks the resume, indexes chunks for retrieval, then runs analyzer, rewriter, and reviewer tasks before saving the result. The main internal layers are the UI, services, RAG chain and vector store, and CrewAI agents. The source shows sequential task configuration; provider calls are supported by the README and sampled code. Other README capabilities are not expanded beyond that evidence.

Main entry points: [`services/resume_service.py`](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/services/resume_service.py) (Resume service), [`ui/streamlit_app.py`](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/ui/streamlit_app.py) (Streamlit app), [`chains/rag_chain.py`](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/chains/rag_chain.py) (Retrieval chain), [`services/rag_service.py`](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/services/rag_service.py) (RAG service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["User interface"]
  node_entry["Application entry<br/>[main.py]"]
  node_streamlit["Streamlit app<br/>[streamlit_app.py]"]
end

subgraph group_services["Application services"]
  node_file_service["File processing<br/>[file_service.py]"]
  node_resume_data["Resume data<br/>[resume_models.py]"]
  node_rag_service["RAG service<br/>[rag_service.py]"]
  node_resume_service["Resume service<br/>[resume_service.py]"]
end

subgraph group_retrieval["Resume retrieval"]
  node_embedder["Embedding and indexing<br/>[embedder.py]"]
  node_vector_store[("Chroma vector store<br/>[embedder.py]")]
  node_rag_chain["Retrieval chain<br/>[rag_chain.py]"]
end

subgraph group_tailoring["Resume tailoring"]
  node_analyzer["Resume analyzer<br/>[analyzer_agent.py]"]
  node_rewriter["Resume rewriter<br/>[rewriter_agent.py]"]
  node_reviewer["Resume reviewer<br/>[reviewer_agent.py]"]
  node_crew["CrewAI execution<br/>[resume_service.py]"]
end

node_user(("Job seeker"))
node_groq{{"Groq API"}}
node_gemini{{"Gemini API"}}
node_output["Saved resume file"]

node_user -->|"enters inputs"| node_streamlit
node_entry -->|"starts"| node_streamlit
node_streamlit -->|"processes upload"| node_file_service
node_file_service -->|"produces"| node_resume_data
node_streamlit -->|"sets up retrieval"| node_rag_service
node_rag_service -->|"indexes chunks"| node_embedder
node_embedder -->|"writes embeddings"| node_vector_store
node_rag_service -->|"builds chain"| node_rag_chain
node_rag_chain -->|"retrieves context"| node_vector_store
node_rag_chain -.->|"generates with"| node_groq
node_rag_chain -.->|"generates with"| node_gemini
node_streamlit -->|"submits resume and job"| node_resume_service
node_resume_service -->|"creates agent"| node_analyzer
node_resume_service -->|"creates agent"| node_rewriter
node_resume_service -->|"creates agent"| node_reviewer
node_resume_service -->|"configures and runs"| node_crew
node_crew -->|"dispatches first"| node_analyzer
node_crew -->|"dispatches second"| node_rewriter
node_crew -->|"dispatches third"| node_reviewer
node_analyzer -->|"retrieves resume evidence"| node_rag_chain
node_resume_service -.->|"configures LLM"| node_groq
node_resume_service -.->|"configures LLM"| node_gemini
node_streamlit -->|"saves result"| node_resume_service
node_resume_service -->|"writes tailored resume"| node_output

click node_entry "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/main.py"
click node_streamlit "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/ui/streamlit_app.py"
click node_file_service "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/services/file_service.py"
click node_resume_data "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/models/resume_models.py"
click node_rag_service "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/services/rag_service.py"
click node_resume_service "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/services/resume_service.py"
click node_embedder "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/utils/embedder.py"
click node_vector_store "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/utils/embedder.py"
click node_rag_chain "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/chains/rag_chain.py"
click node_analyzer "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/agents/analyzer_agent.py"
click node_rewriter "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/agents/rewriter_agent.py"
click node_reviewer "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/agents/reviewer_agent.py"
click node_crew "https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/services/resume_service.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_entry,node_streamlit toneBlue
class node_file_service,node_resume_data,node_rag_service,node_resume_service toneAmber
class node_embedder,node_vector_store,node_rag_chain,node_groq,node_gemini toneMint
class node_analyzer,node_rewriter,node_reviewer,node_crew toneRose
class node_user,node_output toneIndigo
```

## Components

### User interface

- [Application entry](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/main.py): `main.py`
- [Streamlit app](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/ui/streamlit_app.py): `ui/streamlit_app.py`

### Application services

- [File processing](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/services/file_service.py): `services/file_service.py`
- [Resume data](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/models/resume_models.py): `models/resume_models.py`
- [RAG service](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/services/rag_service.py): `services/rag_service.py`
- [Resume service](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/services/resume_service.py): `services/resume_service.py`

### Resume retrieval

- [Embedding and indexing](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/utils/embedder.py): `utils/embedder.py`
- [Chroma vector store](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/utils/embedder.py): `utils/embedder.py`
- [Retrieval chain](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/chains/rag_chain.py): `chains/rag_chain.py`

### Resume tailoring

- [Resume analyzer](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/agents/analyzer_agent.py): `agents/analyzer_agent.py`
- [Resume rewriter](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/agents/rewriter_agent.py): `agents/rewriter_agent.py`
- [Resume reviewer](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/agents/reviewer_agent.py): `agents/reviewer_agent.py`
- [CrewAI execution](https://github.com/mukulb22-gh/ai_resume_tailor/blob/main/services/resume_service.py): `services/resume_service.py`

### Other components

- **Job seeker**
- **Groq API**
- **Gemini API**
- **Saved resume file**

## Connections

- Job seeker → Streamlit app: enters inputs
- Application entry → Streamlit app: starts
- Streamlit app → File processing: processes upload
- File processing → Resume data: produces
- Streamlit app → RAG service: sets up retrieval
- RAG service → Embedding and indexing: indexes chunks
- Embedding and indexing → Chroma vector store: writes embeddings
- RAG service → Retrieval chain: builds chain
- Retrieval chain → Chroma vector store: retrieves context
- Retrieval chain → Groq API: generates with
- Retrieval chain → Gemini API: generates with
- Streamlit app → Resume service: submits resume and job
- Resume service → Resume analyzer: creates agent
- Resume service → Resume rewriter: creates agent
- Resume service → Resume reviewer: creates agent
- Resume service → CrewAI execution: configures and runs
- CrewAI execution → Resume analyzer: dispatches first
- CrewAI execution → Resume rewriter: dispatches second
- CrewAI execution → Resume reviewer: dispatches third
- Resume analyzer → Retrieval chain: retrieves resume evidence
- Resume service → Groq API: configures LLM
- Resume service → Gemini API: configures LLM
- Streamlit app → Resume service: saves result
- Resume service → Saved resume file: writes tailored resume
