Skip to content
MrJev

OpenDecision

Open-source semantic decision engine: state, a question in natural language, and answer criteria in; a structured decision out.

View on GitHub →

Hands-on review

Serves /v1/systemone from an off-the-shelf zero-shot classifier. Honest about what it is; ships with no authentication at all.

Good for

  • The most reproducible evaluation setup in this group — cases, scripts and results all committed
  • Says in its own README that its numbers are not a Jev comparison
  • An exact `uv.lock`, so the environment is reproducible

Watch out for

  • No authentication of any kind; a bare POST returns 200
  • `/v1/models` is not implemented, and the SDK's 10-second default always times out
  • `usage.input_tokens` undercounts: one choice runs two or three forward passes

Tested Sep 20, 2026 at 194dd11 · Docker on an i3-9100T, 4 cores, CPU only, no GPU; measured with the machine idle

How we reviewed this: we ran it in Docker on a 4-core i3-9100T with no GPU, measured with the machine otherwise idle, and pointed the official SDK at it. We made no Jev calls.

What it does

A FastAPI service that answers /v1/systemone by translating choice, noul and score questions into repeated calls to an existing zero-shot NLI classifier — MoritzLaurer/ModernBERT-large-zeroshot-v2.0, downloaded from Hugging Face on first use. It trains nothing itself; all of the judgement comes from third-party weights.

It works. One request with three questions came back correct on all three:

"department": {"choice":"technical","probabilities":{"billing":0.008,"technical":0.891,"sales":0.101}}
"urgent":     {"noul":0.901}
"frustration":{"score":1.109,"legend":{"0":"Calm","1":"Frustrated","2":"Extremely angry"}}

It is also unusually careful about what it claims. confidence is defined as one minus normalised entropy and the code says so — “This is OpenDecision’s confidence definition, not TypeSafe’s” — and the README states that its benchmark numbers are not an official comparison. The evaluation harness, the 500-case set and the per-case results are all committed, with a SOURCES.md marking which cases are paraphrased. That is the most auditable evaluation setup in this group.

It has no authentication

src/opendecision/api/app.py declares exactly two routes:

@app.get("/health")
@app.post(

and nothing in src/ mentions an API key, an Authorization header or a bearer token — the only hits anywhere in the tree are in an example script. A bare POST to /v1/systemone with no headers returns 200.

The README tells you to bind loopback, and the code does not enforce it. Anyone who types --host 0.0.0.0 — which is exactly what you do to test it from another container — has published an unauthenticated inference endpoint. Compare jev_local, which defaults to 127.0.0.1 and requires a token.

Two things break the drop-in story

The official SDK does work against it, after two adjustments.

Its default timeout is 10 seconds, and this cannot answer that fast on a CPU. Out of the box we got TypeSafeAPITimeoutError after three retries and 31 seconds. You have to pass timeout=600.0.

/v1/models returns 404, because it is not implemented. client.models.list() raises.

Neither is OpenDecision’s fault exactly — the SDK’s defaults assume a hosted service — but they are the first two things that break, and the README does not mention either.

What we measured

One request carrying three questions, twenty timed calls after three warm-ups, serial, machine idle:

median 8,358 ms
p25 / p75 8,115 / 8,481 ms
p95 11,242 ms
model load (warm cache) 4.9 s
resident 1.06 GiB

Two caveats that matter more than the number. First, this machine is a 4-core i3-9100T with AVX2 and no AVX-512 or AMX, and the checkpoint is bfloat16 — so bf16 arithmetic here is software-emulated. On a machine with AMX this would look very different. Second, we measured with nothing else running: an earlier run with a Docker build in the background gave about 40 seconds for the same payload on the same container.

The structural reason it is slow is visible in the code: a choice question runs two “semantic compilers” and a third arbitration pass when they disagree, so one question is two or three full classifier invocations.

Which leads to the accounting. usage.input_tokens counts the serialised payload once, and the code is upfront about it:

"""
Approximate logical API input size.

This is NOT currently intended to represent actual transformer
compute, because zero-shot classification may evaluate the same
state against multiple candidate hypotheses.
"""

Fine as documented behaviour; just don’t use that field for cost modelling.

Verdict

Apache-2.0 — though LICENSE:189 still has the unfilled template line Copyright [yyyy] [name of copyright owner], so nobody is actually named as the copyright holder. Nine commits, one author, three days old, CI on Python 3.13 with 10 tests passing.

The dependency floor is steep: Python ≥3.13, torch ≥2.14.0, transformers ≥5.17.0 — all the newest releases available, with no backward margin. The uv.lock at least makes it reproducible.

We did not re-run its 500-case evaluation, so its self-reported accuracy is unverified here. What we can say is that the harness and data are present and the claims are scoped honestly, which puts it ahead of most.

We’ve reported the missing authentication and the /v1/models gap. Don’t expose it beyond loopback until there’s a key.

See how it compares with other tools in Best Jev tools, tested hands-on.

Review updated Sep 20, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.

More in Open Models & Reproductions

Laya

★ 21k▲ 6.4k

NandhaKishorM/laya

Non-autoregressive decision engine over 100+ languages: three checkpoints and a router that detects the script and dispatches per request. Its benchmarks end with a limits section naming the datasets it does not generalise to and the headline figure that came from a training split.

PythonReviewed

kev

★ 6.3k▲ 5.9k

jaredpalmer/kev

Jev-style decision models from 0.5B to 8B, built as LoRA adapters on Qwen and served behind a Jev-compatible /v1/systemone API.

PythonReviewed

SemIf

★ 4.1k▲ 2.3k

TheoLeeCJ/SemIf-OpenJev

Jev-style decisions from a frozen 4B model on a single RTX 3090, with a browser demo. Formerly OpenJev.

PythonReviewed

Get new Jev projects every week

New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.

Powered by Buttondown. See our privacy policy.