IBM SkillsBuild Γ AICTE Internship 2026 β Problem Statement #22
"Don't just prepare for interviews β simulate them with AI."
- About ARIA
- Demo
- Features
- Architecture
- Tech Stack
- AI Tools Used in Building ARIA
- Installation
- Deployment
- Project Structure
- Token Optimisation
- Resume Feature
ARIA (AI Readiness Interview Agent) is an intelligent conversational agent that conducts full end-to-end mock interviews for job seekers targeting top IT companies like TCS, Infosys, Wipro, Accenture, and Cognizant.
Unlike generic Q&A tools, ARIA runs a complete structured interview across three rounds, scores every answer in real-time, adapts difficulty as you progress, and hands you a personalised Final Report Card with a 7-day study roadmap β all powered by Meta Llama 3.3 70B Instruct via IBM watsonx.ai.
Now with Resume-Aware Interviews β upload your PDF/DOCX resume once and ARIA will ask questions directly tied to your real projects, skills, and achievements.
| Feature | Description |
|---|---|
| π― Role-Based Questions | Tailored questions for any IT role and target company |
| π Resume-Aware Interviews | Upload your PDF/DOCX/TXT resume β ARIA asks about your real projects, skills & achievements |
| π Real-Time Evaluation | Score (X/10) + concise feedback after every answer |
| π‘ Confidence Tracking | Measures confidence growth from start to finish |
| π Adaptive Difficulty | Questions get progressively harder as you perform better |
| ποΈ Voice Input | Speak your answers using your microphone (Chrome/Edge) |
| π Final Report Card | Overall scores, top strengths, improvement areas + Resume Alignment score |
| πΊοΈ 7-Day Study Roadmap | Personalised preparation plan based on your performance |
| π¬ Multi-Turn Chat | Natural conversational interview flow β no forms or dropdowns |
| π’ Multi-Company Support | TCS, Infosys, Wipro, Accenture, Cognizant and more |
| β‘ Token-Optimised | Server-side session store β flat token cost regardless of interview length |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β User (Browser) β
β Chrome / Edge (voice input supported) β
βββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ
β Streamlit Frontend (app.py Β· :8501) β
β β
β β’ Chat UI β displays messages β
β β’ Voice widget β Web Speech API (browser-native STT) β
β β’ Resume uploader β PDF / DOCX / TXT (optional) β
β β’ Sends only: { session_id, message } β
β β³ NO conversation history in the HTTP body β
βββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β POST /chat { session_id, message }
β POST /session/new
β POST /resume/upload { session_id, file }
βββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ
β FastAPI Backend (main.py Β· :8000) β
β β
β β’ Server-side session store (_SESSIONS dict) β
β β³ { history: [...], resume_digest: str | None } β
β β’ Resume parser β PyMuPDF (PDF) + python-docx (DOCX) β
β β’ One-shot digest call β compact ~120-word summary β
β β’ History trimming + dynamic token budget β
β β’ ARIA system prompt engine (digest injected when set) β
β β’ Background model warmup at startup β
βββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ
β ibm-watsonx-ai SDK
βββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ
β IBM watsonx.ai β
β Meta Llama 3.3 70B Instruct β
β (Free Lite tier β Dallas region) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key design decision β server-side sessions: The frontend never sends conversation history. Only session_id + message travels over HTTP. The backend holds all history, trims it to a rolling window, and sends a fixed-size context to the LLM β keeping input token cost flat at every turn of the interview.
Resume design decision β one-shot digest: The raw resume is never stored or re-sent. One LLM call converts it to a ~120-word structured digest on upload. That digest (~130 tokens) is injected into the system prompt on every subsequent call β keeping the per-call overhead flat and the raw file off the wire entirely.
| Layer | Technology | Purpose |
|---|---|---|
| LLM | Meta Llama 3.3 70B Instruct | Interview agent brain β question generation, scoring, report card |
| LLM Platform | IBM watsonx.ai | Hosted inference, API access, token usage tracking |
| Backend | FastAPI + Uvicorn | REST API, session management, prompt engineering |
| Frontend | Streamlit | Chat UI, sidebar controls, real-time display |
| Voice Input | Browser Web Speech API | Microphone-to-text (zero external dependencies) |
| Resume Parsing | PyMuPDF + python-docx | Extract text from PDF and DOCX resumes |
| SDK | ibm-watsonx-ai | Official Python SDK for watsonx.ai model calls |
| Language | Python 3.10+ | Core language |
| HTTP Client | requests | Frontend β Backend API calls |
ARIA was built using a combination of human engineering and AI-assisted development:
| Tool | Role in This Project |
|---|---|
| IBM watsonx.ai | Hosts Meta Llama 3.3 70B β the LLM that powers ARIA's interview agent at runtime |
| IBM Bob (AI Software Engineer) | Used throughout development to architect, debug, and optimise the entire codebase β from designing the server-side session store and token budget system, to fixing prompt behaviour bugs, implementing the voice input feature, and writing all deployment configuration |
| Meta Llama 3.3 70B Instruct | The foundation model ARIA uses to conduct interviews, score answers, and generate report cards |
ARIA was designed and developed with IBM Bob as the primary engineering assistant β responsible for the full architecture, all code optimisations, the voice feature, and the token-reduction work that brought input cost from ~1,400 tokens/call down to ~505 tokens/call.
- Python 3.10+
- IBM Cloud account β free at cloud.ibm.com
- IBM watsonx.ai project + API key
- Chrome or Edge browser (for voice input)
# 1. Clone the repository
git clone https://github.com/yourusername/interview-trainer.git
cd interview-trainer
# 2. Create virtual environment
python -m venv ml
ml\Scripts\activate # Windows
source ml/bin/activate # Mac/Linux
# 3. Install dependencies
pip install -r requirements.txt
# If upgrading an existing install, add the two new resume packages:
pip install pymupdf==1.24.9 python-docx==1.1.2
# 4. Create .env from template
copy .env.example .env # Windows
cp .env.example .env # Mac/Linux
# Open .env and fill in your IBM credentialsIBM_API_KEY=your_ibm_cloud_api_key
WATSONX_PROJECT_ID=your_watsonx_project_id
WATSONX_URL=https://us-south.ml.cloud.ibm.comGet your credentials at:
- API Key β cloud.ibm.com/iam/apikeys
- Project ID β watsonx.ai dashboard β your project β Manage tab
Open two terminals (both with ml\Scripts\activate):
Terminal 1 β Backend:
uvicorn main:app --reloadβ
Wait for: Application startup complete.
Terminal 2 β Frontend:
streamlit run app.pyβ
Opens at http://localhost:8501
Open in Chrome or Edge for voice input support.
ARIA has two services β deploy them separately:
| Service | File | Recommended Platform |
|---|---|---|
| FastAPI backend | main.py |
Render (free) |
| Streamlit frontend | app.py |
Streamlit Community Cloud (free) |
- New Web Service β connect GitHub repo
- Build:
pip install -r requirements.txt - Start:
uvicorn main:app --host 0.0.0.0 --port $PORT - Add env vars:
IBM_API_KEY,WATSONX_PROJECT_ID,WATSONX_URL - Copy your service URL:
https://aria-api-xxxx.onrender.com
- New app β select repo β main file:
app.py - Settings β Secrets β add:
API_URL = "https://aria-api-xxxx.onrender.com"interview-trainer/
β
βββ main.py # FastAPI backend β ARIA agent, session store, resume upload, LLM calls
βββ app.py # Streamlit frontend β chat UI, voice input, resume uploader
βββ watsonx_client.py # Standalone IBM watsonx.ai smoke-test helper
βββ prompt_templates.py # Prompt builders β resume digest, interview questions, difficulty
βββ sample_prompts.py # Pre-written test conversations for 5 companies/roles
β
βββ good_interview.gif # Demo β high-scoring interview run
βββ bad_interview.gif # Demo β weak answers with ARIA's feedback
β
βββ requirements.txt # Python dependencies (pinned)
βββ Procfile # Process file for Render / Railway / Heroku
βββ .env.example # Credentials template β safe to commit
βββ .env # Your live credentials β NEVER commit this
βββ .gitignore # Excludes .env, ml/, videos, logs, uploaded resumes
βββ README.md # This file
ARIA was heavily optimised to stay within IBM watsonx.ai's free Lite tier limits.
| Metric | Before Optimisation | After Optimisation |
|---|---|---|
| Input tokens / call | ~1,400 | ~505 |
| History payload | Sent from browser (unbounded) | Held server-side (fixed window) |
| System prompt size | ~650 tokens | ~200 tokens |
| Truncation method | Character-count (inaccurate) | Word-count (token-accurate) |
| Output budget | 280 tokens (fixed) | 50 / 180 / 400 (dynamic per turn) |
| Full session cost | ~18,000 tokens | ~6,500 tokens |
| Sessions / month (free tier) | ~2β3 | ~7β8 |
Key changes: server-side session store, compressed system prompt, word-count truncation, dynamic output caps per interview phase, background model warmup at startup.
ARIA supports optional resume upload to personalise the interview with questions drawn from your actual experience.
| Step | What happens | Token cost |
|---|---|---|
| Upload PDF/DOCX/TXT | Text extracted server-side (PyMuPDF / python-docx) | 0 |
| Digest generation | ONE LLM call β ~120-word structured summary | ~650 input + ~150 output (once) |
| Per interview call | Digest injected into system prompt | +~130 tokens/call |
| Full session w/ resume | ~10,200 tokens total | ~4β5 sessions/month |
How it works:
- Click π Start New Interview β creates your session
- Upload your resume in the π Resume Upload sidebar section
- ARIA reads your Role, Experience, Skills, Projects, and Achievements from the digest
- Questions are drawn from both general interview knowledge AND your specific resume
- Final Report Card includes a Resume Alignment score β how well your answers matched your CV claims
Supported formats: PDF Β· DOCX Β· TXT (max ~5 pages recommended)
Resume is never stored β raw text is discarded after the digest is generated. Only the ~120-word summary is kept in memory for the session duration.
