A resilient, form-agnostic, and context-aware AI agent designed to autonomously navigate any Applicant Tracking System (ATS), tailor high-fidelity professional documents, and fill complex application forms using a multi-step semantic reasoning engine.
- Python 3.10+
- OpenAI API Key
Clone the repository and install the required dependencies:
pip install -r requirements.txt
playwright install chromiumCreate a .env file in the root directory:
OPENAI_API_KEY=your_openai_api_key_hereThe system uses a persistent SQLite database. Seed it with your professional profile:
python seed.pyTip
Modify seed.py to change the candidate's experience, skills, and custom answers (e.g., Visa sponsorship, Salary expectations).
Start the agent and provide the Job Application URL when prompted:
python main.pyNote
The agent is now fully dynamic. You can input any job site (Ashby, Zoho, GlobalLogic, Oracle Cloud, etc.) in real-time.
Candidate: Stores primary PII (Name, Email, Socials) and structured JSON fields forExperienceandEducation.CustomAnswer: A polymorphic key-value store used to cache "Standard Answers" to non-standard questions (e.g., "Are you authorized to work in India?").
To add a new "Global" answer for the agent to use:
- Open
seed.py. - Add a new key-value pair to
CUSTOM_ANSWERS(e.g.,"preferred_working_model": "Remote"). - Re-run
python seed.pyto sync the change.
The agent does NOT rely on hardcoded site lists. It uses a Semantic Discovery Loop located in utils/ats_parser.py:
- Pattern Matching: Scans the URL and the DOM for "Signatures" (e.g.,
.ashbyhq.com,lever-job-container). - Intent Discovery: If no standard ATS is detected, the agent identifies the "Dominant CTA" (e.g., Click "Apply for this position" if inputs are missing).
- Skeleton Scraping: The DOM is minified into a "Semantic Map" that ignores styling and noise, allowing the LLM to see only the high-intent input fields.
Mapping follows a strict 4-Step Hierarchy to ensure accuracy and speed:
- Deterministic Match: Checks the base
Candidateprofile for common fields (First Name, LinkedIn). - Custom Answer Cache: Interrogates the
CustomAnswertable for semantic matches (Notice Period, Referral). - LLM Inference (Step 3): Unresolved fields are batched into a single prompt to GPT-4o. The LLM infers the best answer based on the candidate's career summary.
- Logging: All mapping decisions are logged to the terminal and stored in the
application_stateto track what the "Robot is typing."
When the AI encounters ambiguity or high-security barriers, it surrenders control to you.
- CAPTCHA: Detected automatically; the agent pauses and notifies you to solve it in the browser.
- Missing Mandatory Data: If the AI cannot find an answer in your DB for a required field (
*). - Sensitive Info: SSN or Security Clearances.
The hitl.py node uses an asyncio.wait_for race condition.
- You have 30 seconds to provide an answer in the terminal.
- Backlog System: If you leave it blank or don't respond, the agent marks the job as
BACKLOGand saves the partially filled form state. This prevents the browser from idling forever.
To scale this to thousands of applications and multiple users:
- Job Queue Infrastructure: Wrap the core graph in FastAPI and use Celery + Redis to handle concurrent task processing.
- Headless Browser Farms: Deploy the agent in Docker containers. Use Playwright Browser Contexts to isolate sessions, allowing one server to handle hundreds of applicants simultaneously.
- Vector DB Integration: Move
Candidate Experienceto a Vector DB (ChromaDB/Pinecone) to RAG-retrieve only relevant bullet points for document tailoring, saving thousands in token costs. - Proxy Rotation: Integrate Bright Data or Apify proxy networks to avoid ATS rate-limiting on high-frequency application bursts.
Important
Check the /output folder for generated PDFs (Resume/Cover Letter) after a run.
🔗 Loom Recording: https://www.loom.com/share/ceb7de670e9e48b0b2b5a78a4f2c87b3
The recording demonstrates a complete end-to-end run — including autonomous navigation, ATS detection, resume/cover letter generation, and dynamic form filling.
🔗 Source Code: github.com/devesssi/automated_job_agent