How we reviewed this: on four CPU cores in python:3.12-slim, no GPU, --network none, with the published weights from a local cache. We drove the library and the project’s own HTTP handler, sent its README’s example verbatim, and walked the validation paths. This is an open model — our own run of their model, with no Jev calls and no measurement of Jev.
What it does
A decision model that answers a typed question by reading the logits of the answer letters in one forward pass: noul for yes/no, choice over your options, score over ordered levels. Nothing is decoded — the answers carry "output_tokens": 0, and the readout is a slice of the language-model head, softmaxed through one fitted temperature (1.532 in the published checkpoint). Apache-2.0, weights on Hugging Face, and the server speaks POST /v1/systemone, so a client written against TypeSafe’s shape can be pointed at it.
Setup
The README’s quick start is jevk5-serve --model alibiserikbay/JevK5 --port 8090. On a machine without an NVIDIA GPU that is where it ends:
python -m jevk5.server --port 8090
AssertionError: Torch not compiled with CUDA enabled
JevK5.__init__ takes device, and JEVK5_GRAPHS=0 turns off the CUDA-graph capture, but main() passes neither — it constructs JevK5(args.model) and the default is "cuda". The library is fine on CPU; the shipped entry point is not, and the fix is one argparse flag. (We ran everything below by constructing the model with device="cpu" and serving the project’s own handler ourselves.)
Once it is up, its documented example reproduces exactly as printed:
POST /v1/systemone {"state": "I was billed twice, please refund",
"questions": {"refund": {"type": "noul", "instructions": "Asks for money back?"}}}
200 {"answers": {"refund": {"type": "noul", "noul": 0.8576, "confidence": 0.8576}},
"usage": {"input_tokens": 108, "output_tokens": 0}}
A 4B model in bfloat16 on four cores takes 16 to 26 seconds a decision, which is the wrong machine rather than a defect: this is built for a GPU, and the project’s own latency figures are its author’s, measured on an H100 and an L40S.
Using it
The three primitives answer in the shape the README documents, and a support ticket routes to billing at 0.82 against three teams. Bad requests are refused politely — an unknown type, a missing instructions, a choice with one option and a truncated body all come back 400 with a sentence. GET /health answers {"ok": true, ...}.
There is one shape it does not refuse. LETTERS is a sixteen-character alphabet, and options are zipped against it:
LETTERS = "ABCDEFGHIJKLMNOP"
"options": [{"letter": LETTERS[i], "description": d} for i, d in enumerate(options)]
Sixteen options answer normally. The seventeenth raises IndexError: string index out of range inside messages(), which do_POST does not catch, so the connection closes with no response at all — the client sees RemoteDisconnected and the traceback goes to the server’s log:
choice, 16 options 200 {"choice": "t0", "probabilities": {...}}
choice, 17 options RemoteDisconnected: Remote end closed connection without response
The validator already enforces a floor — “choice criteria must name at least two options” — so the ceiling belongs next to it, and neither the README nor the model card names sixteen as a limit. The same arithmetic applies to score, whose levels are letter-indexed too. Reported, together with the missing device flag, with a PR offered for both.
Permissions and data
Nothing leaves the machine: no key, no outbound call, the server binds 127.0.0.1 by default (--host can widen that, with no auth of any kind, so keep it where it is). Worth knowing before you design your options: the prompt carries your option keys as well as their descriptions — {"letter": "A", "description": "billing: payments and refunds"} — so unlike projects that keep transport identifiers out of the input, here the words you choose as keys are part of what the model reads.
Maintenance
Apache-2.0, a model card, a changelog, a results/ directory and a bench/ harness. There is no test directory and no CI: nothing in the repository runs the code on a push, which is how a sixteen-slot alphabet and an entry point that cannot start without CUDA both stay unnoticed.
The README’s headline — second of 76 systems in JevBench v1.4, first among open entrants — is a third-party benchmark’s result, reported by its author. We have not run that benchmark and do not republish its figures as ours.
Verdict
If you have a GPU and want Jev’s request shape answered by weights you hold, this is a clean, small implementation that reproduces its own example. Use the library rather than jevk5-serve until the device flag lands, keep your option list under seventeen, and treat your option keys as part of the prompt.
For the same idea with a stricter contract and a service that runs on a laptop, see AgentJev; for multilingual decisions, Laya; for serving open checkpoints in the same wire format, sys1.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Sep 24, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.