NotJev
Serves the Jev request shape from any OpenAI-compatible endpoint by reading single-letter option probabilities from logprobs.
Overview
NotJev turns any OpenAI-compatible model that returns logprobs (vLLM, llama.cpp, Ollama, OpenAI) into a Jev-style decider. It presents options as A., B., C. and so on, asks for one token with max_tokens 1, keeps only the probability mass on the option letters and renormalises it, producing a verdict, a margin and tunable abstention. It speaks the /v1/systemone wire contract and supports up to 26 options.
The pitch is that the same model already serving your chat stack becomes your System 1: decide with one token, and escalate thin margins to the same model's /v1/chat/completions as System 2. The README is candid that one token means no deliberation, probabilities are ordered but not calibrated, and raw p1 does not survive a change of engine, while the band does. It is a zero-dependency Node package with single-file binaries, an optional MCP mode and an optional node-llama-cpp backend.
What the decision model decides
| Type | Question | Answers |
|---|---|---|
| Choice | verdict (e.g. are these two names the same person?) | SAME · OTHER |
How it works
- Format options as lettered choices in the prompt.
- Request one token with logprobs from the endpoint.
- Renormalise letter mass to get choice, p1 and band.
- Abstain below theta and escalate to full chat.
Strengths
- Works with models you already run; no new weights.
- Zero runtime dependencies; one HTTP request per decision.
- Built-in abstention via a threshold.
Caveats
- Probabilities are not calibrated.
- Limited to 26 options.
- Requires an endpoint that returns logprobs.
Getting started
npm install notjev, set NOTJEV_BASE_URL and NOTJEV_MODEL, then call createClient().decide({ state, question, options, theta }) or run notjev serve --port 8787.At a glance
- Type
- Service
- Status
- beta
- Language
- JavaScript
- Runtime
- Node, CLI, HTTP server, MCP server
- Has code
- yes
Use cases and integrations
How curated lists describe it
Serves the Jev request shape from any OpenAI-compatible endpoint by presenting options as single letters and reading the letter mass out of `logprobs`.
MrJev/awesome-jev
Frequently asked questions
How does NotJev get probabilities?
It reads logprobs for a single lettered answer token and renormalises over the option letters.
Are the outputs calibrated?
No, the README says they are ordered but not calibrated.
Can existing Jev clients call it?
Yes, notjev serve speaks the /v1/systemone wire contract.
Related projects
llama.cpp-based C++ server that turns any LLM into a System One decision model, reading answers from next-token logits.
ProjectbetaC++MLX library that turns an existing local model into a decision engine by reading candidate logits, with no fine-tuning, on Apple Silicon.
ProjectprototypePythonLocal server (xks) implementing Jev's /v1/systemone contract on an open-weight LLM, accelerated with Xeon Phi cards.
ProjectresearchRustEducational C11 library and CLI that turns DiffusionGemma 26B into a CPU-first OpenJev-style decision engine reading candidate logits.
ProjectresearchCExperimental engine that makes an existing LLM do Jev-like classification and scoring by reusing context and building JSON.
ProjectresearchPythonReads typed decisions from one forward pass of PrismML's 1.75-bit Bonsai 27B under llama.cpp, using the OpenJev/SemIf logit method.
ProjectresearchPython