Inspiration

Hiring is broken. Recruiters spend hours writing job descriptions, manually screening resumes, and scheduling calls — only to repeat the same process for every role. We wanted to build something that handles the entire recruitment lifecycle autonomously, with a human only stepping in at key decision points. The Amazon Nova hackathon gave us the perfect reason to make it real.

What It Does

AARLP (AI-Agentic Recruitment Lifecycle Platform) automates hiring end-to-end using Amazon Nova on AWS Bedrock:

  • JD Generation — A recruiter fills a simple form. Nova 2 Lite drafts a full, SEO-optimized Job Description in seconds.
  • Human-in-the-Loop Editing — The recruiter reviews, edits inline, or gives natural-language feedback for AI regeneration.
  • Semantic Candidate Ranking — Resumes are embedded using Nova 2 Multimodal Embeddings and ranked by cosine similarity against the JD vector — no keyword matching.
  • Voice Prescreening (Architecture Ready) — Nova 2 Sonic is wired as a voice provider for automated phone screenings.
  • LangGraph Agentic Workflow — The entire pipeline is a stateful LangGraph graph with checkpointing, so the agent can pause, wait for human approval, and resume.

How We Built It

Layer Technology
AI Core Amazon Nova 2 Lite + Nova 2 Multimodal Embeddings + Nova 2 Sonic via AWS Bedrock
Orchestration LangGraph (stateful agentic graph with Postgres checkpointing)
Backend FastAPI (async Python), SQLAlchemy, Pydantic v2
Vector DB Pinecone (1024-dim Nova embeddings)
Frontend Next.js 14 App Router, Tailwind CSS, Light/Dark mode
Auth JWT + Email OTP (FastAPI-Mail)
Infra PostgreSQL, Redis (distributed locking)

The AI provider is fully swappable via a single env var (AI_PROVIDER=bedrock). All JD generation, regeneration, prescreening question creation, and candidate response scoring routes through invoke_nova_model() → Bedrock runtime → Nova 2 Lite.

Challenges We Faced

  • Nova response format — Nova's Bedrock response uses a nested output.message.content[].text structure, unlike OpenAI's flat response. We built a dedicated bedrock_utils.py with proper message formatting and response parsing to handle this cleanly.
  • Async Bedrock clientboto3 is synchronous by default. We integrated aioboto3 with async context managers so every Nova call is non-blocking inside FastAPI's async routes.
  • Embedding dimension mismatch — Nova 2 Multimodal Embeddings produce 1024-dim vectors (not 1536 like OpenAI). We ensured Pinecone index creation, storage, and similarity scoring all respect the correct dimension dynamically based on the active provider.
  • Stateful agentic workflow — Designing a LangGraph graph that correctly pauses for human approval (JD review, shortlist approval) without losing state across long-running recruitment pipelines required careful checkpoint design.

What We Learned

  • Amazon Nova 2 Lite is fast and highly capable for structured JSON generation tasks like JD writing — with proper system prompting it produces schema-valid output consistently.
  • Nova 2 Multimodal Embeddings open up rich cross-modal semantic search possibilities well beyond text-only matching.
  • LangGraph's checkpointing + human-in-the-loop pattern is a powerful pattern for real-world agentic applications where full automation isn't always desirable.

Built With

Share this project:

Updates