How we reviewed this: we read the code, diffed it file by file against laya 0.3.5 from PyPI, checked every install target the README names, and ran both copies of the pure-Python language router over the same eleven states in python:3.12-slim with no network. We made no Jev calls, and we did not download the checkpoints — the findings below do not need them.
What it says it is
“DeepOpen is a fully open-source, non-autoregressive System 1 decision engine”, with three checkpoints of its own — an English one “trained on ModernBERT-large, 421M parameters”, a multilingual one on mmBERT-base, and a typed-decisions one — trained with “RLCD reinforcement learning”, behind a router that picks the right one per request in under half a millisecond. It reports 32.8 ms single-request and 72.3 ms for ten on a T4, an accuracy of 0.766 against Jev 1.13.0’s 0.727, and “7.8x” Jev’s speed.
Those are the author’s figures, on the author’s hardware, and we do not republish other projects’ Jev comparisons. We did not need to evaluate them, because of what is below.
What it is
laya 0.3.5, the Python package from Convai Innovations, with the directory renamed. deepopen/presets.py is byte-identical to laya/presets.py. router.py still describes convaiinnovations/laya in its docstring and loads it in its code. The committed benchmark in research/results/t4_colab_benchmark.json names its models as convaiinnovations/laya and laya-multilingual.
| file |
laya 0.3.5 |
this repo |
changed lines |
presets.py |
187 |
187 |
0 |
email.py |
104 |
90 |
13 |
agent.py |
385 |
360 |
41 |
common.py |
280 |
251 |
27 |
lang.py |
242 |
183 |
90 |
router.py |
336 |
314 |
97 |
shortlist.py |
272 |
— |
removed entirely |
Laya is Apache-2.0, so building on it is allowed and the code is not hiding anything — the docstrings say Laya throughout. The README is where the two diverge: “基于laya” appears once, in the first sentence, and everything after it describes the checkpoints as DeepOpen’s own and their training as DeepOpen’s work.
You cannot install it
Every target the README names is missing:
| the README says |
what we got |
pip install deepopen |
404 on PyPI |
convaiinnovations/deepopen |
401 |
convaiinnovations/deepopen-multilingual |
401 |
convaiinnovations/deepopen-typed-decisions |
401 |
the deepopen-demo Space |
401 |
The three badges at the top of the README link to those same missing repositories. The convaiinnovations/laya* repositories the code loads all return 200, so a clone works and the documented install does not.
CI has never passed
ModuleNotFoundError: No module named 'laya'
E902 No such file or directory (os error 2)
The tests were copied without their imports being renamed — tests/test_router.py:7 still reads from laya.lang import ... — and .github/workflows/ci.yml:59 lints a laya/ directory this repository does not contain. So nothing has ever checked the edits. Which matters, because of the next part.
The router no longer routes
The README’s central argument for the router is that the English checkpoint does not degrade gracefully off English — it collapses while reporting high confidence, and it quotes a Khmer case at 0 accuracy and 95.2% confidence. router.py’s own docstring, inherited from upstream, says the same thing.
Upstream decides whether text is English like this:
# Undecided is not English. Treating it as English sent every Latin-script language we hold no
# stopwords for to the checkpoint that cannot read it, silently. ...
english = lang == "en" or (undecided and not prof_lat["looks_non_english"])
This copy decides it like this, at deepopen/lang.py:177:
"is_english": lang in (None, "en"),
Undecided is English again. The _NON_EN_DIACRITICS set that carried that fallback for Latin-script languages with no stopword list — Romanian, Polish, Czech, Turkish, the Baltic languages — was deleted along with it, as was the Romanian stopword list.
Both analysers are pure Python, so this costs nothing to check. The same eleven states through both:
| language |
laya 0.3.5 |
this repo |
| Romanian |
multilingual (ro) |
english (None) |
| Polish |
multilingual (None) |
english (None) |
| Latvian |
multilingual (None) |
english (None) |
| Czech |
multilingual (None) |
multilingual (fr) |
| Turkish |
multilingual (None) |
multilingual (es) |
| Hungarian |
multilingual (None) |
multilingual (fr) |
| Vietnamese |
multilingual (None) |
multilingual (fr) |
| German |
multilingual (de) |
multilingual (de) |
| English |
english (en) |
english (en) |
Three of eleven now go to the checkpoint that cannot read them, silently, which is the exact failure the project is sold on preventing. Four more reach the right checkpoint while naming the wrong language: upstream returns “undecided”, this returns French for Czech, Hungarian and Vietnamese and Spanish for Turkish.
Upstream’s test suite asserts against this directly — latin/undecided is flagged, latin/undecided names no language, route/undecided reason mentions letters. 31 of upstream’s 84 checks are absent from this copy, including all thirteen clamp/* checks on the temperature bounds.
Two more things that were removed
threading.RLock and its seven with self._lock: sites are gone from the Router. Upstream’s comment says it guards “model lifecycle (load/unload/attach/preload) and the LRU bookkeeping”, with inference deliberately left outside it. Router(preload=True) under concurrency — the configuration the README’s quick-start recommends — is what that lock was for.
shortlist.py, 272 lines, is gone entirely, along with its 488-line test file.
What is actually good here
router.py’s docstring is worth reading, and it is upstream’s: it gives the accuracy-by-language-family table that justifies routing at all, records that the English checkpoint scores 0.100 on Hindi and 0.103 on Korean against 0.050 for random guessing with an ECE of 0.855, and explains why typed-decisions must never be selected automatically. The committed t4_colab_benchmark.json carries a caveats block that names its training overlaps and states which checkpoint ships uncalibrated temperatures. That is careful work. It is Convai’s.
Verdict
If you want this, install the upstream: pip install laya, and the checkpoints at convaiinnovations/laya. You get the same code with its language fallback intact, its router lock intact, its shortlist module, and 84 tests that run.
We have reported the four items, and offered a patch for the routing revert and the test rename, both of which are small. Until the routing line goes back, do not point this at anything that might receive Polish, Romanian or Latvian.
For the upstream as we reviewed it in Node, see Laya for Node; for open decision models we have run ourselves, the open models category.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Sep 22, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.