HunterAlphaHub
OpenRouter model reference Facts from the public catalogue, dated and labelled
Jev Laya Verified
2026-09-22

Laya · self-hosting

Running Laya yourself

The pitch for self-hosting a decision model is short: the data never leaves the machine, the bill never arrives, and there is no rate limit between you and the answer. What follows is the other half of that — what it costs in milliseconds, what the token budget really is, and the two places where the local copy behaves differently from what you would assume from the card.

An engraving: a small brass engine mounted on a workbench under a single lamp, driven by a narrow strip of paper feeding into it.

In short

  • Install is two commands — but install the CPU build of torch first, or pip pulls 2.7 GB of CUDA wheels for a model that never touches a GPU.
  • A question costs about a fifth of a second batched, on a 2018 laptop CPU. One unbatched question costs a third of a second.
  • The state budget is smaller than the context window. 512 tokens means ~320 for your ticket once the options have taken their share.
  • One shipped temperature is refused by its own library, which means every choice question with 11+ options publishes a confidence that the library calls uncalibrated.
  • The server routes; the library does not. A non-Latin state gets answered by a different checkpoint than the one you loaded.

What it takes

ItemValue
Machine we ran onIntel i7-8550U, 4 cores / 8 threads, 2018 laptop part · 15 GB RAM · none — CPU only, torch intra-op threads 4
SoftwarePython 3.12.3 · laya 0.3.11 · torch 2.14.0+cpu · transformers 5.17.0
Installtorch from the CPU wheel index, then `pip install "laya[serve]"`; the default torch pull is the CUDA build, 2.7 GB of wheels for a model that runs on a CPU
Weights2.3 GB for all three checkpoints; 843 MB for the English one alone, encoder included
First callAbout 2 s to import, 4–6 s to build the checkpoint, then 0.3 s per call
KeyNone. The weights are public and the package takes no credentials.

The install detail is not pedantry. `laya` depends on torch, and a plain `pip install` pulls the CUDA build — 2.7 GB of wheels, on a machine that will run this on its CPU. Installing torch from the CPU wheel index first takes the download to a fifth of that and the model does not notice the difference.

The loading time we quote is the current one: the card says the checkpoint build dropped from about 22 s to about 2 s because it no longer initialises throwaway random weights. The 4–6 s we measured is the wall clock including a cold file cache on a laptop; the builds after the first were faster.

What a question costs on a CPU

Three shapes of call, five repeats each, on the same ticket-like state. Batched questions are the reason this is usable at all: the per-question cost falls by a third at ten questions and then stays flat, so the thing to optimise is how many questions you ask per forward pass, not how many calls you make.

Questions in the callMedian wall clockPer questionNote
1 0.302 s 302 ms the least flattering case: no batching
10 2.088 s 209 ms —
50 10.409 s 208 ms flat from here up
Source tools/laya-lab/laya-probe.py, suite F Verified 2026-09-24 Wall clock around a single `system_one` call: no HTTP, no queueing, weights resident.

For scale: the hosted model we have measured from this machine took 783 ms median for the same shape of call, over the network. That is not a speed comparison — one number has a round trip inside it and the other does not — but it is the honest frame for "is local fast enough": a third of a second locally against about four fifths of a second remotely, before you count the GPU you would need to reach the publisher's 32.8 ms.

The budget nobody reads until it truncates

Options and state share one window. The model card puts it plainly, and it is the single most useful line on it for anyone integrating this:

CheckpointContextOption budgetLeft for the state
laya 512 192 ~320 tokens
laya-multilingual 1,024 256 ~768 tokens
laya-typed-decisions 1,024 256 ~768 tokens

A long ticket therefore gets truncated before the number you configured suggests, and the model does not refuse — it answers from whatever survived. Our ten-thousand-character case came back with a label at 0.0199 confidence, which is the shape of the right behaviour: cut off, but not certain about it.

Sharp edge one: the temperature the library will not use

Laya's calibration story is a fitted temperature per question type and option count — without it the mean ECE is 0.466, with it 0.081. Those numbers ship in the checkpoint's own config, and one of them is outside the range the library accepts:

BucketShipped valueAppliedEffect
choice:11+ 0.1006 0.5 Clamped, with a warning on load
choice:2 1.9064 1.9064 Used as shipped
choice:3-5 1.7602 1.7602 Used as shipped
choice:6-10 1 1 Used as shipped
noul:2 1.9834 1.9834 Used as shipped
score:3-5 1.2514 1.2514 Used as shipped

The warning is verbatim from the library: this checkpoint ships invalid temperatures or values outside [0.5, 5]; using choice:11+=0.10058280825614929 -> 0.5. Treat confidence from the affected entries as uncalibrated.

A temperature below 1 multiplies the logits, so 0.1006 would sharpen a distribution roughly tenfold and 0.5 still doubles it. That is measurable. On thirty candidate intents — six unmistakable tickets, five option-set sizes — the published confidence was 0.96 on average where the model's own untempered distribution gives 0.89:

OptionsCorrectPublished confidenceBefore the fitted temperatureTemperature
4 4 / 6 0.692 0.864 1.760
10 5 / 6 0.95 0.95 1.000
20 5 / 6 0.949 0.917 0.5 (clamped)
21 5 / 6 0.973 0.931 0.5 (clamped)
30 5 / 6 0.959 0.893 0.5 (clamped)
Source tools/laya-lab/laya-probe.py, suites E and E2 Verified 2026-09-24 The last column takes the published probabilities and divides the fitted temperature back out, using the library's own confidence function.

Notice the direction at four options: there the temperature is 1.76, it softens the distribution, and published confidence is lower than the raw one (0.69 against 0.86). At eleven and above the fitted value sharpens instead. Calibration should be allowed to do both; the problem is narrower and more specific than "the numbers are wrong" — the value for the largest bucket is not the fitted one, and the library says so out loud.

What to do about it: fit your own temperature on your own data, which the card recommends anyway, and set `agent.temperature_by_options` yourself. Do not assume the calibration in the artifact is the one running in your process.

Sharp edge two: the server routes, the library does not

If you load a checkpoint directly you get that checkpoint. If you run `laya-serve`, you get whatever the router picks after looking at the script of the state — and for a non-Latin state it will not be the English one. The router says why in the response:

“non-Latin script (han, 100% of letters); the English checkpoint cannot read it”

CallerAnswer for the Chinese ticketConfidence
English checkpoint, loaded by handbilling0.3397
laya-serve, which routesshipping from multilingual0.9974

This is a feature — the card's own numbers show the English checkpoint collapses on non-Latin script, and the router is the fix. It is also a trap for anyone who benchmarks the checkpoint and deploys the server, or the other way round. Two deployments of "Laya" can be two different models.

What did not reproduce

The card attributes the high-cardinality weakness to the fixed per-option token budget, so we tested that directly: twenty options, the same discriminative words in every label, and a neutral sentence appended to all of them. If the budget is the binding constraint, accuracy should have fallen. It moved one item out of six — 5 of 6 with short labels against 4 of 6 with 27-word labels.

One item on six tickets is noise. Reproducing the collapse properly needs the card's own benchmark at 77 labels rather than a stranger's thirty, and we are saying that rather than reporting the coin flip as a result. What we can say is the narrower thing: at 30 labels our six tickets did not collapse, they answered 5 of 6 — and the confidence climbed with the option count, which is the number to watch rather than the accuracy.

What this page cannot tell you

It cannot tell you how Laya behaves on a GPU, on Apple silicon, or under load — one laptop with nothing else running is the whole of our evidence. It cannot tell you whether 0.21 s per question is fast enough for your loop, because that depends on the loop. And it cannot tell you the memory footprint of a long-running service: we measured a process that ran for minutes, not days, and the router keeps two checkpoints resident by default.

Do I need a GPU to run Laya?

No. The English checkpoint is 421M parameters and runs on a CPU: we measured 0.30 s for one question and 0.21 s per question once batched, on a 2018 four-core laptop part with no accelerator. The weights are about 843 MB for that checkpoint, or 2.3 GB if you keep all three.

How much of my state actually reaches the model?

Less than the context window suggests. The options are rendered into the same window as the state, so the English checkpoint's 512 tokens split into a 192-token option budget and roughly 320 tokens for the ticket. The multilingual and typed-decisions checkpoints give the state about 768 of their 1,024.

Can I trust the confidence number from the local model?

For choice questions with eleven or more options, the library says no. The checkpoint ships a temperature of 0.1006 for that bucket, which is outside the range the library accepts; it clamps to 0.5 and warns on load that confidence from those answers is uncalibrated. In our 30-option test the published confidence was 0.96 where the model's own untempered distribution gave 0.89.

Does the local server behave like the library?

Not always. `laya-serve` routes by script, so a Chinese state is answered by the multilingual checkpoint rather than the English one you may have loaded and tested; the router's own reason string is 'the English checkpoint cannot read it'. If you benchmark by loading a checkpoint directly, you are measuring something the server will not do.

Send us a link

A project built with Jev, a post, a video, a correction, a tip. We open the link, check it says what you said it says, and write the entry ourselves.

Required a link, and an email to reply to. Optional everything else.

Add context — all optional

One or two sentences about what it does, in your words. We write the entry ourselves.

Cost, latency, a benchmark — anything you measured. We attribute these to you.

We store what you type and email it to ourselves. No IP address, no user agent, no referrer — the same rule as the mailing list.

What happens to what you send →