# timewithpotato/conversational-agentic-ai architecture

> Architecture diagram of the GitHub repository timewithpotato/conversational-agentic-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/timewithpotato/conversational-agentic-ai
- Repository: https://github.com/timewithpotato/conversational-agentic-ai

## Overview

Conversational-Agentic-AI is a web platform for resume-assisted mock interviews and interviewer-led sessions. Users authenticate, upload a resume, conduct a spoken AI interview, and review feedback; interviewers can create sessions, invite participants, and inspect interviewee results. The client routes and providers organize these workflows, an Express API handles requests and persistence, and a Flask service exposes interview, resume-formatting, and evaluation capabilities. The sampled excerpts confirm the resume/interview calls and service wiring; several other feature connections are documented only by route registrations or the source index.

Main entry points: [`server/index.js`](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/index.js) (HTTP API), [`client/src/main.jsx`](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/main.jsx) (App routing), [`model/app.py`](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/model/app.py) (Model API), [`client/src/Pages/VoiceToTextAndSpeak.jsx`](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Pages/VoiceToTextAndSpeak.jsx) (Voice interview)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Client workflows"]
  node_routing["App routing<br/>[main.jsx]"]
  node_auth["Authentication<br/>[AuthProvider.jsx]"]
  node_resumeui["Resume upload<br/>[ResumeUpload.jsx]"]
  node_interviewui["Voice interview"]
  node_speech["Speech utilities"]
  node_room["Interview room"]
  node_video["Video session<br/>[JitsiComponent.jsx]"]
  node_sessioncreate["Create interview"]
  node_results["Evaluation views"]
  node_roster["Interviewee roster"]
end

subgraph group_api["API and coordination"]
  node_express["HTTP API<br/>[index.js]"]
  node_pdf["PDF processing<br/>[pdfController.js]"]
  node_interviewapi["Interview proxy"]
  node_evaluationapi["Evaluation proxy"]
  node_invite["Email invitations"]
end

subgraph group_model["AI services"]
  node_modelapp["Model API<br/>[app.py]"]
  node_interviewmodel["Interview generation<br/>[interviewer.py]"]
  node_formatmodel["Resume formatting<br/>[resumeFormatter.py]"]
  node_evaluatormodel["Interview evaluation<br/>[evaluator.py]"]
end

subgraph group_data["Interview data"]
  node_persistence[("Interview records<br/>[createInterview.js]")]
  node_mongo[("MongoDB connection<br/>[mongoClient.js]")]
end

node_participant(("Participant"))
node_interviewer(("Interviewer"))
node_firebase{{"Firebase Auth"}}
node_emailservice{{"Email provider"}}

node_participant -->|"uses"| node_routing
node_interviewer -->|"uses"| node_routing
node_routing -->|"provides auth"| node_auth
node_auth -->|"authenticates with"| node_firebase
node_routing -->|"routes to"| node_resumeui
node_routing -->|"routes to"| node_interviewui
node_interviewui -->|"uses"| node_speech
node_routing -->|"routes to"| node_room
node_room -->|"renders"| node_video
node_routing -->|"routes to"| node_sessioncreate
node_routing -->|"routes to"| node_results
node_routing -->|"routes to"| node_roster
node_resumeui -.->|"uploads PDF"| node_express
node_interviewui -->|"requests interview"| node_express
node_interviewui -->|"uploads resume PDF"| node_express
node_express -->|"routes PDF upload"| node_pdf
node_express -->|"routes interview"| node_interviewapi
node_express -->|"routes evaluation"| node_evaluationapi
node_express -->|"routes invitations"| node_invite
node_pdf -->|"formats resume via"| node_modelapp
node_interviewapi -->|"forwards interview"| node_modelapp
node_evaluationapi -.->|"requests evaluation"| node_modelapp
node_modelapp -->|"dispatches to"| node_interviewmodel
node_modelapp -->|"dispatches to"| node_formatmodel
node_modelapp -->|"dispatches to"| node_evaluatormodel
node_invite -->|"sends invitation"| node_emailservice
node_express -.->|"routes record operations"| node_persistence
node_persistence -.->|"uses connection"| node_mongo
node_sessioncreate -.->|"creates session"| node_express
node_roster -.->|"loads interviewees"| node_express
node_results -.->|"loads evaluation"| node_express

click node_routing "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/main.jsx"
click node_auth "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/ContextProvider/AuthProvider.jsx"
click node_resumeui "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Pages/ResumeUpload.jsx"
click node_interviewui "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Pages/VoiceToTextAndSpeak.jsx"
click node_speech "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/CustomHook/useSpeechRecognition.js"
click node_room "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Layouts/ParentInterViewContainer.jsx"
click node_video "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/components/JitsiComponent.jsx"
click node_sessioncreate "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Pages/InterviewCallCreator.jsx"
click node_results "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Pages/MockInterviewResult.jsx"
click node_roster "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Pages/IntervieweesList.jsx"
click node_express "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/index.js"
click node_pdf "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/controllers/pdfController.js"
click node_interviewapi "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/controllers/interviewController.js"
click node_evaluationapi "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/controllers/evaluateController.js"
click node_invite "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/controllers/sendInterviewEmailController.js"
click node_modelapp "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/model/app.py"
click node_interviewmodel "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/model/llm_models/deepseek_v3_turbo/interviewer.py"
click node_formatmodel "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/model/llm_models/meta_llama_3_70B_Instruct/resumeFormatter.py"
click node_evaluatormodel "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/model/llm_models/deepseek_R1_0528/evaluator.py"
click node_persistence "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/db/createInterview.js"
click node_mongo "https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/db/mongoClient.js"

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_routing,node_auth,node_resumeui,node_interviewui,node_speech,node_room,node_video,node_sessioncreate,node_results,node_roster,node_interviewer toneBlue
class node_express,node_pdf,node_interviewapi,node_evaluationapi,node_invite toneAmber
class node_modelapp,node_interviewmodel,node_formatmodel,node_evaluatormodel toneMint
class node_persistence,node_mongo toneRose
class node_participant,node_firebase,node_emailservice toneIndigo
```

## Components

### Client workflows

- [App routing](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/main.jsx): `client/src/main.jsx`
- [Authentication](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/ContextProvider/AuthProvider.jsx): `client/src/ContextProvider/AuthProvider.jsx`
- [Resume upload](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Pages/ResumeUpload.jsx): `client/src/Pages/ResumeUpload.jsx`
- [Voice interview](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Pages/VoiceToTextAndSpeak.jsx): `client/src/Pages/VoiceToTextAndSpeak.jsx`
- [Speech utilities](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/CustomHook/useSpeechRecognition.js): `client/src/CustomHook/useSpeechRecognition.js`
- [Interview room](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Layouts/ParentInterViewContainer.jsx): `client/src/Layouts/ParentInterViewContainer.jsx`
- [Video session](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/components/JitsiComponent.jsx): `client/src/components/JitsiComponent.jsx`
- [Create interview](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Pages/InterviewCallCreator.jsx): `client/src/Pages/InterviewCallCreator.jsx`
- [Evaluation views](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Pages/MockInterviewResult.jsx): `client/src/Pages/MockInterviewResult.jsx`
- [Interviewee roster](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/client/src/Pages/IntervieweesList.jsx): `client/src/Pages/IntervieweesList.jsx`

### API and coordination

- [HTTP API](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/index.js): `server/index.js`
- [PDF processing](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/controllers/pdfController.js): `server/controllers/pdfController.js`
- [Interview proxy](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/controllers/interviewController.js): `server/controllers/interviewController.js`
- [Evaluation proxy](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/controllers/evaluateController.js): `server/controllers/evaluateController.js`
- [Email invitations](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/controllers/sendInterviewEmailController.js): `server/controllers/sendInterviewEmailController.js`

### AI services

- [Model API](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/model/app.py): `model/app.py`
- [Interview generation](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/model/llm_models/deepseek_v3_turbo/interviewer.py): `model/llm_models/deepseek_v3_turbo/interviewer.py`
- [Resume formatting](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/model/llm_models/meta_llama_3_70B_Instruct/resumeFormatter.py): `model/llm_models/meta_llama_3_70B_Instruct/resumeFormatter.py`
- [Interview evaluation](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/model/llm_models/deepseek_R1_0528/evaluator.py): `model/llm_models/deepseek_R1_0528/evaluator.py`

### Interview data

- [Interview records](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/db/createInterview.js): `server/db/createInterview.js`
- [MongoDB connection](https://github.com/timewithpotato/conversational-agentic-ai/blob/main/server/db/mongoClient.js): `server/db/mongoClient.js`

### Other components

- **Participant**
- **Interviewer**
- **Firebase Auth**
- **Email provider**

## Connections

- Participant → App routing: uses (evidence: `client/src/main.jsx`)
- Interviewer → App routing: uses (evidence: `client/src/main.jsx`)
- App routing → Authentication: provides auth (evidence: `client/src/main.jsx`)
- Authentication → Firebase Auth: authenticates with (evidence: `client/src/ContextProvider/AuthProvider.jsx`)
- App routing → Resume upload: routes to (evidence: `client/src/main.jsx`)
- App routing → Voice interview: routes to (evidence: `client/src/main.jsx`)
- Voice interview → Speech utilities: uses (evidence: `client/src/Pages/VoiceToTextAndSpeak.jsx`)
- App routing → Interview room: routes to (evidence: `client/src/main.jsx`)
- Interview room → Video session: renders (evidence: `client/src/Layouts/ParentInterViewContainer.jsx`)
- App routing → Create interview: routes to (evidence: `client/src/main.jsx`)
- App routing → Evaluation views: routes to (evidence: `client/src/main.jsx`)
- App routing → Interviewee roster: routes to (evidence: `client/src/main.jsx`)
- Resume upload → HTTP API: uploads PDF
- Voice interview → HTTP API: requests interview (evidence: `client/src/Pages/VoiceToTextAndSpeak.jsx`)
- Voice interview → HTTP API: uploads resume PDF (evidence: `client/src/Pages/VoiceToTextAndSpeak.jsx`)
- HTTP API → PDF processing: routes PDF upload (evidence: `server/index.js`)
- HTTP API → Interview proxy: routes interview (evidence: `server/index.js`)
- HTTP API → Evaluation proxy: routes evaluation (evidence: `server/index.js`)
- HTTP API → Email invitations: routes invitations (evidence: `server/index.js`)
- PDF processing → Model API: formats resume via (evidence: `server/controllers/pdfController.js`)
- Interview proxy → Model API: forwards interview (evidence: `server/controllers/interviewController.js`)
- Evaluation proxy → Model API: requests evaluation
- Model API → Interview generation: dispatches to (evidence: `model/app.py`)
- Model API → Resume formatting: dispatches to (evidence: `model/app.py`)
- Model API → Interview evaluation: dispatches to (evidence: `model/app.py`)
- Email invitations → Email provider: sends invitation (evidence: `server/controllers/sendInterviewEmailController.js`)
- HTTP API → Interview records: routes record operations
- Interview records → MongoDB connection: uses connection
- Create interview → HTTP API: creates session
- Interviewee roster → HTTP API: loads interviewees
- Evaluation views → HTTP API: loads evaluation
