noul
Ask a yes/no question. The result is a probability for “true,” so your code can choose its own cutoff.
should_notify?
P(true) = 0.40
your policy decides
when 0.40 is enough
One localhost API · Laya + Jev
jev-laya-local-daemon keeps Laya ready on your machine and can send the same typed-decision request
to Jev through TypeSafe. Your app keeps one local endpoint and selects laya or jev
per request.
Why this exists
Laya needs a resident Python model process. Jev needs a hosted API key and network request. This gateway hides those provider-specific details behind one localhost endpoint while keeping the actual decision values untouched.
Shared decision primitives
Both models take a state plus typed questions and return probabilities instead of generated prose. That shared interface is what makes a direct comparison useful. See TypeSafe's workflow primitives and the Laya model interface.
noulAsk a yes/no question. The result is a probability for “true,” so your code can choose its own cutoff.
should_notify?
P(true) = 0.40
your policy decides
when 0.40 is enough
choicePick one option from a defined set and get a probability distribution across the available choices.
resume 0.22
inspect 0.24
reanalyze 0.19
test 0.35 ←
scoreRate something on an ordered scale, such as ignore → normal → urgent → critical.
ignore 0.0436
normal 0.1200
urgent 0.4692
critical 0.3672
What we actually tested
When we passed raw flags and numbers, Laya's answers barely changed. When we described what those facts meant in short plain-language sentences, the model reacted much more clearly.
{
"git_dirty": true,
"analysis_age_minutes": 240
}
{
"analysis": "The current analysis
predates major architectural changes
and is no longer trustworthy."
}
This is a small hand-built test, not a general benchmark. The goal was to see how Laya behaves inside an app, where it gets confused, and what kinds of decisions it can help with.
Initial comparison
I compared the models on next-action routing, binary escalation, ordinal urgency, paraphrase/order robustness, and deliberately ambiguous cases. The same fixture definitions are checked into this repository.
| Round | Laya 0.3.5 | Jev 1.13.0 |
|---|---|---|
| Choice routing16 strict cases | 14/16 · 87.5% | 16/16 · 100% |
| Noul escalation8 true · 8 false | 10/16 @ 0.5 · Brier 0.1905 best in-sample cutoff 0.463 → 14/16 |
16/16 @ 0.5 · Brier 0.00695 positive mean 0.945 · negative 0.100 |
| Score urgency4 levels · 16 cases | 8/16 top level · MAE 0.5404 | 14/16 top level · MAE 0.1356 |
| Choice robustness12 strict paraphrases · rotated option order | 10/12 · 2/4 groups fully consistent | 12/12 · 4/4 groups fully consistent |
| Ambiguity diagnostic4 intentionally debatable cases · not accuracy | preferred top-1 0/4 top probabilities stayed around 0.31–0.35 |
preferred top-1 4/4 confidence 0.66–0.99; 3/4 still ≥ 0.97 |
Laya works well when each decision receives only the state it needs. Packing many independent cases into
one shared object and asking each question to inspect state.case_XX caused nearly every answer
to collapse toward reanalyze. Four-case mixed batches showed the same pattern, so this was not
only a long-context effect.
Speed is not apples-to-apples: Laya ran locally on Apple Silicon while Jev ran on TypeSafe infrastructure, and the request shapes differ.
High probability is not the same as calibration. Jev stayed very confident on several deliberately ambiguous cases.
Upstream Laya reports a different ordering on its own typed-decisions benchmark. Different benchmarks measure different domains, so this page treats the results as product experiments rather than a universal ranking. See the upstream benchmark.
Applied benchmark
StateCarry is an open-source macOS app for returning to interrupted development work: it helps you understand where a project stands and decide what to do next. That made it a useful target for testing decisions such as continue, inspect, reanalyze, review a result, wait, reconnect, or choose different work.
Eight StateCarry states · seven related questions per state · identical questions in single and batch modes.
Keep the state small, English, and semantic. Prefer narrow choices or calibrated signals.
Use larger choice sets, stronger robustness, and batch related questions when network access is acceptable.
Keep one state + questions contract and select the provider per decision.
How to use it
The model worked best after the app had already gathered the facts and turned them into a short, clear description of the current situation.
Git state, tests, known changes, how old the analysis is.
Use simple templates to turn raw facts into short sentences.
Select Laya or Jev, then ask it to pick one option, rate something, or answer yes/no.
Your app owns the cutoff, fallback, and final action.
“Code gathers the facts. Simple templates explain what they mean. The selected provider handles the small decision. Your app decides what to do with the answer.”
Good request / poor request
Jev handled the tested multiplexed batches much better. Keeping cases separate is still the clearer contract when Laya is a possible provider.
The point of the comparison
No network dependency. Best with small, controlled decisions.
Stronger on these product-shaped tests and efficient when related questions are batched.
Switch per request without rebuilding the application around either provider.
These are observations from this benchmark, not a universal model ranking. Different domains, prompts, hardware, or future versions may change the result.
Run it locally
Let the agent handle the environment, install, port check, startup, and verification. The daemon stays on your own computer at a loopback address.
python3 --version
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
jev-laya-local-daemon
curl http://127.0.0.1:8787/ready
cp .env.example .env
JEV_API_KEY=your-typesafe-api-key
Put the key in the repo-root .env. The daemon loads it automatically, and local callers only send provider: "jev".
"provider": "laya"
or
"provider": "jev"
Check both with GET /v1/providers.
lsof -nP -iTCP:8787 -sTCP:LISTEN
or launch with
DAEMON_PORT=8790 jev-laya-local-daemon
Current conclusion
Keep Laya available for small local decisions. Use Jev when broader routing or hosted batching is worth the network hop. The application keeps the same localhost API either way.