interviewbot / README.md
sajith-0701's picture
add hf config
36e1e59
---
title: Interview Bot
emoji: 🤖
colorFrom: blue
colorTo: purple
sdk: docker
app_port: 7860
pinned: false
---
# Interview Bot - AI Mock Interview Trainer
An end-to-end AI-powered mock interview platform for students and job seekers.
Interview Bot combines resume intelligence, job-description alignment, adaptive questioning, speech interaction, and detailed post-interview evaluation in a single full-stack application.
The project includes:
- A FastAPI backend for auth, interview orchestration, speech services, analytics, and admin operations
- A Next.js frontend for student and admin workflows
- MongoDB Atlas for persistent records
- Redis for low-latency in-progress interview session state
- Gemini for resume parsing, follow-up generation, and final evaluation
---
## Table of Contents
1. [Problem Statement](#problem-statement)
2. [Project Overview](#project-overview)
3. [Key Features](#key-features)
4. [System Architecture](#system-architecture)
5. [Interview Engine Design](#interview-engine-design)
6. [Speech Pipeline](#speech-pipeline)
7. [Tech Stack](#tech-stack)
8. [Repository Structure](#repository-structure)
9. [Environment Configuration](#environment-configuration)
10. [Setup and Installation](#setup-and-installation)
11. [How to Run](#how-to-run)
12. [API Endpoints](#api-endpoints)
13. [Data Model](#data-model)
14. [Reliability and Resilience](#reliability-and-resilience)
15. [Troubleshooting](#troubleshooting)
16. [Deployment Notes](#deployment-notes)
17. [License](#license)
---
## Problem Statement
Most interview preparation tools are static and generic. They do not adapt to:
- A candidate's actual resume
- A specific target job description
- The quality and depth of previous answers
Interview Bot addresses this by generating dynamic, role-targeted interviews that adapt in real time and produce actionable feedback after completion.
---
## Project Overview
Interview Bot supports two interview modes:
1. Resume Interview
- Uses resume data + selected job description
- Creates personalized role-specific questions
- Applies adaptive follow-up logic per answer
2. Topic Interview
- Uses admin-published topics
- Supports optional timed interviews per topic
- Mixes topic bank questions with AI-generated follow-ups
The platform provides:
- Secure user authentication with JWT
- Resume upload and AI parsing
- AI-recommended role suggestions
- Resume-vs-job-description alignment checks
- Real-time interview state management via Redis queues
- Voice-enabled interviewing (TTS + STT)
- Detailed interview reports with per-question scoring
- Admin dashboards for analytics, content management, and user oversight
---
## Key Features
### Student Features
- Signup and login flow
- Resume upload (PDF/DOCX/TXT) and structured parsing
- Skill extraction and manual skill editing
- AI recommended role list from resume
- Personal job description management (create/update/delete)
- Pre-interview JD compatibility check
- Resume interview and topic interview modes
- Optional speech interaction:
- Backend TTS question playback
- Backend STT answer transcription
- Editable transcript before final submit
- Report history and detailed report views
### Admin Features
- Role CRUD and requirement management
- Topic CRUD and publish/hide controls
- Optional per-topic timer configuration
- Resume/topic question CRUD
- Bulk question import from PDF using Gemini extraction
- Job description management across users
- User management (student deletion with related data cleanup)
- Analytics dashboard:
- Total students
- Live users
- New users today
- Average scores
- Top performers
- Common weak areas
- Quit interview monitoring and report auditing
---
## System Architecture
The platform is split into frontend and backend layers with AI and data services:
```mermaid
flowchart LR
A[Next.js Frontend] --> B[FastAPI Backend]
B --> C[MongoDB Atlas]
B --> D[Redis]
B --> E[Gemini API]
B --> F[Speech Models: XTTS + Whisper]
```
### High-Level Runtime Flow
```mermaid
flowchart TD
U[User Login] --> R[Upload Resume]
R --> P[Resume Parsing via Gemini]
P --> S[Skills + Recommended Roles Saved]
S --> J[Select Job Description]
J --> V[Optional Resume-JD Verification]
V --> I[Start Interview]
I --> Q[Redis Queue Orchestration]
Q --> A1[Answer Submission]
A1 --> F1[Adaptive Follow-up Generation]
F1 --> Q
Q --> C{Interview Complete?}
C -- No --> A1
C -- Yes --> E1[Final Evaluation via Gemini]
E1 --> M[Report Stored in MongoDB]
M --> UI[Report UI and Analytics]
```
---
## Interview Engine Design
Core orchestration lives in backend services and uses:
- Redis question queues and backlog lists
- LangGraph state flow for question generation
- Gemini for AI follow-up generation and final scoring
- Deterministic fallback questions when AI output is unavailable
### Resume Interview Flow
- Requires a resume and selected job description
- Starts with a personalized intro question
- Seeds an initial AI question batch in background
- Maintains max 10 questions by default
- Stores answers immediately and processes follow-up generation asynchronously
Queue-first strategy:
- `question_queue` keeps the next questions ready for low-latency response
- `question_backlog` stores overflow to avoid generation stalls
- Deduplication prevents repeated or near-duplicate questions
### Topic Interview Flow
- Requires a published topic
- Starts with DB topic question bank
- After initial stage, generates additional follow-ups
- Maintains max 10 questions
- Supports optional timer (configured per topic by admin)
### Follow-up Diversity Policy
Resume mode prevents repetitive drilling on the same skill/topic:
- Up to 2 consecutive same-topic follow-ups are allowed
- A third consecutive same-topic follow-up is allowed only when follow-up need score >= 95
- Otherwise, the system switches to an alternate focus skill
### Evaluation and Completion
- Per-answer evaluation can run in background while interview continues
- Final report is generated at completion (or partial report on quit if answers exist)
- Redis session data is cleaned after final report generation
---
## Speech Pipeline
Speech features are backend-powered for consistency across browsers:
### Text-to-Speech (TTS)
- Uses Coqui XTTS (`xtts_v2`) with warmup on startup
- Uses voice presets by gender (`female`, `male`, `auto`)
- Includes fallback synthesis models if XTTS fails transiently
- Audio caching improves repeat playback latency
### Speech-to-Text (STT)
- Uses `faster-whisper`
- Handles CUDA runtime issues and falls back to CPU automatically
- Returns transcription text + latency metrics
### UX Safeguards
- Spoken text normalization strips prefixes like `Question 3:` before playback
- Candidate can edit transcript before submission
- Frontend prefetches upcoming question audio where possible
---
## Tech Stack
### Backend
- FastAPI
- Uvicorn
- Motor (MongoDB async)
- redis-py asyncio client
- Pydantic + pydantic-settings
- python-jose + passlib + bcrypt
- Google Gemini (`google-genai`)
- LangGraph + LangChain Core
- Coqui TTS + faster-whisper
- pypdf + python-docx
### Frontend
- Next.js 16 (App Router)
- React 19 + TypeScript
- Tailwind CSS v4
- Axios
- React Query
- Framer Motion
- Sonner notifications
- Lucide icons
---
## Repository Structure
```text
interview-bot/
|- backend/
| |- main.py
| |- config.py
| |- database.py
| |- auth/
| |- routers/
| |- schemas/
| |- services/
| |- utils/
| |- models/
| |- uploads/
| |- requirements.txt
| |- Dockerfile
|- frontend/
| |- src/
| | |- app/
| | |- components/
| | |- lib/
| | |- types/
| |- public/
| |- package.json
|- README.md
|- LICENSE
|- WORKFLOW.md
|- LANGGRAPH_AND_TOOLS.md
```
---
## Environment Configuration
Create and configure environment files before running.
### Backend: `backend/.env`
```env
# App
APP_ENV=development
APP_HOST=0.0.0.0
APP_PORT=8000
# Gemini
GEMINI_API_KEY=your_gemini_api_key
GEMINI_MODEL=gemini-2.5-flash
GEMINI_FALLBACK_MODELS=gemini-2.0-flash,gemini-2.0-flash-lite,gemini-flash-latest
# MongoDB (cloud only)
MONGO_URI=mongodb+srv://<user>:<password>@<cluster>/<db>?retryWrites=true&w=majority
MONGO_DB_NAME=interview_bot
# Redis (cloud URL)
REDIS_URL=rediss://:<password>@<host>:<port>
# JWT
JWT_SECRET=replace_with_strong_secret
JWT_ALGORITHM=HS256
JWT_EXPIRY=3600
# File storage
UPLOAD_DIR=./uploads
# Speech
COQUI_TOS_AGREED=1
XTTS_USE_GPU=auto
WHISPER_DEVICE=auto
```
Important validation rules in backend config:
- `MONGO_URI` must use `mongodb+srv://` and must not be localhost
- `REDIS_URL` must use `redis://` or `rediss://` and must not be localhost
### Frontend: `frontend/.env.local`
```env
NEXT_PUBLIC_API_URL=http://127.0.0.1:8000
```
---
## Setup and Installation
### Prerequisites
- Python 3.10+
- Node.js 18+
- npm
- MongoDB Atlas instance
- Cloud Redis instance
- Gemini API key
### 1) Clone Repository
```bash
git clone <your-repo-url>
cd interview-bot
```
### 2) Backend Setup
```bash
cd backend
python -m venv ../inter
..\inter\Scripts\activate
pip install -r requirements.txt
```
Linux/macOS equivalent:
```bash
python -m venv inter
source inter/bin/activate
pip install -r backend/requirements.txt
```
### 3) Frontend Setup
```bash
cd ../frontend
npm install
```
---
## How to Run
### Start Backend API
From `backend/` directory:
```bash
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
```
Backend endpoints:
- API root health: `http://localhost:8000/health`
- Swagger docs: `http://localhost:8000/docs`
### Start Frontend
From `frontend/` directory:
```bash
npm run dev
```
Frontend app: `http://localhost:3000`
### First Run Checklist
1. Register a user account
2. Upload resume in Settings
3. Add at least one Job Description
4. Start Resume Interview from Dashboard or Bot's Help
5. Complete interview and open Reports
---
## API Endpoints
All secured endpoints require `Authorization: Bearer <token>`.
### Health
| Method | Path | Description |
|---|---|---|
| GET | `/health` | Service health check |
### Authentication
| Method | Path | Description |
|---|---|---|
| POST | `/auth/signup` | Register user |
| POST | `/auth/login` | Login and receive JWT |
Note: By default, emails ending with `@admin.com` are created with admin role.
### Resume
| Method | Path | Description |
|---|---|---|
| POST | `/resume/upload` | Upload and parse resume |
### Profile
| Method | Path | Description |
|---|---|---|
| GET | `/profile` | Get profile, resume, skills |
| PUT | `/profile/speech-settings` | Update voice preference |
| PUT | `/profile/skills` | Update user skill list |
| PUT | `/profile/resume-data` | Update structured resume fields |
| GET | `/profile/job-descriptions` | List user's JDs |
| POST | `/profile/job-descriptions` | Create JD |
| PUT | `/profile/job-descriptions/{jd_id}` | Update JD |
| DELETE | `/profile/job-descriptions/{jd_id}` | Delete JD |
### Interview
| Method | Path | Description |
|---|---|---|
| POST | `/interview/start` | Start interview session |
| POST | `/interview/start_interview` | Compatibility alias for start |
| POST | `/interview/verify` | Resume-vs-JD verification |
| POST | `/interview/answer` | Submit answer and get next question |
| POST | `/interview/submit_answer` | Compatibility alias for answer |
| GET | `/interview/next_question` | Peek next queued question |
| POST | `/interview/quit` | Quit interview; optional partial report |
| GET | `/interview/report` | Generate/get report |
| GET | `/interview/latency` | Latency summary (p50/p95) |
| POST | `/interview/latency/reset` | Reset latency metrics |
### Reports
| Method | Path | Description |
|---|---|---|
| GET | `/reports/history` | Student report history |
### Speech
| Method | Path | Description |
|---|---|---|
| GET | `/speech/health` | Speech service health |
| POST | `/speech/warmup` | Warm TTS/STT models |
| POST | `/speech/synthesize` | Convert text to WAV |
| POST | `/speech/transcribe` | Transcribe uploaded audio |
### Admin (selected)
| Method | Path | Description |
|---|---|---|
| GET/POST/PUT/DELETE | `/admin/roles` (+ `/{id}`) | Role management |
| GET/POST/PUT/DELETE | `/admin/questions` (+ `/{id}`) | Question management |
| POST | `/admin/questions/upload` | Import questions from PDF |
| GET/POST/PUT/DELETE | `/admin/topics` (+ `/{id}`) | Topic management |
| PUT | `/admin/topics/{topic_id}/publish` | Publish/hide topic + timer |
| GET/POST/DELETE | `/admin/requirements` | Role requirement management |
| GET | `/admin/analytics` | Admin dashboard analytics |
| GET | `/admin/quit-interviews` | Quit interview details |
| GET | `/admin/reports` | Report summaries |
| GET | `/admin/reports/{session_id}` | Report detail |
| GET | `/admin/users` | Student list |
| DELETE | `/admin/users/{user_id}` | Delete student and linked data |
| GET/POST/PUT/DELETE | `/admin/job-descriptions` | Admin JD management |
---
## Data Model
Primary MongoDB collections:
- `users`
- `resumes`
- `skills`
- `job_roles`
- `job_descriptions`
- `jd_verifications`
- `role_requirements`
- `questions`
- `topics`
- `topic_questions`
- `sessions`
- `answers`
- `results`
Redis stores in-progress interview state with TTL, including:
- Session metadata
- Question queue/backlog
- Asked question fingerprints
- Q/A hashes
- Context cache
---
## Reliability and Resilience
This project includes multiple runtime safeguards:
- Gemini model fallback chain for transient provider failures
- Retry logic for 503/high-demand conditions
- Loose JSON extraction/parsing to recover from malformed model output
- Deterministic fallback question templates when AI output is empty/duplicate
- Question deduplication using normalized fingerprinting
- Queue/backlog buffering to avoid blocking next question delivery
- Placeholder report detection and regeneration logic
- Report generation fallback from MongoDB answers when Redis session data is unavailable
- TTS and STT warmup with graceful fallback paths
- STT automatic CPU fallback on CUDA runtime issues
---
## Troubleshooting
### 1) Login fails despite valid credentials
Symptom:
- Frontend shows auth error even though credentials are correct.
Likely cause:
- Frontend cannot reach backend API.
Fix:
1. Ensure backend is running on the configured host/port.
2. Verify `frontend/.env.local`:
- `NEXT_PUBLIC_API_URL=http://127.0.0.1:8000`
3. Restart frontend after changing env.
### 2) Resume interview start fails
Check:
- Resume is uploaded
- Job Description is selected
- Job Description includes `required_skills`
### 3) No recommended roles in Start Interview dropdown
Check:
- Resume parsing succeeded
- `recommended_roles` exists in profile resume parsed data
If missing, re-upload resume from Settings.
### 4) Speech is slow on first request
Use:
- `POST /speech/warmup` after login
The frontend also warms speech automatically, but manual warmup helps during diagnostics.
### 5) Mongo/Redis config validation errors at startup
Ensure:
- Mongo uses `mongodb+srv://`
- Redis uses `redis://` or `rediss://`
- Neither uses localhost in current backend validation rules
### 6) CUDA errors during transcription
The service automatically falls back to CPU. Transcription will continue but can be slower.
---
## Deployment Notes
- Backend includes a Dockerfile (`backend/Dockerfile`)
- Configure production secrets via environment variables
- Use strong JWT secret in production
- Restrict CORS origins for production deployments
- Ensure cloud MongoDB/Redis endpoints are reachable from deployment network
Example backend container run:
```bash
cd backend
docker build -t interview-bot-backend .
docker run -p 8000:8000 --env-file .env interview-bot-backend
```
---
## License
This project is licensed under the MIT License.
See [LICENSE](LICENSE) for details.