Rishabh2095's picture
Remove Deployment Section in README
6771a0b
metadata
title: Job Application Writer
emoji: πŸ“
colorFrom: blue
colorTo: purple
sdk: docker
app_port: 7860
pinned: false
python_version: 3.12.8

Job Application Writer Agent

An AI-powered agent workflow that generates tailored job application materials β€” cover letters, bullet-point summaries, and LinkedIn connection notes β€” using LangGraph, LangChain, and DSPy. The system performs automated company research, drafts content with self-consistency voting, applies AI critique, and supports human-in-the-loop feedback before finalizing output.

Live Demo: EasyApply | Hugging Face Space

Features

  • Multi-format input β€” Accepts resumes in PDF, TXT, MD, and JSON; job descriptions via URL or Google Docs link
  • Automated company research β€” Uses Tavily search with LLM-based relevance filtering to gather context about the target company
  • Multiple output types β€” Cover letters, bullet-point highlights, and LinkedIn connection messages
  • Quality control pipeline β€” Generates multiple draft variations, selects the best via self-consistency voting, and applies AI critique
  • Human-in-the-loop β€” LangGraph interrupt-based approval step so you can provide feedback before finalization
  • Multi-provider LLM support β€” Factory pattern supporting OpenRouter, Cerebras, and Ollama (both LangChain and DSPy)
  • Observability β€” Full LangSmith tracing with metadata and tags
  • Parallel processing β€” Resume and job description parsing run concurrently

Architecture

The workflow is a LangGraph state machine composed of subgraphs:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        Main Workflow Graph                          β”‚
β”‚                                                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚   LOAD   │───▢│RESEARCH │───▢│ CREATE_DRAFT│───▢│  CRITIQUE β”‚  β”‚
β”‚  β”‚(subgraph)β”‚    β”‚(subgraphβ”‚    β”‚             β”‚    β”‚           β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β”‚
β”‚         β–²                                                β”‚        β”‚
β”‚         └── retry on                           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” β”‚
β”‚             validation                         β”‚HUMAN_APPROVAL  β”‚ β”‚
β”‚             failure                            β”‚  (interrupt)   β”‚ β”‚
β”‚                                                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                          β”‚        β”‚
β”‚                                                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” β”‚
β”‚                                                β”‚    FINALIZE    β”‚ β”‚
β”‚                                                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Getting Started

Prerequisites

  • Python 3.11+
  • uv (recommended) or pip
  • API keys for your chosen LLM provider (OpenRouter, Cerebras, or Ollama) and Tavily

Installation

# Clone the repository
git clone https://github.com/rishabh1024/job_writer.git
cd job_writer

# Install with uv (recommended)
uv pip install -e .

# Or with pip
pip install -e .

Usage

CLI

# With uv
uv run -m job_writing_agent.workflow \
  --resume path/to/resume.pdf \
  --job https://example.com/job-posting \
  --type cover_letter

# With python directly
python -m job_writing_agent.workflow \
  --resume path/to/resume.pdf \
  --job https://example.com/job-posting \
  --type cover_letter

Content types: cover_letter, bullet_points, linkedin_note

LangGraph API

When deployed, the workflow is exposed as a LangGraph API with three graphs:

Graph Endpoint Description
job_app_graph Full pipeline End-to-end: load β†’ research β†’ draft β†’ critique β†’ approve β†’ finalize
research_workflow Research only Company research with Tavily search and relevance filtering
data_loading_workflow Data loading only Resume and job description parsing

Tech Stack

Category Tools
Orchestration LangGraph
LLM Framework LangChain, DSPy
Search Tavily
Evaluation OpenEvals (LLM-as-judge)
Observability LangSmith
Web Scraping Playwright
Deployment Docker, Hugging Face Spaces
Package Management uv

License

This project is provided as-is for educational and personal use.