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[].textstructure, unlike OpenAI's flat response. We built a dedicatedbedrock_utils.pywith proper message formatting and response parsing to handle this cleanly. - Async Bedrock client —
boto3is synchronous by default. We integratedaioboto3with 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
- aioboto3
- amazon-web-services
- awsnovasonic
- bedrock
- css
- embeddings
- fastapi
- langgraph
- multimodal
- next.js
- pinecone
- postgresql
- pydantic
- python
- redis
- tailwind
- typescript


Log in or sign up for Devpost to join the conversation.