What it does
LocalJev, from GitHub Next, is a small TypeScript server for Bun that implements Jev’s POST /v1/systemone API on top of any OpenAI-compatible chat completions endpoint. By default it targets DiffusionGemma served by oMLX on a Mac, but anything that speaks chat completions works.
For each request it turns the state and typed questions into a classification prompt, asks the model for a JSON probability (or a vector of them), validates the result and retries malformed output, normalizes it, and returns Jev-shaped answers with choices, expected scores, and entropy-based confidence.
The README is upfront about the trade-off. OpenJev reads probabilities from the model directly, which needs unmerged vLLM extensions. LocalJev instead asks the model to state its probabilities, which is “wire-compatible, but not mathematically equivalent”, and it tells you to evaluate calibration on your own workload. A bake-off of five local models is included; it doesn’t compare against Jev.
Setup
bun install
cp .env.example .env # set LOCALJEV_UPSTREAM, its model and key
bun run start # http://127.0.0.1:8080
It needs Bun 1.2+ and a running model server. Settings cover the upstream URL, model and key, an optional LOCALJEV_API_KEY for clients, timeouts, retries, concurrency, queue size, and how many questions go into each model call.
Using it
We ran LocalJev in Docker against llama.cpp serving a small 1.5B instruct model on a four-core CPU, set a client API key, and called it with TypeSafe’s official Python SDK (0.7.0) using the same compatibility checks we run on every Jev reproduction.
- The tests pass. All 19 tests and the type check passed.
- It passed 11 of our 12 compatibility checks. All three question types, chat-message and JSON state, SDK
response_model parsing, Noul criteria, Choice options without descriptions, a 64-option Choice, a question without instructions, the model list, and rejecting a wrong key with the SDK’s authentication error.
- It names the version that answered. Responses report
localjev-0.2 rather than echoing jev-latest, which is how Jev itself reports versioned models.
- One difference. A pinned Jev name such as
jev-1.13.0 returns 404. jev-latest works, along with its own localjev-latest and localjev-0.2.
- Mind the timeout. On our CPU, a few larger requests took longer than the SDK’s default 10-second timeout. With a longer timeout they all succeeded. That’s our hardware and small model, not a LocalJev limit, but set the SDK’s
timeout accordingly with local models.
As with every model we test, we don’t judge the answers here: a 1.5B model on a CPU says little about what LocalJev does with a strong model.
Permissions and data
- Everything stays where your model runs. LocalJev sends the prompt to the upstream you configure, which is
127.0.0.1:8000 by default, and nowhere else.
- Authentication is optional. It listens on
127.0.0.1 by default and accepts any key unless you set LOCALJEV_API_KEY. Set it before exposing the port.
- Keys live in
.env. The upstream key is read from .env, which is gitignored, or from the environment.
Maintenance
Three commits on September 18 under the GitHub Next organization, MIT licensed, with tests, an evaluation framework, and a detailed first bake-off report. No issues yet. It reads as a focused experiment rather than a maintained product.
Verdict
LocalJev matched Jev’s API as closely as any self-hosted server we’ve tested, tied with jeff, and its small codebase makes it easy to understand and adapt. It’s ideal for developing Jev code offline, or for keeping requests on your own hardware with whatever model you already run. Just remember what the probabilities are: numbers a generative model wrote down, not scores read from its internals. Calibrate them on labeled data before any decision depends on them, and give the SDK a longer timeout on slow machines.
For servers that read probabilities directly, see openjev-sglang and jeff. For trained Jev-style models, see kev. Our Jev alternatives guide compares the approaches.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Sep 19, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.