Inspiration

Interview prep tools haven't kept up with what interviews actually feel like. Question banks are static — they don't know what you got wrong last time, they're text-only when real interviews are spoken under pressure, and they never ask about the actual projects on your resume. We wanted a mock interviewer that behaves more like a real one: listens, grades what you actually said, and gets harder exactly where you're weak.

What it does

Viva runs three interview modes through voice: Fundamentals (closed-form CS questions with difficulty that adapts to your running mastery score), Scenario (open-ended system-design questions graded against a per-question checklist rubric), and Your Projects (questions generated from your own resume/project docs via RAG — no two candidates get the same session). Every spoken answer is transcribed live, scored by an LLM evaluator against a real rubric, and the resulting score updates an exponential-moving-average mastery tracker that decides the next question's topic and difficulty — all without a human ever grading anything.

How we built it

Three independently-built backend modules connected only by fixed function signatures, so each teammate could work without touching the others' code: Part A (Whisper speech-to-text, resume/project ingestion and RAG retrieval), Part B (SQLite-backed mastery tracking, EMA difficulty math, session persistence), and Part C (the Interviewer and Evaluator agents, FastAPI routes wiring the other two together).

The Evaluator is deliberately narrow: the LLM only ever makes coarse, checklist-style judgments (a boolean per criterion, never a numeric score) via strict JSON-schema structured output — the actual 0–1 score fed into mastery tracking is computed deterministically in Python from points earned vs. possible. That split exists because LLMs are unreliable at fine-grained numeric scoring but genuinely good at binary judgment calls, and keeping the arithmetic out of the model's hands makes scores reproducible and auditable.

The LLM layer itself is provider-swappable — Mistral, Groq, or Moonshot's Kimi behind one interface, switched with a single environment variable, so development ran on free tiers while the team saved paid Kimi credits for the actual hackathon window.

Challenges we ran into A model we built against got deprecated mid-hackathon. Groq discontinued the Kimi model our dev setup depended on; the fix (openai/gpt-oss-120b) meant also handling a completely different reasoning-effort API. Strict schema requirements weren't obvious upfront. Groq's structured-output mode rejects any JSON schema missing additionalProperties: false on every nested object — Pydantic doesn't set that by default, so we wrote a recursive schema patcher rather than hand-maintaining schemas. A silent contract mismatch would have broken the whole integration. Part C was built against a "project" mode string; Part B's real implementation only accepted "your-projects". An integration test one teammate wrote caught this — and also revealed the session-persistence design needed to change from a single batched save to start_session() → add_qa() per turn → end_session(). Accomplishments that we're proud of

Getting all three independently-built parts to pass a real integration test on the first true end-to-end run — including the adaptive-difficulty math moving correctly off real (not mocked) database state — with zero shared code between teammates beyond the agreed function signatures.

What we learned

Pinning down the exact shape of a "score" (type, range, who computes it) before writing any grading code saves far more time than it costs — and forcing an LLM to do only coarse, checklist-level judgment instead of asking it for a number directly is both more reliable and easier to debug when something looks wrong.

What's next

Live streaming voice instead of record-then-upload, a per-topic progress dashboard so candidates can track growth across sessions, more interview modes (behavioral, take-home review), and periodic calibration of the Evaluator's scores against human graders.

Built With

  • fastapi
  • faster-whisper
  • git
  • github
  • groq
  • json-schema
  • kimi
  • mistral-ai
  • moonshot-ai
  • openai-python-sdk
  • pdfplumber
  • pydantic
  • pytest
  • python
  • python-docx
  • python-dotenv
  • rag
  • sentence-transformers
  • sqlite
  • uvicorn
  • whisper
Share this project:

Updates

Submission history