Every developer who has plugged an LLM into a script knows this moment.
You ask a simple question: "Is this customer angry?" The model answers with a friendly paragraph. Now you write code to parse that paragraph. Tomorrow it words things differently, and your parser breaks.
You didn't want a paragraph. You wanted a yes or no, and ideally how sure it is.
That is why we built jev-cli, a free, open-source command-line tool that turns any text into a clear, typed answer your code can act on.
jev is a command-line tool for TypeSafe AI's Jev model, the model that never writes text
Send it some content and a question you defined, get a calibrated probability, and branch on it
in a shell script, a CI job or an AI agent. It is a semantic if statement for your terminal.
Quick start · What can I use it for? · Documentation · Command reference · FAQ
It takes two seconds, and it is how the next person finds jev.
Ask a question, get a probability, branch on the exit code, then ask several questions at once.
Important
Unofficial project. jev is community-built. It is not affiliated with, endorsed by, or
sponsored by TypeSafe AI. "TypeSafe" and "Jev" belong to their owner. You…
jev-cli is an open-source CLI for Jev, a model from TypeSafe AI that never writes text. Instead of a reply, it gives you back a probability.
You give it two things:
You get back a number. Your script decides what to do with it.
jev noul "Is this customer angry?" --state "You charged me twice. Fix it now."
answer noul yes 0.96
model jev-1.13.0 · 280 input tokens · est. cost $0.000012
That's it. No prompt engineering, no JSON parsing, no "As an AI language model...".
Think of it as an if statement that understands meaning.
| Type | Ask it when | You get back |
|---|---|---|
noul |
Something is true or not | Probability of "yes", 0 to 1 |
choice |
One option out of many must win | The winner plus a probability for each option |
score |
You want a position on a scale | A level on your own 2 to 10 step rubric |
For example, routing a ticket to the right team:
jev choice "Which team should handle this?" --state-file ticket.txt \
--option billing --option technical --option other
| Regular LLM prompt | jev-cli | |
|---|---|---|
| What you get | A sentence to parse | A number in a shape you defined |
| Same input tomorrow | Might be worded differently | Same contract, every time |
| Cost per short ticket | Cents | About a thousandth of a cent |
| In a shell script | Parse and hope | Branch on the exit code |
Answers become exit codes, so a shell script never has to read output:
if jev noul "Is this ticket about billing?" --state-file ticket.txt --fail-under 0.7 --quiet; then
echo "send to billing"
fi
Exit 0 means the condition holds. Exit 10 means it doesn't (and that is never treated as an error). Anything unsure can land in its own "ask a human" band with --abstain-band 0.4,0.6.
If you use Claude Code, Cursor or another AI agent, jev-cli can make it faster and cheaper. Instead of the big model spending tokens deciding "is this relevant?" a hundred times, it hands those small judgments to jev.
jev mcp serve runs it as an jev spec and jev schema describe every command in JSON, so agents don't guess--dry-run checks a request offline, for free, before anything is spent
claude mcp add jev -- jev mcp serve
curl -fsSL https://raw.githubusercontent.com/shaharia-lab/jev-cli/main/install.sh | sh
brew install shaharia-lab/tap/jev
Add your TypeSafe API key and ask your first question:
export TYPESAFE_API_KEY=...
jev noul "Is this message angry?" --state "You charged me twice. Fix it now."
Windows, Cargo and other options are in the installation guide.
jev-cli is free, open source and built in the open. If it saves you a parsing headache or a few dollars of tokens:
Disclosure: we maintain jev-cli. It is an unofficial, community project and is not affiliated with or endorsed by TypeSafe AI. "TypeSafe" and "Jev" belong to their owner. You need a TypeSafe API key to use it.