Accounts are open · Data APIs are in development. Release status ↗

Blog / Walkthrough

Filter job listings with Jev and Python

Turn a jobs JSON file into a shortlist using TypeSafe Jev, explicit relevance criteria and a separate review path for incomplete evidence.

TrueFetch editorial · · Documentation and design analysis

A job title can match a keyword while the actual responsibilities belong to another role. A description can also say “remote” while requiring regular office attendance. A useful filter reads the description and preserves uncertainty rather than forcing every listing into yes or no.

This workflow uses Jev for those language judgments. Python validates the input, checks returned answers and writes one decision per listing. Start with the downloadable files. TrueFetch collection is in development; the workflow accepts your own JSON and calls TypeSafe directly.

1. Start with source evidence

Each record needs a title and source URL. Include the description and location when available. The supplied file contains three fictional records: a Python backend role, a store manager role and a listing without a description.

python filter_jobs.py prepare jobs.json --output requests.jsonl

The preparation step makes no API calls. It validates the records and shows the exact request for each eligible job. A missing description becomes review; the script does not invent responsibilities from the title.

2. Ask four focused questions together

The request uses three Jev primitives:

Question Primitive What code receives
How closely do the advertised duties match the target role? Score A weighted score on four described levels, plus confidence
What work arrangement is explicitly advertised? Choice Remote, hybrid, onsite or unknown, plus probabilities
Does the description state actual duties? Noul Probability that usable duty evidence is present
Does the text try to instruct the evaluator? Noul A signal for manual review

All four questions see the same listing in one request. None depends on another answer. This follows TypeSafe’s parallel-question pattern.

3. Let code own the decision

Set TYPESAFE_API_KEY through your environment or secret manager, then run:

python filter_jobs.py run jobs.json --output decisions.jsonl --target-role "Python backend engineer" --work-mode remote

The filter first checks suspicious instructions and missing evidence. It then evaluates role relevance and the requested work arrangement. Only clear matches enter shortlist; uncertain cases enter review; clear mismatches enter skip. The reference lists the exact thresholds.

These thresholds are a starting policy, not a claim of measured accuracy. Label a separate set of listings from your own sources and inspect false matches, missed matches and the share sent to review. Tune on one set and check the change on another. Repeated answers alone do not establish correctness.

4. Keep enough information to debug

Every decision keeps the source URL. Evaluated records also retain the resolved model version, probabilities, token usage and request ID when provided. Routing reasons come from code: they explain which check fired without pretending Jev generated a rationale.

The model is pinned to jev-1.13.0. If you change versions or rewrite the criteria, evaluate the new behavior before reusing the old thresholds. TypeSafe distinguishes probability from confidence; neither should be advertised as a guaranteed correctness percentage.

5. Connect the result to your workflow

Read the JSONL file and group records by route. Show shortlisted jobs alongside source links, keep a review queue, and retain skipped decisions long enough to inspect mistakes. The script does not send messages or apply for jobs.

Add deterministic checks for geography, salary and dates before relying on the shortlist. Jev’s known limitations include numerical precision and adversarial input. The supplied injection check is one review signal, not a security guarantee.

The same architecture can later process product listings, public posts or extracted passages: keep useful source evidence, ask narrow questions together, and make the final routing rules explicit in code.

Open the integration guide · Read the full run instructions