Pipe anything into Jev, get typed decisions out. A Unix filter that lets agents offload bulk judgments to a System One model.
Python
1
17 commits
updated Sep 28, 2026
Give your agent a System 1.
Fast, cheap judgments over thousands of files, lines or records in one shell command,
so your agent decides at scale instead of reading everything itself.
Quick start · Example · Use cases · Measured · Cost
uv tool install jevpipe # the CLI
jevpipe auth set-key # your OpenRouter key, kept in the system keychain
npx skills add fabianboth/jevpipe --skill jevpipe # teaches your agent when and how to use it
You need an OpenRouter API key. Where there is no keychain,
as in containers, CI or headless Linux, set OPENROUTER_API_KEY instead; it also takes precedence.
No uv yet? Install it or use pipx.
pipx install jevpipe # instead of uv
gh skill install fabianboth/jevpipe jevpipe # the skill, with the GitHub CLI
Which of the 19 commits in ripgrep 15.1 are new features? Ask each commit message:
# in a clone of https://github.com/BurntSushi/ripgrep
git log --format=%s 15.0.0..15.1.0 | jevpipe filter "Is this a new feature?"
# the commit messages that match the question
ignore/types: add `ssa` type
printer: add Cursor hyperlink alias
# the summary, on standard error
jevpipe: 19 records, 2 kept, 0 skipped, 0 failed, $0.000225, 1.1s
map: sort every commit into feature, fix, docs or internal# in a clone of https://github.com/BurntSushi/ripgrep
git log --format=%s 15.0.0..15.1.0 | jevpipe map -q '{
"kind": {
"type": "choice",
"instructions": "What kind of change is this, for the release notes?",
"criteria": {
"feature": "a new capability for users",
"fix": "a bug fix users would notice",
"docs": "documentation only",
"internal": "refactoring, tests, CI, dependencies or release chores"
}
}
}'
Every commit becomes one JSON line. One of the 19:
{
"record": "printer: add Cursor hyperlink alias",
"answers": {
"kind": {
"type": "choice",
"choice": "feature",
"probabilities": {"docs": 0.05, "feature": 0.87, "fix": 0.03, "internal": 0.05},
"confidence": 0.82
}
}
}
All 19 took 1.1 seconds and cost $0.0003. Pick from them with jq, for example the fixes:
jq -r 'select(.answers.kind.choice == "fix") | .record'. A low confidence marks an answer worth
a second look.
Each item is judged on its own, so ask what the item itself can answer:
| Job | Question for every item | Answer |
|---|---|---|
| Search code by meaning | Does this file retry failed requests? | yes/no |
| Triage CI failures | Timeout, network error, failed assertion or crash? | choice |
| Review a large diff | Does this change touch authentication or permissions? | yes/no |
| Label an issue backlog | Bug report, feature request or question? | choice |
| Route a support inbox | Which team? How urgent? | choice, score |
| Moderate a comment queue | Fine, spam or abusive? | choice |
| Screen papers | How relevant is this abstract to my question? | score 1 to 5 |
Classification. Jev against general LLMs on intent routing and prompt-injection detection, from an independent study:
Code search. jevpipe in an agent's hands: 470 searches from the extended CodeSearchNet Challenge in five languages, each over every function of its language.
Read the full benchmark: every language, speed and cost, and the searches where jevpipe loses.
| Asks | Prints | |
|---|---|---|
jevpipe filter "question" | one yes/no question | the lines answered yes, like grep |
jevpipe map -q '{...}' | several typed questions: yes/no, one choice, a score | one JSON line per record |
Both read their input like grep: lines through a pipe or from the files you name. With
--read-files, each line is a path, and the file it names is judged instead:
git log --format=%s | jevpipe filter "Is this a new feature?" # each commit message
jevpipe filter "Is this an error worth a closer look?" app.log # each line of app.log
git ls-files | jevpipe filter "Does this file retry failed requests?" --read-files # each file
jevpipe <command> --help has the rest.
Every record is one request billed to your OpenRouter credit, and the cost follows the size of each record: about a cent per 1,000 commit messages, 4 to 18 cents per 1,000 source files. Asking several questions at once barely changes it. Up to 100 records run at the same time, so hundreds take seconds.
--max-cost 0.50 stops sending requests once the run has spent $0.50; it then exits with status 3
and names the line to resume from.
To cap every run by default, run jevpipe config set max-cost 0.50 once; jevpipe config --help
lists the other defaults you can set.
Apache-2.0. jevpipe is an independent
project, not affiliated with or endorsed by TypeSafe AI; the answers come from
Jev, TypeSafe AI's calibrated decision model, through OpenRouter. Building
from source needs Rust (rustup picks the pinned toolchain) and PowerShell 7 for ./check.ps1.
Python
37.5%
Rust
32.1%
Shell
15.8%
PowerShell
14.5%
Pipe anything into Jev, get typed decisions out. A Unix filter that lets agents offload bulk judgments to a System One model.
Python
1
17 commits
updated Sep 28, 2026
Give your agent a System 1.
Fast, cheap judgments over thousands of files, lines or records in one shell command,
so your agent decides at scale instead of reading everything itself.
Quick start · Example · Use cases · Measured · Cost
uv tool install jevpipe # the CLI
jevpipe auth set-key # your OpenRouter key, kept in the system keychain
npx skills add fabianboth/jevpipe --skill jevpipe # teaches your agent when and how to use it
You need an OpenRouter API key. Where there is no keychain,
as in containers, CI or headless Linux, set OPENROUTER_API_KEY instead; it also takes precedence.
No uv yet? Install it or use pipx.
pipx install jevpipe # instead of uv
gh skill install fabianboth/jevpipe jevpipe # the skill, with the GitHub CLI
Which of the 19 commits in ripgrep 15.1 are new features? Ask each commit message:
# in a clone of https://github.com/BurntSushi/ripgrep
git log --format=%s 15.0.0..15.1.0 | jevpipe filter "Is this a new feature?"
# the commit messages that match the question
ignore/types: add `ssa` type
printer: add Cursor hyperlink alias
# the summary, on standard error
jevpipe: 19 records, 2 kept, 0 skipped, 0 failed, $0.000225, 1.1s
map: sort every commit into feature, fix, docs or internal# in a clone of https://github.com/BurntSushi/ripgrep
git log --format=%s 15.0.0..15.1.0 | jevpipe map -q '{
"kind": {
"type": "choice",
"instructions": "What kind of change is this, for the release notes?",
"criteria": {
"feature": "a new capability for users",
"fix": "a bug fix users would notice",
"docs": "documentation only",
"internal": "refactoring, tests, CI, dependencies or release chores"
}
}
}'
Every commit becomes one JSON line. One of the 19:
{
"record": "printer: add Cursor hyperlink alias",
"answers": {
"kind": {
"type": "choice",
"choice": "feature",
"probabilities": {"docs": 0.05, "feature": 0.87, "fix": 0.03, "internal": 0.05},
"confidence": 0.82
}
}
}
All 19 took 1.1 seconds and cost $0.0003. Pick from them with jq, for example the fixes:
jq -r 'select(.answers.kind.choice == "fix") | .record'. A low confidence marks an answer worth
a second look.
Each item is judged on its own, so ask what the item itself can answer:
| Job | Question for every item | Answer |
|---|---|---|
| Search code by meaning | Does this file retry failed requests? | yes/no |
| Triage CI failures | Timeout, network error, failed assertion or crash? | choice |
| Review a large diff | Does this change touch authentication or permissions? | yes/no |
| Label an issue backlog | Bug report, feature request or question? | choice |
| Route a support inbox | Which team? How urgent? | choice, score |
| Moderate a comment queue | Fine, spam or abusive? | choice |
| Screen papers | How relevant is this abstract to my question? | score 1 to 5 |
Classification. Jev against general LLMs on intent routing and prompt-injection detection, from an independent study:
Code search. jevpipe in an agent's hands: 470 searches from the extended CodeSearchNet Challenge in five languages, each over every function of its language.
Read the full benchmark: every language, speed and cost, and the searches where jevpipe loses.
| Asks | Prints | |
|---|---|---|
jevpipe filter "question" | one yes/no question | the lines answered yes, like grep |
jevpipe map -q '{...}' | several typed questions: yes/no, one choice, a score | one JSON line per record |
Both read their input like grep: lines through a pipe or from the files you name. With
--read-files, each line is a path, and the file it names is judged instead:
git log --format=%s | jevpipe filter "Is this a new feature?" # each commit message
jevpipe filter "Is this an error worth a closer look?" app.log # each line of app.log
git ls-files | jevpipe filter "Does this file retry failed requests?" --read-files # each file
jevpipe <command> --help has the rest.
Every record is one request billed to your OpenRouter credit, and the cost follows the size of each record: about a cent per 1,000 commit messages, 4 to 18 cents per 1,000 source files. Asking several questions at once barely changes it. Up to 100 records run at the same time, so hundreds take seconds.
--max-cost 0.50 stops sending requests once the run has spent $0.50; it then exits with status 3
and names the line to resume from.
To cap every run by default, run jevpipe config set max-cost 0.50 once; jevpipe config --help
lists the other defaults you can set.
Apache-2.0. jevpipe is an independent
project, not affiliated with or endorsed by TypeSafe AI; the answers come from
Jev, TypeSafe AI's calibrated decision model, through OpenRouter. Building
from source needs Rust (rustup picks the pinned toolchain) and PowerShell 7 for ./check.ps1.
Python
37.5%
Rust
32.1%
Shell
15.8%
PowerShell
14.5%