Text classification
A text classification model doesn't write text. It reads a piece of text and answers questions about it — yes or no, pick one, or a position on a scale — with a probability for every answer. TurboLLM runs two kinds: Laya models, on their own engine on any OS, and Jev models (NLI cross-encoders), on vLLM. They share one place to find them, one playground and one API call, POST /v1/systemone.
What you ask, and what you get
You send the text (state) and a map of questions under ids of your own. There are three question types:
| Type | You ask | You get |
|---|---|---|
noul | A yes/no question | A number between 0 and 1: the probability of yes |
choice | Pick one from options you name | The chosen option and a probability for every option |
score | Where the text sits on an ordered scale you describe | A score (the probability-weighted level) and a probability for every level |
Because the answer is typed and comes with probabilities, your code can branch on it directly: route a support ticket, flag a message, gate an action. There is nothing to parse and no prompt to engineer. The field names follow TypeSafe AI's public System One API, so a client written for that shape only changes its base URL and key.
Laya or Jev?
| Laya | Jev | |
|---|---|---|
| What it is | A small decision model with English and multilingual checkpoints (Apache-2.0) | An NLI cross-encoder, such as OpenJev (MIT) |
| Runs on | The Laya engine: Windows, macOS, Linux; CPU or GPU | vLLM: Linux or WSL2, NVIDIA GPU |
| Size | About 1.5 GB | About 9 GB for the tested 4B checkpoint |
| Chat while it is loaded | Still available. It loads beside your chat model. | Workspace shows only the playground |
| Who works out the numbers | The model itself. TurboLLM passes its answers through. | TurboLLM, from NLI entailment scores |
| Endpoints | /v1/systemone | /v1/systemone, /v1/classify, /v1/rerank |
| Set-up guide | Laya | Jev |
If you're on Windows or macOS and want to try one quickly, start with Laya: it needs no vLLM and no WSL2. Reach for Jev when you want the NLI-style /v1/classify and /v1/rerank endpoints, or the larger model.
Find a model in Discover
Open Models → Discover and switch on the Text classification chip beside the sort menu. Search as usual, or leave the box empty to browse. The list works whichever chat engine is active, and each row shows which runtime it loads on (Laya engine or vLLM).
- It lists only what TurboLLM can run. A Laya repo is recognised from its files and its library tag; the MLX ports of Laya, which the Laya engine can't load, aren't listed. A Jev model is confirmed from the model's own
config.json: an NLI head with exactly the labels contradiction, entailment and neutral. Sentiment and toxicity classifiers carry the same Hugging Face tag but aren't listed, because TurboLLM can't run them. - Repos with no
.safetensorsweights aren't listed (some NLI repos ship onlypytorch_model.bin), because Discover can't download them. - The list comes from Hugging Face live, so it depends on how each repo is tagged and on Hugging Face being reachable. If a model you expect is missing, paste its address into Import from URL (the link icon beside the search box).
The two models these guides were written with:
- Laya:
https://huggingface.co/convaiinnovations/laya - OpenJev:
https://huggingface.co/AlexWortega/openjev
One playground
While a text classification model is loaded, the playground is where you try it. It is the same screen for both kinds: two editors that are the request (state and questions), a Run button, an answer card per question, and a Response tab and a curl tab so you can move from clicking to code. Nothing is sent until you press Run.
- A Laya model loads beside your chat model, so Chat, Code and Routines keep working.
- The Text classification tab sits under Chat, Code and Routines in the Workspace sidebar whenever your library holds a text classification model, and stays after you eject it. The playground's left column lists those models with a Load or Eject button, so you can start from an empty playground.
- A Jev model takes Workspace over while it is loaded: Chat, Code and Routines are hidden (not stopped) and open the playground instead. Everything comes back when it is unloaded.
- Switch model lists your chat models and your text classification models together, each text classification model with its runtime.
The playground lives at /workspace/text-classification. The old address, /workspace/jev, redirects there.
One API call
POST /v1/systemone takes the same request for either kind. Name the model in model; TurboLLM sends the request to the right runtime. The full field reference is on the Jev page and a worked Laya example is on the Laya page.
- Find the models.
GET /v1/modelslists them with"task": "text-classification", and"kind"is"jev"or"laya"to tell the runtimes apart. - Chat isn't available on them. Sending one to
/v1/chat/completions,/v1/embeddingsor/v1/messagesreturns a 400 (jev_model_wrong_endpointorlaya_model_wrong_endpoint) that says which endpoint to call. - Routines and coding agents can't use them. A routine can't be pinned to one,
turbollm launchrefuses one, andlist_modelsmarks each with itskindso an agent knows not to pick it. - The numbers differ by runtime. A Jev model's numbers are NLI entailment scores that TurboLLM works out; a Laya model's are its own. Neither is a calibrated probability, so check them on your own data before you set a threshold.
What isn't supported
- Other classifiers, such as sentiment, toxicity or topic models. TurboLLM runs Laya and NLI cross-encoders only.
- Non-Qwen NLI models are untested. Laya's
typed-decisionscheckpoint isn't downloaded and can't be picked.
Next
Laya →
Install the Laya engine, download convaiinnovations/laya, and ask your first question.
Jev →
Run an NLI model on vLLM, with the full /v1/systemone, /v1/classify and /v1/rerank reference.
API overview →
Base URL, authentication and the rest of TurboLLM's endpoints.