Jev directory
CommunityJev Tools & CLIs
Jev Sort
Node CLI and TypeScript library that streams JSONL or CSV rows through Jev, adding one typed column per question plus a _confidence field, with escalation, rejection, dedupe, and concurrency controls.
- Reading time
- 2 min
- Published by
- Community
- Added
- Nov 2026
Highlights
- Installs as a global CLI or a library: npm install -g @cmaintz/jev-sort.
- Questions are declared inline with -q, such as 'team:choice(billing,tech,sales)' or 'urgent:noul'.
- Each output row gains one column per question plus _confidence, the lowest choice or score confidence in the row.
- Default concurrency is 8; --rate caps requests per minute and --dedupe reuses one answer for identical rows.
- Requires JEV_API_KEY; the Cloudflare provider also needs CLOUDFLARE_ACCOUNT_ID.
Questions about this entry
Short answers drawn from the linked project or page.
Install the CLI globally with npm install -g @cmaintz/jev-sort, or install @cmaintz/jev-sort as a library. Run jev-sort --help for the full flag list. It is published under the MIT license by Christoffer Maintz.
It takes --provider typesafe or --provider cloudflare, with --model jev-latest sent as typesafe/jev on Cloudflare; any other model id is passed through. Set JEV_API_KEY, plus CLOUDFLARE_ACCOUNT_ID when using Cloudflare.
Use --escalate 'conf<0.6' together with --review-out FILE. Rows below the bar go to that JSONL file instead of stdout, and a row counts as confident only if every choice or score answer clears the bar. Exit code is 2 if any rows were flagged, unless you pass --allow-review.
A row whose Jev call fails, or that returns without an answer to every question, is written to --reject-out FILE as JSONL with an _error field. An input line that is not a JSON object gets _line and _raw. The stream keeps going, and the exit code is 3 if anything was rejected.
--thresholds thresholds.json takes the bar from jev-eval instead of a guess. It refuses a file measured on a different set of choice or score questions, warns when the model differs from --model or a gated question was reworded, and prints the accuracy and coverage measured for that gate. Use it instead of --escalate.
On TypeSafe's workflow evals Jev scores 67.8% agreement with frontier-model reference labels, so treat output as pre-labels and spot-check it. Input is text only, and each row must fit Jev's request limit of 32k tokens for state plus the longest question; long documents need summarizing first.
It pays off on thousands of rows or more. For a few hundred rows a one-off LLM script is simpler, and if the rule is a crisp regex or keyword match, plain code beats both. It also gives no rationale for a label and does no counting or date arithmetic, so aggregation belongs downstream.
Reactions & coverage
Posts, threads, and videos about this entry from around the web.
Facebook: Intake Router keeps diagnosis out of the answer space at the front desk.
FacebookClinicnotes
X: OpenRouter Decision Model Rankings
X: herdr + jev, an agent router
X: A group chat bot with decision room routing
From the Jev guides
Original write-ups on what this entry is for.
From the Jev AI model community
Posts from builders shipping with Jev right now.