# AI Job Source Agent For recently posted LinkedIn jobs, produces records of the form: ``` company_name, career_page_url, open_position_url ``` Runs in configurable batches, on a schedule, and is incremental — re-runs process only new jobs. ## Setup ```bash python -m venv .venv && source .venv/bin/activate pip install -r requirements.txt playwright install chromium # for the browser-agent tier cp .env.example .env # fill keys as available ``` ## Run ```bash # one batch (no server required) python -m jobsource.main --batch-size 20 --search "software engineer" --location "United States" ``` `--search` is repeatable. Run `python -m jobsource.main --help` for all options. ### Scheduled run (Prefect) ```bash # Boots a local Prefect server automatically, then serves the flow on an # interval schedule (default: daily, set SCHEDULE_INTERVAL_SECONDS to change). python -m jobsource.flow ``` If you already have a Prefect server running elsewhere, point the flow at it: ```bash export PREFECT_API_URL=http://127.0.0.1:4200/api python -m jobsource.flow ``` To trigger a run manually while the flow is being served: ```bash prefect deployment run 'job-source-batch/job-source-batch' ``` > **Note — Prefect 3.7.4 + FastAPI ≥ 0.137 compatibility**: Prefect's built-in > ephemeral server is incompatible with FastAPI 0.137+ (route lists are cleared > after inclusion but re-read lazily during routing). `python -m jobsource.flow` > works around this by starting a persistent `prefect server start` process > instead of the ephemeral server. ### No-daemon cron fallback If you prefer a plain cron job with no running process, add this line to your crontab (`crontab -e`), adjusting the path to your repo: ``` # daily at 06:00 — no Prefect daemon required 0 6 * * * cd /path/to/repo && ./.venv/bin/python -m jobsource.main --batch-size 50 ``` ## Tests ```bash pytest -q ``` ## Output `output/results.csv` — three columns: `company_name`, `career_page_url`, `open_position_url`. Complete rows (status `position_found`) are sorted first.