Skip to content

feat(job-hunter): support PDF resume input via file path (#6740)#6857

Merged
bryanadenhq merged 2 commits into
aden-hive:mainfrom
Ttian18:feat/tina/job-hunter-pdf-resume
Mar 31, 2026
Merged

feat(job-hunter): support PDF resume input via file path (#6740)#6857
bryanadenhq merged 2 commits into
aden-hive:mainfrom
Ttian18:feat/tina/job-hunter-pdf-resume

Conversation

@Ttian18

@Ttian18 Ttian18 commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

Description

The Job Hunter agent only accepts resumes as pasted text. This adds support
for users to provide a file path to a PDF resume, which the agent reads
using the existing pdf_read tool.

Type of Change

  • New feature (non-breaking change that adds functionality)

Related Issues

Fixes #6740

Changes Made

  • examples/templates/job_hunter/nodes/__init__.py — add pdf_read to
    intake node tools, update prompt to offer paste text or PDF file path
  • examples/templates/job_hunter/agent.json — same changes in the
    serialized spec, add pdf_read to required_tools
  • exports/job_hunter/nodes/__init__.py — sync local copy with template

Testing

  • Job Hunter agent tests pass (7/7, including 2 new tests)
  • pdf_read tool tests pass (18/18)
  • Core framework tests pass (1406 passed, 41 skipped)
  • Full tools suite passes (6061 passed, 283 skipped)
  • Lint clean (ruff check + ruff format --check)
  • Manual test: agent prompt correctly offers PDF file path option

Checklist

  • My code follows the project's style guidelines
  • I have performed a self-review of my code
  • My changes generate no new warnings
  • New and existing unit tests pass locally with my changes

Summary by CodeRabbit

  • New Features
    • Job Hunter agent now accepts resumes either as pasted text or as a PDF file path.
    • When a PDF path is provided, the agent will extract text from the PDF before analysis.
    • The agent’s intake step now has PDF extraction enabled so users can submit PDFs directly.

@coderabbitai

coderabbitai Bot commented Mar 29, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ecd6d1f4-f5ba-4b51-829a-827d62eebc6b

📥 Commits

Reviewing files that changed from the base of the PR and between 33edf4a and 9a68a5d.

📒 Files selected for processing (1)
  • examples/templates/job_hunter/nodes/__init__.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • examples/templates/job_hunter/nodes/init.py

📝 Walkthrough

Walkthrough

Intake now accepts either pasted resume text or a PDF file path. The intake node and graph metadata were updated to include the pdf_read tool and the system prompt now instructs calling pdf_read(file_path="<path>") when a PDF path is provided.

Changes

Cohort / File(s) Summary
Agent graph + required tools
examples/templates/job_hunter/agent.json
Added pdf_read to required_tools; updated the intake node to include tools: ["pdf_read"] and revised system_prompt to accept PDF file paths and instruct pdf_read(file_path="<path>").
Intake node spec
examples/templates/job_hunter/nodes/__init__.py
Adjusted intake node configuration: made it client-facing, removed input_keys reliance on resume_text, added tools=["pdf_read"], and expanded the system prompt to document both paste and PDF-path submission flows.

Sequence Diagram(s)

sequenceDiagram
  participant User as Client/User
  participant Intake as Intake Node
  participant Tool as pdf_read Tool
  participant Agent as Downstream Analysis

  User->>Intake: Submit resume (pasted text OR PDF file path)
  alt PDF file path provided
    Intake->>Tool: pdf_read(file_path)
    Tool-->>Intake: extracted_text
    Intake->>Agent: resume_text (extracted_text)
  else Pasted text provided
    Intake->>Agent: resume_text (pasted)
  end
  Agent-->>User: analysis / next steps
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 I nibble through PDFs and paste,
Hopping text from every place.
Drop a path or paste your file,
I’ll tidy resumes with a smile—
Hooray, more ways to chase that job!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main feature: adding PDF resume input support to the Job Hunter agent via file path.
Linked Issues check ✅ Passed All primary objectives from issue #6740 are met: pdf_read added to intake tools, prompt updated to offer both paste and PDF options, logic implemented to call pdf_read for file paths.
Out of Scope Changes check ✅ Passed All changes align with the linked issue scope: intake node tools, prompt updates, and graph configuration remain focused on PDF resume support.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
examples/templates/job_hunter/nodes/__init__.py (1)

11-14: ⚠️ Potential issue | 🟠 Major

Fix contradiction: client_facing=False conflicts with system prompt that instructs user interaction.

The intake node has client_facing=False and input_keys=["resume_text"], but the system prompt instructs "The user can provide their resume in two ways." This is contradictory: if client_facing=False, the node cannot receive direct user input, so the prompt should not ask users to provide content.

Meanwhile, agent.json defines the same node differently with client_facing: true and input_keys: [], along with a prompt that explicitly asks: "Ask the user to provide their resume."

The Python definition (which is used at runtime via agent.py imports) needs alignment: either set client_facing=True to allow user interaction, or remove user-facing instructions and expect resume_text to be supplied from the graph input.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@examples/templates/job_hunter/nodes/__init__.py` around lines 11 - 14, The
intake node definition is inconsistent with the system prompt: update the Python
node config so its runtime behavior matches agent.json and the prompt — either
set client_facing=True and remove resume_text from input_keys (so the node will
prompt the user for their resume), or keep client_facing=False and
remove/replace any user-facing instructions in the node prompt and accept
resume_text via graph inputs; adjust the symbols node_type="event_loop",
client_facing, and input_keys in the __init__.py intake node to match the chosen
behavior (and ensure agent.json and the node prompt are synchronized with that
choice).
🧹 Nitpick comments (1)
examples/templates/job_hunter/nodes/__init__.py (1)

20-41: System prompt content diverges from agent.json.

The system prompt here differs significantly from the one in agent.json:

  • Python file: Non-interactive analysis prompt ("Do NOT wait for user confirmation")
  • JSON file: Interactive multi-step prompt with user greeting, confirmation steps

Both files now include PDF handling instructions, which is good, but ensure the intended behavior is consistent. If agent.json is the source of truth for deployed agents, this Python definition may be stale or used only for development/testing.

Consider either:

  1. Keeping only one source of truth (JSON or Python) and generating/deriving the other
  2. Adding a comment clarifying which file is authoritative
  3. Synchronizing the prompts if both are used
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@examples/templates/job_hunter/nodes/__init__.py` around lines 20 - 41, The
system_prompt string and tools list in
examples/templates/job_hunter/nodes/__init__.py diverge from agent.json
(behavior differs: non-interactive vs interactive); choose a single source of
truth (either agent.json or the Python module) and synchronize the prompts and
PDF handling accordingly: update the system_prompt literal in __init__.py to
exactly match the authoritative prompt in agent.json (or update agent.json to
match if JSON is authoritative), ensure tools=["pdf_read"] is consistent, and
add a short inline comment in __init__.py stating which file (agent.json or this
Python module) is authoritative to avoid future drift.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@examples/templates/job_hunter/nodes/__init__.py`:
- Around line 11-14: The intake node definition is inconsistent with the system
prompt: update the Python node config so its runtime behavior matches agent.json
and the prompt — either set client_facing=True and remove resume_text from
input_keys (so the node will prompt the user for their resume), or keep
client_facing=False and remove/replace any user-facing instructions in the node
prompt and accept resume_text via graph inputs; adjust the symbols
node_type="event_loop", client_facing, and input_keys in the __init__.py intake
node to match the chosen behavior (and ensure agent.json and the node prompt are
synchronized with that choice).

---

Nitpick comments:
In `@examples/templates/job_hunter/nodes/__init__.py`:
- Around line 20-41: The system_prompt string and tools list in
examples/templates/job_hunter/nodes/__init__.py diverge from agent.json
(behavior differs: non-interactive vs interactive); choose a single source of
truth (either agent.json or the Python module) and synchronize the prompts and
PDF handling accordingly: update the system_prompt literal in __init__.py to
exactly match the authoritative prompt in agent.json (or update agent.json to
match if JSON is authoritative), ensure tools=["pdf_read"] is consistent, and
add a short inline comment in __init__.py stating which file (agent.json or this
Python module) is authoritative to avoid future drift.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7c81c1ac-bb4f-4524-8cab-cc8d5c63bd7e

📥 Commits

Reviewing files that changed from the base of the PR and between eba7524 and 33edf4a.

📒 Files selected for processing (2)
  • examples/templates/job_hunter/agent.json
  • examples/templates/job_hunter/nodes/__init__.py

@bryanadenhq
bryanadenhq merged commit 45b350e into aden-hive:main Mar 31, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Support PDF resume input in Job Hunter template agent

2 participants