Part 1: Build — The Observable Job Agent
The Observable Job Agent, Part 1: Build.
A real, observable AI job-matching agent: CV (PDF) in, real job openings out, ranked 0–100 for fit with honest gap explanations — every LLM and tool call traced in Opik from the very first run.
📖 Blog post: https://jamwithai.substack.com/p/build-your-own-job-agent-part-1
What's inside
- LangGraph agent:
fetch_jobs→rank_jobs→ bounded reformulation loop (max 2) - LLM-driven tool use: the model chooses the search arguments, you watch it choose in the trace
- Multi-source search cascade (JSearch, Adzuna, Remotive, offline cache) — runs with zero API keys
- Gradio step-wizard UI with streamed progress and per-run cost footer
- Opik observability: span tree, agent graph, versioned prompts, CV attached to the trace
- An honest documented baseline (
docs/phase1_findings.md,docs/baseline.json)
Get started
git clone --branch part1.0 https://github.com/jamwithai/observable-job-agent
cd observable-job-agent
uv sync --all-groups
cp .env.example .env
make test # 35 tests, no network needed
make app # then upload a CV from data/fixture_cvs/