Hire-ai/README.md
2026-10-08 02:50:35 +05:30

298 lines
No EOL
9.7 KiB
Markdown

# HireAI
HireAI is an AI-powered hiring workspace for preparing and managing technical
interviews. Recruiters can sign in with Google, define a role, upload and parse
candidate resumes, generate tailored interview questions with Google Gemini,
schedule interviews, and look up the pronunciation of technical terms.
The repository contains:
- **Frontend:** Vue 3 and Vite single-page application.
- **Backend:** FastAPI application with asynchronous MongoDB access.
- **File storage:** MongoDB GridFS for original resume files.
- **Authentication:** Google OAuth 2.0 with stateless JWT sessions.
- **AI features:** Google Gemini for interview-question and pronunciation
generation.
## Features
- Google sign-in and protected application routes.
- Resume upload for PDF and DOC/DOCX files up to 10 MB.
- Resume text and metadata extraction using PyMuPDF and `python-docx`.
- Job/interview requirement management, including mandatory and nice-to-have
skills.
- AI-generated interview questions based on a resume, role, skills, experience,
and projects.
- Interview scheduling with optional meeting links and email notifications.
- Technical-term pronunciation search, cached in MongoDB, plus a word of the
day.
- Swagger/OpenAPI documentation at `/docs` and ReDoc at `/redoc`.
## Technology stack
### Frontend
- Vue 3
- Vue Router 4
- Axios
- Vite
### Backend
- Python 3.10+ (Python 3.13 is supported by the current development setup)
- FastAPI
- Uvicorn
- Motor/PyMongo
- Pydantic Settings
- PyMuPDF
- `python-docx`
- `python-jose`
- `fastapi-mail`
- Google GenAI SDK
### Services
- MongoDB (required)
- Google Cloud OAuth 2.0 credentials (required for sign-in)
- Google Gemini API key (required for AI generation)
- SMTP server (required only for interview email delivery)
## Repository structure
```text
.
├── backend/
│ ├── app/
│ │ ├── models/ # Pydantic request/response models
│ │ ├── routers/ # Authentication and feature API routes
│ │ └── services/ # Email, Gemini, and resume parsing services
│ ├── main.py # FastAPI application entry point
│ └── requirements.txt
├── frontend/
│ ├── public/ # Static assets and favicon
│ ├── src/
│ │ ├── api/ # Axios client
│ │ ├── components/ # Shared navigation and footer
│ │ ├── composables/ # Shared auth and toast state
│ │ ├── router/ # Vue Router and auth guard
│ │ └── views/ # Application screens
│ ├── package.json
│ └── vite.config.js
└── README.md
```
## Prerequisites
Install the following before starting:
1. Python 3.10 or newer.
2. Node.js 18 or newer and npm.
3. A running MongoDB instance, either local or MongoDB Atlas.
4. A Google Cloud OAuth client configured as a **Web application**.
5. A Google Gemini API key.
6. An SMTP account if scheduled interview emails should be sent.
## Configuration
### Backend environment variables
Create `backend/.env` with the following values. The backend loads this file
through `pydantic-settings`; do not commit it.
```dotenv
# Google OAuth
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
# JWT
JWT_SECRET=replace-with-a-long-random-secret
JWT_ALGORITHM=HS256
JWT_EXPIRE_HOURS=168
# MongoDB
MONGODB_URI=mongodb://localhost:27017
MONGODB_DB=hireai
# Google Gemini
GEMINI_API_KEY=your-gemini-api-key
# Application URLs
FRONTEND_URL=http://localhost:5173
BACKEND_URL=http://localhost:8000
# SMTP (optional during local development)
MAIL_USERNAME=your-smtp-username
MAIL_PASSWORD=your-smtp-password
MAIL_FROM=your-sender@example.com
MAIL_SERVER=smtp.gmail.com
MAIL_PORT=587
MAIL_TLS=true
MAIL_SSL=false
```
For local Google OAuth development, add this authorized redirect URI to the
Google Cloud OAuth client:
```text
http://localhost:8000/api/auth/google/callback
```
The frontend currently uses `http://localhost:8000` as its API origin. If the
backend runs elsewhere, update the base URL in
[`frontend/src/api/index.js`](frontend/src/api/index.js) and the Google login
redirect in [`frontend/src/composables/useAuth.js`](frontend/src/composables/useAuth.js).
## Local development
### 1. Start MongoDB
Start MongoDB locally or provide a MongoDB Atlas connection string through
`MONGODB_URI`. The backend verifies the connection during application startup.
### 2. Install and start the backend
From PowerShell:
```powershell
cd backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -r requirements.txt
python -m uvicorn main:app --reload --host 0.0.0.0 --port 8000
```
The API is available at <http://localhost:8000>. Verify it with:
- Health check: <http://localhost:8000/health>
- Swagger UI: <http://localhost:8000/docs>
- ReDoc: <http://localhost:8000/redoc>
If PowerShell execution policy prevents activation, run the Uvicorn command
with the virtual-environment interpreter instead:
```powershell
.\.venv\Scripts\python.exe -m uvicorn main:app --reload --host 0.0.0.0 --port 8000
```
### 3. Install and start the frontend
In a second terminal:
```powershell
cd frontend
npm install
npm run dev
```
Open <http://localhost:5173>.
For a production-like frontend build:
```powershell
npm run build
npm run preview
```
## Typical user flow
1. Open the frontend and sign in with Google.
2. Create interview requirements for a role.
3. Upload a candidate resume from the Resume page.
4. Select the resume and requirement set on the Questions page.
5. Generate tailored interview questions with Gemini.
6. Schedule an interview and optionally provide a meeting link.
7. Use the Pronunciation page to prepare for unfamiliar technical terms.
## API overview
All protected endpoints use the JWT created by the Google OAuth callback. The
frontend stores the token in `localStorage` under `hireai_token` and sends it
as a Bearer token through the Axios client.
| Area | Method | Endpoint | Authentication |
| --- | --- | --- | --- |
| Auth | GET | `/api/auth/google/login` | Public |
| Auth | GET | `/api/auth/google/callback` | OAuth callback |
| Auth | GET | `/api/auth/me` | Required |
| Auth | POST | `/api/auth/logout` | Public/stateless |
| Resumes | POST | `/api/resume/upload` | Required |
| Resumes | GET | `/api/resume/` | Required |
| Resumes | GET | `/api/resume/{resume_id}` | Required |
| Resumes | GET | `/api/resume/{resume_id}/download` | Required |
| Resumes | DELETE | `/api/resume/{resume_id}` | Required |
| Requirements | POST | `/api/requirements/` | Required |
| Requirements | GET | `/api/requirements/` | Required |
| Requirements | GET/PUT/DELETE | `/api/requirements/{req_id}` | Required |
| Questions | POST | `/api/questions/generate` | Required |
| Questions | GET | `/api/questions/{resume_id}` | Required |
| Schedule | POST | `/api/schedule/` | Required |
| Schedule | GET | `/api/schedule/` | Required |
| Schedule | GET | `/api/schedule/{sched_id}` | Required |
| Schedule | PUT | `/api/schedule/{sched_id}/status` | Required |
| Schedule | DELETE | `/api/schedule/{sched_id}` | Required |
| Pronunciation | GET | `/api/pronunciation/tech-terms` | Public |
| Pronunciation | GET | `/api/pronunciation/word-of-the-day` | Public |
| Pronunciation | GET | `/api/pronunciation/{word}` | Public |
The interactive OpenAPI documentation at `/docs` is the authoritative source
for request and response schemas.
## Data and storage
MongoDB collections are created and used as needed by the application:
- `users` — Google profile and login timestamps.
- `resumes` — parsed resume metadata and extracted content.
- `requirements` — role requirements owned by a user.
- `questions` — generated question sets associated with a resume and role.
- `schedules` — scheduled interviews owned by a user.
- `pronunciations` — cached technical-term pronunciation results.
- `resumes.files` and `resumes.chunks` — GridFS storage for original files.
The application does not include database migrations or seed scripts. Back up
MongoDB, including the GridFS collections, before deleting or replacing data.
## Development notes
- Run the backend from the `backend` directory so `main:app` and the `app`
package resolve correctly.
- Keep Google, Gemini, JWT, SMTP, and MongoDB credentials in environment files
or a secret manager.
- The backend allows the configured `FRONTEND_URL` and
`http://localhost:5173` through CORS.
- Uploaded resumes are restricted to PDF/DOC/DOCX content types and 10 MB.
- The frontend has no automated test script configured in `package.json`.
Use `npm run build` as the available frontend verification command.
- The backend currently has no test suite or test command in the repository.
## Troubleshooting
### MongoDB connection errors
Confirm MongoDB is running and that `MONGODB_URI` points to the correct
instance. The API will not complete startup until its initial MongoDB ping
succeeds.
### Google OAuth redirect errors
Make sure the authorized redirect URI exactly matches
`BACKEND_URL/api/auth/google/callback`, and that `GOOGLE_CLIENT_ID`,
`GOOGLE_CLIENT_SECRET`, `FRONTEND_URL`, and `BACKEND_URL` agree with the URLs
used to start both applications.
### AI generation failures
Confirm `GEMINI_API_KEY` is present and available to the backend process. Check
the FastAPI terminal output and `/docs` response body for the returned error.
### Interview email failures
Verify the SMTP credentials and sender settings. Scheduling is persisted in
MongoDB before the email notification is attempted, so an email configuration
problem does not remove the scheduled interview.
## License
No license file is currently included in this repository. Add a license before
distributing the project publicly.