Browser automation agent for job searching and applying. Built with LangGraph multi-agent orchestration for intelligent, modular task execution.
This project uses a LangGraph-based multi-agent orchestration system where specialized subagents collaborate to accomplish complex job application workflows:
┌─────────────────────────────────────────────────────┐
│ Orchestrator Agent │
│ Coordinates workflow, delegates to subagents │
└───────────────────┬─────────────────────────────────┘
│
┌───────────┴───────────┐
▼ ▼
┌───────────────┐ ┌───────────────┐
│ Browser Agent │ │ Apply Agent │
│ Navigation, │ │ Form filling, │
│ scanning │ │ submission │
└───────────────┘ └───────────────┘
| Agent | Description |
|---|---|
| Orchestrator | Main agent that receives user intent, plans tasks, and delegates to subagents |
| Browser Agent | General-purpose browser automation using Playwright - navigation, clicking, typing, scrolling |
| Apply Agent | Specialized for filling job application forms and submitting applications |
Uses Playwright for reliable automation and LLMs for intelligent navigation.
Browser.20Agent.20sample.20demo.mp4
-
Applying filters and typing job roles -
Fetching list of job links and pagination -
Going through each job and applying/filling forms - Creating tailored resumes and cover letters for each job (file upload tools)
- Web research for company info and sending cold emails
- Supabase integration to track application data (MCP tool)
Model: Using GLM-4.7 (z-ai/glm-4.7) as the default model.
# Setup
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
playwright install chromium
# Configure
cp .env.example .env
# Edit .env with your API keys
# Run
python run_agent.py "AI internship remote" "https://www.indeed.com/jobs"- Python 3.10+
- Chrome browser
- OpenRouter API key
Copy .env.example to .env and add your keys:
OPENROUTER_API_KEY=sk-or-v1-xxxxx # Required
DEEPSEEK_API_KEY=sk-xxxxx # Optional
LANGCHAIN_API_KEY=lsv2_pt_xxxxx # Optional (for tracing)Edit agent_logic/config.py to change models:
MAIN_MODEL = "zhipu/glm-4.7" # Default
VISION_MODEL = "x-ai/grok-4.1-fast" # For screenshotspython run_agent.py "software engineer" "https://www.indeed.com/jobs"python run_agent.py "AI internship salary $40/hr remote" "https://www.indeed.com/jobs"
python run_agent.py "python developer $100k" "https://www.linkedin.com/jobs"python run_agent.py "query" "url" --max-jobs 5Create user_data.json to auto-fill application forms:
{
"first_name": "John",
"last_name": "Doe",
"email": "john@example.com",
"phone": "555-123-4567",
"linkedin": "https://linkedin.com/in/johndoe",
"years_experience": "3"
}Job_Agent/
├── run_agent.py # Entry point
├── config.py # LLM config
├── prompts.py # Agent prompts
├── models/ # LLM wrappers
│ ├── minimax_reasoner.py
│ ├── glm_reasoner.py
│ └── deepseek_reasoner.py
├── browser/ # Browser automation
│ ├── playwright_tools.py
│ ├── playwright_manager.py
│ ├── accessibility_scanner.py
│ └── scripts/
├── agent/ # Agent logic
│ ├── browser_agent.py
│ ├── intent_parser.py
│ └── reasoning_callback.py
└── logs/
The agent connects to Chrome via remote debugging:
# Start Chrome with debugging enabled
./launch_agent_browser.sh
# Then run the agent
python run_agent.py "your query" "https://indeed.com/jobs"| Issue | Solution |
|---|---|
| "Failed to connect to Chrome" | Run ./launch_agent_browser.sh first |
| "Bot detection" | Use logged-in Chrome session |
| "Element not found" | Increase wait time or check page loaded |
MIT