How we reviewed this: we ran both backends in Docker on a 4-core i3-9100T with no GPU, measured with the machine otherwise idle, and read the licences ourselves rather than taking the badges. We made no Jev calls.
What it does
A local HTTP adapter that serves the same /v1/systemone shape as the real API, backed by one of two things you run yourself: a quantised LFM2.5-1.2B through llama.cpp, reading the logprob of the answer’s first token; or a ModernBERT-Ja-310m fine-tuned into a cross-encoder that scores each candidate.
It does not claim to reproduce Jev’s model, training or accuracy, and it says so in its own API responses. systemone.py:170:
return {'models':[{'name':name,'description':f'Local adapter for {self.model_id}; not the TypeSafe Jev model.',
That sentence, returned to every client that lists models, is the most honest thing in this group.
The only true drop-in here
We pointed the official typesafe-sdk at it, changing nothing but base_url and leaving the default 10-second timeout. Synchronous calls, async calls, models.list() and the 401 path all behaved correctly. Its own contract self-test agrees:
$ python3 -m tools.verify_api --url http://127.0.0.1:8080
PASS: HTTP contract, authentication, validation, mixed questions, probability sums
Of the four local projects we looked at, this is the only one where an existing application keeps working after a one-line change. Two of the others have no HTTP server at all.
The deployment defaults are also the best of the group. api_server.py:108 binds 127.0.0.1; :118 requires a bearer token; :47 compares it in constant time:
if not hmac.compare_digest(self.headers.get('Authorization','').encode(), ('Bearer '+api_key).encode()):
There is a body size cap and a concurrency gate that returns 529 with Retry-After. Small projects almost never have these. The caveat: the default key is the literal string local-dev, so anyone who changes --host to 0.0.0.0 without changing the key has an open endpoint.
And it refuses to fudge. jev_local.py:163:
else:
raise RuntimeError('Server did not return all candidate logprobs; refusing approximate scores')
What we measured
One request carrying three questions, twenty timed calls after three warm-ups, serial, machine idle:
| backend |
median |
p25 / p75 |
resident |
load |
| ModernBERT-Ja-310m fine-tune, fp32 |
1,165 ms |
1,075 / 2,406 |
1.48 GiB |
12.5 s |
| LFM2.5-1.2B Q8_0 via llama.cpp |
3,284 ms |
3,072 / 4,090 |
1.38 GiB |
1.6 s |
Hardware matters more than usual here: a 4-core i3-9100T with no GPU and no AVX-512. Treat these as an order of magnitude, not a benchmark. The spread between p25 and p75 is wide because both paths compete with themselves for four cores.
One result worth reading carefully. On an English support ticket that explicitly mentioned a Monday board meeting, the ModernBERT backend returned urgent: 0.395 — not urgent — with a frustration confidence of 0.021, which is very nearly a uniform distribution. That is not a defect. The model is fine-tuned on Japanese corpora, and docs/MODERNBERT.md says plainly that business-domain data is not included. We fed it out-of-distribution input and it correctly produced a shrug. The LFM backend, on the same ticket, returned urgent: 0.971.
The licences are the real story
This is billed as a local, open alternative. Three things we checked ourselves:
There is no LICENSE file. Not in the tree, not in git ls-files, and GitHub’s API reports license: null. With no licence, default copyright applies: no right to redistribute, no right to make derivatives. Whatever the intent, the legal position today is “all rights reserved”.
The default weights are not open in the usual sense. The LFM2.5 GGUF is under LFM Open License v1.0. We read it. Clause 5:
5. Commercial Use Limitation.
(a) The rights granted under this License for Commercial Use are conditioned upon You or
Your Legal Entity not exceeding the Threshold.
(b) Any Commercial Use of the Work or a Derivative Work by a Legal Entity that exceeds the
Threshold is not licensed under this Agreement.
and the definition, at line 22:
"Threshold" shall mean annual revenue of 10 million United States dollars ($10,000,000) or more.
If your company makes more than $10M a year, the default configuration is not licensed for your commercial use. That is exactly the kind of clause a “run it locally instead” story is supposed to escape, and it is easy to miss because the badge on the model page just says “other”.
The fine-tune is copyleft. argos1111/modernbert-ja-310m-jev is CC BY-SA 4.0, inherited from JGLUE and JCoLA in its training mix, even though the base model sbintuitions/modernbert-ja-310m is MIT. Derivatives must carry the same licence. docs/MODERNBERT.md lists every data source and its licence, which is more diligence than most projects manage — the consequence just isn’t spelled out.
Verdict
Five commits, one author, two days old, 49 tests passing in 0.08 s. Upstream CI is red, and we traced it: only macOS fails, on a test whose own assertion about ROCm pin arguments can’t hold on Darwin. Linux is green. That is a bug in the test, not the product.
Two things to know if you deploy it: the state cache writes llama.cpp slot snapshots to .cache/slots/ — mode 0700, deleted after each request, but those snapshots are the model’s internal representation of your text, so they belong in whatever data policy covers the rest.
Technically this is the best local adapter in the directory. We’ve asked about the licence, and until there is one we can’t recommend using it for anything you would ship.
Compare OpenDecision, which is Apache-2.0 but has no authentication.
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.