{"slug": "show-hn-jevpipe-a-fast-system-1-for-ai-agents-as-a-unix-pipe", "title": "Show HN: Jevpipe – a fast System 1 for AI agents, as a Unix pipe", "summary": "Fabian Both released Jevpipe, an open-source Unix-pipe CLI that lets AI coding agents run fast, cheap yes/no and choice judgments over thousands of files, lines or records in one shell command. In a ripgrep 15.1 example, Jevpipe filtered 19 commit messages in 1.1 seconds for $0.000225, and classified all 19 into feature, fix, docs or internal categories in 1.1 seconds for $0.0003. The tool installs via `uv tool install jevpipe` or `pipx install jevpipe`, requires an OpenRouter API key, and ships an agent skill installable with `npx skills add fabianboth/jevpipe --skill jevpipe`.", "body_md": "**Give your coding agent a System 1.**\n\nFast, cheap judgments over thousands of files, lines or records in one shell command,\n\nso your agent decides at scale instead of reading everything itself.\n\n[Quick start](https://github.com/fabianboth/jevpipe#quick-start) ·\n[Example](https://github.com/fabianboth/jevpipe#example) ·\n[Use cases](https://github.com/fabianboth/jevpipe#use-cases) ·\n[Measured](https://github.com/fabianboth/jevpipe#measured) ·\n[Cost](https://github.com/fabianboth/jevpipe#cost-and-speed)\n\n```\nuv tool install jevpipe                             # the CLI\njevpipe auth set-key                                # your OpenRouter key, kept in the system keychain\nnpx skills add fabianboth/jevpipe --skill jevpipe   # teaches your agent when and how to use it\n```\n\nYou need an [OpenRouter API key](https://openrouter.ai/settings/keys). Where there is no keychain,\nas in containers, CI or headless Linux, set `OPENROUTER_API_KEY` instead; it also takes precedence.\nNo uv yet? [Install it](https://docs.astral.sh/uv/getting-started/installation/) or use pipx.\n\n## Without uv, or with the GitHub CLI\n\n```\npipx install jevpipe                                # instead of uv\ngh skill install fabianboth/jevpipe jevpipe         # the skill, with the GitHub CLI\n```\n\nWhich of the 19 commits in ripgrep 15.1 are new features? Ask each commit message:\n\n```\n# in a clone of https://github.com/BurntSushi/ripgrep\ngit log --format=%s 15.0.0..15.1.0 | jevpipe filter \"Is this a new feature?\"\n# the commit messages that match the question\nignore/types: add `ssa` type\nprinter: add Cursor hyperlink alias\n\n# the summary, on standard error\njevpipe: 19 records, 2 kept, 0 skipped, 0 failed, $0.000225, 1.1s\n```\n\n## Typed answers with `map`: sort every commit into feature, fix, docs or internal\n\n```\n# in a clone of https://github.com/BurntSushi/ripgrep\ngit log --format=%s 15.0.0..15.1.0 | jevpipe map -q '{\n  \"kind\": {\n    \"type\": \"choice\",\n    \"instructions\": \"What kind of change is this, for the release notes?\",\n    \"criteria\": {\n      \"feature\": \"a new capability for users\",\n      \"fix\": \"a bug fix users would notice\",\n      \"docs\": \"documentation only\",\n      \"internal\": \"refactoring, tests, CI, dependencies or release chores\"\n    }\n  }\n}'\n```\n\nEvery commit becomes one JSON line. One of the 19:\n\n```\n{\n  \"record\": \"printer: add Cursor hyperlink alias\",\n  \"answers\": {\n    \"kind\": {\n      \"type\": \"choice\",\n      \"choice\": \"feature\",\n      \"probabilities\": {\"docs\": 0.05, \"feature\": 0.87, \"fix\": 0.03, \"internal\": 0.05},\n      \"confidence\": 0.82\n    }\n  }\n}\n```\n\nAll 19 took 1.1 seconds and cost $0.0003. Pick from them with jq, for example the fixes:\n`jq -r 'select(.answers.kind.choice == \"fix\") | .record'`. A low confidence marks an answer worth\na second look.\n\nEach item is judged on its own, so ask what the item itself can answer:\n\n| Job | Question for every item | Answer | \n|---|---|---|\n| Search code by meaning | Does this file retry failed requests? | yes/no | \n| Triage CI failures | Timeout, network error, failed assertion or crash? | choice | \n| Review a large diff | Does this change touch authentication or permissions? | yes/no | \n| Label an issue backlog | Bug report, feature request or question? | choice | \n| Route a support inbox | Which team? How urgent? | choice, score | \n| Moderate a comment queue | Fine, spam or abusive? | choice | \n| Screen papers | How relevant is this abstract to my question? | score 1 to 5 | \n\n**Classification.** Jev against general LLMs on intent routing and prompt-injection detection,\nfrom an [independent study](https://www.ayautomate.com/blog/jev-vs-llm-benchmark):\n\n**Code search.** jevpipe in an agent's hands: 470 searches from the\n[extended CodeSearchNet Challenge](https://huggingface.co/datasets/Scoolar/codesearchnet-challenge-extended)\nin five languages, each over every function of its language.\n\n**[Read the full benchmark](https://github.com/fabianboth/jevpipe/blob/main/bench/README.md)**:\nevery language, speed and cost, and the searches where jevpipe loses.\n\n|  | Asks | Prints | \n|---|---|---|\n| `jevpipe filter \"question\"` | one yes/no question | the lines answered yes, like grep | \n| `jevpipe map -q '{...}'` | several typed questions: yes/no, one choice, a score | one JSON line per record | \n\nBoth read their input like grep: lines through a pipe or from the files you name. With\n`--read-files`, each line is a path, and the file it names is judged instead:\n\n```\ngit log --format=%s | jevpipe filter \"Is this a new feature?\"                       # each commit message\njevpipe filter \"Is this an error worth a closer look?\" app.log                      # each line of app.log\ngit ls-files | jevpipe filter \"Does this file retry failed requests?\" --read-files  # each file\n```\n\n`jevpipe <command> --help` has the rest.\n\nEvery record is one request billed to your [OpenRouter](https://openrouter.ai) credit, and the\ncost follows the size of each record: about a cent per 1,000 commit messages, 4 to 18 cents per\n1,000 source files. Asking several questions at once barely changes it. Up to 100 records run at\nthe same time, so hundreds take seconds.\n\n`--max-cost 0.50` stops sending requests once the run has spent $0.50; it then exits with status 3\nand names the line to resume from.\nTo cap every run by default, run `jevpipe config set max-cost 0.50` once; `jevpipe config --help`\nlists the other defaults you can set.\n\n[Apache-2.0](https://github.com/fabianboth/jevpipe/blob/main/LICENSE). jevpipe is an independent\nproject, not affiliated with or endorsed by TypeSafe AI; the answers come from\n[Jev](https://typesafe.ai), TypeSafe AI's calibrated decision model, through OpenRouter. Building\nfrom source needs Rust (rustup picks the pinned toolchain) and PowerShell 7 for `./check.ps1`.", "url": "https://wpnews.pro/news/show-hn-jevpipe-a-fast-system-1-for-ai-agents-as-a-unix-pipe", "canonical_source": "https://github.com/fabianboth/jevpipe", "published_at": "2026-09-28 13:15:05+00:00", "updated_at": "2026-09-28 13:17:14.132306+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "large-language-models", "ai-products"], "entities": ["Jevpipe", "Fabian Both", "OpenRouter", "ripgrep", "GitHub", "CodeSearchNet Challenge", "uv", "pipx"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-jevpipe-a-fast-system-1-for-ai-agents-as-a-unix-pipe", "markdown": "https://wpnews.pro/news/show-hn-jevpipe-a-fast-system-1-for-ai-agents-as-a-unix-pipe.md", "text": "https://wpnews.pro/news/show-hn-jevpipe-a-fast-system-1-for-ai-agents-as-a-unix-pipe.txt", "jsonld": "https://wpnews.pro/news/show-hn-jevpipe-a-fast-system-1-for-ai-agents-as-a-unix-pipe.jsonld"}}