尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A web app that reads your resume and helps you choose and prepare for a career.
Core features
Extra features
It runs fully offline. If you add a Gemini API key (or an Anthropic key), the AI writes personalised interview questions from your resume, grades answers against a rubric and tailors your resume to job descriptions.
git clone https://github.com/sidvashisth2005/AI-Based-Career-Prediction.git
cd AI-Based-Career-Prediction
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
uvicorn app.main:app --reload
Open http://localhost:8000. To try it quickly, upload samples/sample_resume.pdf (or .txt), and on the Job match step paste samples/sample_job_description.txt.
The trained model ships in models/career_model.npz. If you change the careers or skills in app/data/, the app retrains it automatically (about 2 seconds), or you can run python -m scripts.train_model and commit the new file.
cp .env.example .env # Windows: copy .env.example .env
.env and replace the placeholder on this line with your key:
GEMINI_API_KEY=paste-your-gemini-api-key-here
The default model is gemini-flash-latest, which always points to Google's newest Flash model. To pin a specific model, set GEMINI_MODEL in .env. Claude is also supported: set ANTHROPIC_API_KEY, and use LLM_PROVIDER=claude if both keys are present (Gemini is preferred by default).
If an AI call fails (wrong key, no internet, quota exceeded), the app falls back to the offline engine for that step and shows the reason, so an interview never breaks halfway through. .env is in .gitignore, so your key is never committed.
The app is ready for Vercel. pyproject.toml tells Vercel the entrypoint (app.main:app), and the web UI in public/ is served from Vercel's CDN.
GEMINI_API_KEY with your key. Vercel does not read your local .env file.https://<your-app>.vercel.app/api/health: it should return "status": "ok", and "ai": {"provider": "gemini", ...} if the key is set.Notes for serverless hosting, already handled in the code:
/tmp. (Writing the model file to disk is what caused the earlier 500 FUNCTION_INVOCATION_FAILED.)To check every service of a deployment, run the smoke test from your computer (it uses only Python's standard library):
python -m scripts.smoke_test https://<your-app>.vercel.app
It uploads the sample resume (TXT and PDF), then runs prediction, skill gap, what-if, job match, a full mock interview, the web UI and input validation, and prints PASS/FAIL for each. It also reports whether Gemini is connected, or why it fell back to offline mode.
If a deployment still fails, open the deployment in Vercel, go to Logs and look for the Python traceback. If AI requests time out (HTTP 504), raise the function's maximum duration in the Vercel project settings.
docker build -t career-ai .
docker run -p 8000:8000 --env-file .env career-ai
Resume (PDF/DOCX/TXT) ──► resume_parser ──► skills, education, experience, projects
│
Manual skills + interests ──────┤
▼
┌──────────────────────┐
│ predictor │ ML model (logistic regression)
│ fit = skill match │ + weighted skill coverage
│ + ML confidence │ + interest overlap
│ + interests │
└──────────┬───────────┘
▼
gap_analyzer (per field) ──► readiness, missing skills, roadmap
▼
interview engine ──► questions (Claude or question bank) ──► scoring ──► report
| Component | File | Details |
|---|---|---|
| Knowledge base | app/data/careers.json, skills.json, questions.json | 24 careers with weighted core requirements (including "any of" groups such as a backend language), 121 skills with aliases, learning time and resources, and about 130 interview questions with key points and model answers |
| Skill extraction | app/skill_extractor.py | Alias matching with token boundaries, so JavaScript does not count as Java, TF-IDF does not count as TensorFlow, and R&D does not count as R |
| Resume parsing | app/resume_parser.py | Reads PDFs with pdfplumber (pypdf as a fallback), DOCX with python-docx; detects sections, education level, years of experience and project titles |
| Prediction model | app/predictor.py | Multinomial logistic (softmax) regression in NumPy over a multi-hot vector of skills and interests, trained on 9,600 synthetic profiles sampled from the knowledge base. Holdout accuracy is about 93% top-1 and 99% top-3 |
| Fit score | app/predictor.py | 55% weighted skill coverage + 25% ML confidence + 20% interest match. Without interests it is 65% / 35%. Each match shows its reasons |
| Gap analysis | app/gap_analyzer.py | Ranks missing skills by priority, recommends the quickest option for "any of" requirements, and builds a phased roadmap with time estimates |
| Interview | app/interview/ | offline.py plans questions and scores answers by key-point coverage, depth and structure (STAR for behavioral), capping off-topic answers. llm.py calls Gemini or Claude with JSON-schema structured outputs. engine.py handles sessions and the report |
| Job match | app/job_match.py | Compares job skills and repeated job keywords with the resume (70% / 30%), flags experience and degree gaps, and runs the career model on the job's skills to name the role |
| Resume health | app/resume_quality.py | Ten weighted checks for ATS-friendliness and recruiter best practices |
| Web UI | public/ |
The model is trained on synthetic profiles because there is no public dataset that links skills to careers in this taxonomy. If you collect real, anonymised data from users (skills, interests and the career they chose), you can replace generate_dataset() in app/predictor.py with it and retrain. The knowledge base is plain JSON, so you can add careers or skills without touching code. A test checks that every skill a career references exists.
Interactive docs are at http://localhost:8000/docs.
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /api/health | Status, interview engine, model metrics |
| GET | /api/meta | Skill list, interests and careers (for forms) |
| GET | /api/careers, /api/careers/{id} | Career catalogue |
| POST | /api/resume/parse | multipart file (PDF/DOCX/TXT) or form text → parsed profile |
| POST | /api/predict | {skills, interests, experience_years} → suited fields and all fields |
| POST | /api/gap | {career_id, skills, experience_years} → gap report and roadmap |
| POST | /api/interview/start | {career_id, profile, num_questions, difficulty} → first question |
| POST | /api/interview/{id}/answer | {answer} → evaluation and next question |
| GET | /api/interview/{id}/report | Final interview report |
| POST | /api/jobmatch | {job_description, resume_text, skills, use_ai} → ATS match, gaps and AI tailoring |
| POST | /api/speak | {text, voice} → WAV audio of the interviewer's voice (Gemini) |
| POST | /api/transcribe | multipart file (WAV) → {text}; dictation fallback (Gemini) |
| POST | /api/whatif | {career_id, skills, add_skills} → readiness and ranking before and after learning |
Example:
curl -s localhost:8000/api/predict -H 'Content-Type: application/json' \
-d '{"skills":["python","sql","machine learning","pandas"],"interests":["data"]}'
pip install -r requirements-dev.txt
pytest
# against a running server (local or deployed):
python -m scripts.smoke_test http://localhost:8000
The tests cover the knowledge base, skill extraction and its false-positive cases, resume parsing (TXT, DOCX and a real PDF), prediction quality, gap analysis, the interview flow and scoring, resume health, job matching, the what-if simulator, all API endpoints, and both AI integrations. The Gemini and Claude tests run against mocked HTTP transports, so no key or network is needed.
| Variable | Default | Meaning |
|---|---|---|
GEMINI_API_KEY | placeholder | Turns on the AI interviewer and resume tailoring with Gemini |
GEMINI_MODEL | gemini-flash-latest | Gemini model for questions, grading, tailoring and transcription |
GEMINI_TTS_MODEL | gemini-3.1-flash-tts-preview | Gemini text-to-speech model for the interviewer's voice (falls back to gemini-2.5-flash-preview-tts, then to the browser's voice) |
GEMINI_TTS_VOICE | Sulafat | Default interviewer voice; users can pick another in the interview settings |
ANTHROPIC_API_KEY | placeholder | Alternative provider: Claude |
CLAUDE_MODEL | claude-opus-5-5 | Claude model |
CLAUDE_EFFORT | medium | low, medium or high |
LLM_PROVIDER | auto | auto (Gemini, then Claude, then offline), gemini, claude or off |
LLM_TIMEOUT_SECONDS | 120 | Timeout for each AI call |
MAX_UPLOAD_MB | 4 | Resume upload limit (keep it under 4.5 on Vercel) |
SESSION_TTL_MINUTES | 120 | How long interview sessions are kept |
app/
main.py FastAPI app and routes
config.py Environment settings
knowledge.py Loads the JSON knowledge base
skill_extractor.py Skill detection and normalisation
resume_parser.py PDF/DOCX/TXT → profile
resume_quality.py Resume health score
job_match.py Job description match (ATS check)
predictor.py ML model and fit scoring
gap_analyzer.py Skill gap and roadmap
interview/ offline.py, llm.py, engine.py
data/ careers.json, skills.json, questions.json
public/ index.html, styles.css, app.js (served by Vercel's CDN or by FastAPI)
models/ career_model.npz (trained weights, about 15 KB)
scripts/train_model.py
pyproject.toml dependencies and the Vercel entrypoint
samples/ sample resume (PDF + TXT) and job description
tests/
| "Career Compass": plain HTML, CSS and JS with no build step. Navy-and-neutral palette (WCAG AA contrast), IBM Plex Sans, light and dark mode, works on phones |