CoolFace
Apppublic

Rishabh2095/AgentWorkflowJobApplications

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes
App README

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

bash
# 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
bash
# With uv
uv run -m job_writing_agent \
  --resume path/to/resume.pdf \
  --job https://example.com/job-posting \
  --type cover_letter

# With python directly
python -m job_writing_agent \
  --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:

GraphEndpointDescription
job_app_graphFull pipelineEnd-to-end: load → research → draft → critique → approve → finalize
research_workflowResearch onlyCompany research with Tavily search and relevance filtering
data_loading_workflowData loading onlyResume and job description parsing

Tech Stack

CategoryTools
OrchestrationLangGraph
LLM FrameworkLangChain, DSPy
SearchTavily
EvaluationOpenEvals (LLM-as-judge)
ObservabilityLangSmith
Web ScrapingPlaywright
DeploymentDocker, Hugging Face Spaces
Package Managementuv

License

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