Dr. Claw
Full-stack research workspace. From idea to paper with AI agents.
Predict suitable careers, find your skill gaps, match job descriptions and practise mock interviews based on your resume.
EducationPython · JavaScriptGitHub @sidvashisth2005OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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 |