Skip to page content
SAVRN
Search Plan a project

Open-weight model · Text classification

QJev3.5-0.8B-GGUF

by Ziyi LI ZY-Lee4/QJev3.5-0.8B-GGUF

QJev3.5-0.8B-GGUF is an open-weight model for text classification from Ziyi LI, released under Apache License 2.0. Its published files total 2.5 GB. It draws 100 downloads a month.

This is a 0.8B model we fine-tuned to make one narrow kind of decision very cheaply. It reads a state, a question, and a list of options, then returns a probability for each option. It never writes text.

Parameters—
Context—
Weights2.5 GB
Licenseapache-2.0
AccessOpen weights
Monthly Downloads100

Model Card

By Ziyi LI, published under apache-2.0, revision 93b77f35fbce.

This is a 0.8B model we fine-tuned to make one narrow kind of decision very cheaply. It reads a state, a question, and a list of options, then returns a probability for each option. It never writes text. One forward pass, one token, and you have a distribution your code can branch on. We built it for our own product first. An educational chatbot needed to decide, before spending a full LLM call, whether a student message was on topic, whether a tool call was safe to run, and whether an old tool result still had to be kept verbatim in the context. Those are small bounded judgments, and paying a 70B model to make them was absurd. It runs today on an office GPU at 80 to 150 ms per decision…

Read Ziyi LI's full model card

QJev 3.5-0.8B: a small decision engine you can run on a laptop

This is a 0.8B model we fine-tuned to make one narrow kind of decision very cheaply. It reads a state, a question, and a list of options, then returns a probability for each option. It never writes text. One forward pass, one token, and you have a distribution your code can branch on.

We built it for our own product first. An educational chatbot needed to decide, before spending a full LLM call, whether a student message was on topic, whether a tool call was safe to run, and whether an old tool result still had to be kept verbatim in the context. Those are small bounded judgments, and paying a 70B model to make them was absurd. It runs today on an office GPU at 80 to 150 ms per decision, and on a laptop with llama.cpp.

Base Qwen/Qwen3.5-0.8B, QLoRA r=32 alpha=64, merged into a single GGUF for release
Languages English and Chinese. The routing family is trained in both
Primitives choice over 2 to 26 options, yes/no, and ordered score levels
Size 812 MB quantised (Q8_0) or 1.52 GB (f16); 25.6 MB as a LoRA adapter
Speed 80 to 150 ms per decision, 9 to 14 decisions per second, no network
License Apache-2.0, same as the base model

Files

File Size What it is Same decision as the LoRA path
qjev35-lora-v5.gguf 25.6 MB LoRA adapter, the released version. Pair it with the base GGUF reference
qjev35-0.8b-f16.gguf 1.52 GB merged standalone model, f16, no --lora needed 99.4% (179 of 180)
qjev35-0.8b-q8_0.gguf 812 MB merged standalone model, Q8_0 98.9% (178 of 180)
qjev35-lora-v1.gguf 25.6 MB first adapter, kept so the v1 to v5 history can be re-run

Fidelity was measured on our 180 question product set: the merged models agree with the base-GGUF-plus---lora path on 179 of 180 (f16) and 178 of 180 (Q8_0) decisions, at 94.4% and 93.9% accuracy. Quantisation costs one or two answers in 180, nothing more.

What it does well, and what it does not

We ran the whole thing against the official Jev 1.13 API, against three open competitors, and against the base model without any fine-tuning. The short version is in the chart below.

Left two bars: our own task distribution, the one the model was trained for. Right two: held-out general benchmarks, where the base model is as good as our fine-tune.

On the distribution it was built for, fine-tuning is worth +67 points over the untouched base model (27.2% to 94.4% on 180 questions). On held-out general benchmarks it is worth nothing: the base model scores 50.6% on jev-bench held-out configs and our fine-tune scores 49.3%, with overlapping confidence intervals. The general axes belong to the backbone, and at 0.8B the backbone sits near 50%. The official API reaches 75.0% there. If general decision accuracy is what you need, use a larger model; the 4B prompt-based baselines land at 74 to 79% on JevBench.

We would rather write this down than let you find out after deploying.

Each point is a version we trained, scored on 231 public tasks (left) and 960 jev-bench rows (right). The solid line counts every source. The dashed line counts only sources the model never trained on. The two lines tell different stories about the same nine runs.

That gap is the most useful thing we learned. We spent two days improving a number that turned out to be mostly memorisation of the sources we trained on. After rebuilding the evaluation to hold out sources rather than records, the honest picture is: v1 to v11 gained 5 points on jev-bench held-out configs (44.3% to 49.3%) and 2.9 points on held-out JevBench families, where the confidence interval is 9 points wide. The rest was in-distribution.

Product family readout

The work we care about happens in four families: routing a message, judging a tool call, keeping or dropping context, and sorting an email. Each is measured on its own held-out questions. We extended the email and compaction sets past 100 questions each after discovering that 30 questions gave us a confidence interval 23 points wide.

Permissions and gate on the left, email and compaction on the right, both above 100 questions. Email is the hardest family and the one the next training run targets.

The four families are not equally hard, and that spread matters more than the average. Gate and permissions sit at 97 to 100%, email and compaction at 74 to 79%. Every training run we have done moved email the least, which is why it is the one we are working on now.

One honest note about versions. The released adapter is v5 because the later internal versions trade these two families away: on the 222 extended probes v5 scores email 69.1% and compaction 75.9%, while the newest internal version scores 64.5% and 63.4%. The older 30 question versions of these probes could not tell the two apart at all (both 83.3%), which is why we extended them. Every number in the tables above says which version it came from.

Latency, and how the alternatives compare

One protocol, p50 per decision. The official API number includes the network round trip; the local competitors were measured on their own recommended hardware.

Measured by us, each engine using its own prompt contract:

Benchmark official Jev 1.13 SemIf 4B S1Kit + 4B this model Laya
JevBench 231 public tasks 86.1% 78.8% 77.9% 62.8% 50.2%
jev-bench 960 rows 75.6% 50.5%
Chinese tickets, 40 items 75.0% 85.0% 72.5% 67.5%
Our 180 question set 91.7% 86.7% 94.4% 48.9%
tryjev SMS Spam, 200 rows 96.5% 81.5% 93.5%

We are ahead where we trained and behind where we did not. For a model that has to fit in 812 MB and answer in under a tenth of a second, that trade seems right.

Reliability

149 of 180 questions land in the top confidence bin, and they are right 96% of the time. ECE 0.0427. Confidence follows the official Jev formula, c = (pmax - 1/K) / (1 - 1/K), computed from the option letter distribution.

Confidence here is a statistic of the distribution, not a claim that the answer is correct. Use it to route: act above a threshold, escalate below. Out of domain it is over-confident, and so is the official API. On the three jev-bench configs where human annotators disagree with each other (ChaosNLI, hate speech vote shares, Civil Comments), no model we measured tracks human uncertainty, the official one included. We report total variation distance to the human distribution rather than pretending that axis is solved.

Quick start

Pair the adapter with the base model, which is the smallest download:

llama-server -m Qwen3.5-0.8B-Q8_0.gguf --lora qjev35-lora-v5.gguf \
  --port 8080 -c 4096 --jinja \
  --chat-template-kwargs '{"enable_thinking": false}'

python qjev_client.py --url http://localhost:8080 \
  --state "The build failed: missing pyarrow in the test venv." \
  --question "What should the agent do next?" \
  --options "install the dependency" "retry the build" "ask the user"

Or run a merged file on its own:

llama-server -m qjev35-0.8b-q8_0.gguf --port 8080 -c 4096 --jinja \
  --chat-template-kwargs '{"enable_thinking": false}'

In LM Studio: download either merged GGUF, load it, start the local server from the Developer tab, and point qjev_client.py at http://localhost:1234 with the model name LM Studio shows.

qjev_client.py uses nothing but the standard library. It asks for one token with top_logprobs from /v1/chat/completions and renormalises the option letters:

from qjev_client import decide, decide_bool, decide_score

decide("http://localhost:8080",
       "Disk usage hit 96% on the build host.",
       "Should the agent stop the pipeline?",
       ["stop and clean up", "continue", "escalate to a human"])
# [('stop and clean up', 0.91), ('escalate to a human', 0.07), ('continue', 0.02)]

decide_bool("http://localhost:8080", evidence, "Does the passage entail the claim?")  # P(true)
decide_score("http://localhost:8080", ticket, "How urgent is this?", levels)         # distribution

Option order does not matter. The client evaluates the order you gave and the reverse order, then averages the two distributions. That trick is worth 2 to 4 accuracy points at this model size, and we have used it since the first version.

Prompt format

Set the chat template with thinking disabled. The model was trained on this shape:

system: You are a judgment engine. Read the question and the options, then decide which single
        option best matches the state. Answer with EXACTLY ONE letter and nothing else.

user:   [QUESTION]
        {question}

        [OPTIONS]
        A. {option 1}
        B. {option 2}

        [STATE]
        {state}

The next token is the option letter. Its probability, renormalised over the letters you declared, is your distribution. For yes/no questions pass two options (false, true). For ordered levels, list them in order. The released GGUF ships a pass-through chat template, so a chat endpoint hands this text to the model unchanged.

Read the letters from log probs. Sampling text and parsing it throws away the whole point.

Scope

Good for bounded decisions where you know the options when you call the model: tool gating, permission allow/ask/deny, prompt injection and content checks, routing, context compaction, email triage, picking an entity, browser actions, and four ordered score dimensions.

Not for open-ended reasoning, general knowledge, mathematics, multi-hop planning, long document question answering, or judging free-form assistant output. The held-out numbers above are the reason, and they are properties of the 0.8B backbone.

Option cap is 26, using positional letters A to Z. The official Jev allows 255. That is a design limit rather than an oversight, and it is why we cannot run 77 way (Banking77) or 151 way (clinc150) tasks. We report it as a limitation instead of working around it with a hack.

Training data and license

Seventeen families, all synthetic or converted from public datasets: gate, permissions, compaction, email, entity, browser actions, four score dimensions, NLI (SciTail, MNLI, ANLI), CLINC, Banking77, MASSIVE Chinese, ToolACE, WANLI, CMNLI, tldr-pages, and nl2bash. Per-source licences are listed in SOURCES.md in the dataset repository. ANLI (cc-by-nc-4.0) is used for internal training only and is stripped from every published export. Weights are Apache-2.0, following Qwen/Qwen3.5-0.8B.

How we evaluate

Five rules, written down after we broke them:

  1. Hold out sources, not records.
  2. Treat any difference smaller than its confidence interval as no evidence.
  3. Fit on validation, report on test.
  4. Require at least three training seeds before claiming one version beats another.
  5. Keep domain numbers, held-out numbers, and competitor numbers in separate columns.

They are the reason the tables above are less flattering than our first release notes, and the reason we trust them more.

Known limitations

  • Held-out general accuracy sits near 50%, which is where the 0.8B backbone sits.
  • Five and six level ordinal scales that we did not train on score near chance, 25 to 27%.
  • Confidence is over-confident out of domain, on our model and on the official API alike.
  • The model leans on canonical option order more than one trained on shuffled orders would. Keep permutation averaging on, and if you train on this data yourself, shuffle the options per row. We found a fixed option order baked into 1,953 rows of our own training data; fixing it moved the position uniformity statistic from z = +6.6 to z = -0.2.

Citation

@misc{qjev35,
  title  = {QJev 3.5-0.8B: a small decision engine},
  author = {Lee, Jerry and contributors},
  year   = {2026},
  url    = {https://huggingface.co/ZY-Lee4/QJev3.5-0.8B-GGUF}
}

Independent work, written from scratch against the publicly described System One pattern. Not affiliated with, endorsed by, or connected to TypeSafe AI.

Identity and Version

Repository
ZY-Lee4/QJev3.5-0.8B-GGUF
Publisher
Ziyi LI
Task
Text classification
Modality
Text
Library
Not stated by the source
Parameters
Not stated by the source
Languages
en, zh
Revision
93b77f35fbce5a96e775bf1be09a827c08767c47
First published
2026-09-21
Last updated
2026-09-24

Files and Weights

105 files, 2.5 GB in total. The weights are 8 files totalling 2.5 GB in bin, gguf, safetensors.

Weights8 files · 2.5 GB
Configuration46 files · 2.1 MB
Tokenizer4 files · 40.0 MB
Documentation13 files · 87.7 KB
Other33 files · 324.9 KB
Repository1 file · 1.9 KB
Every file
FileTypeSizeSHA-256
adapter-v1/adapter_model.safetensorsWeights51.1 MB 0b26f6fa3f5a
adapter-v1/training_args.binWeights5.2 KB 70576214f250
adapter-v5/adapter_model.safetensorsWeights51.1 MB eaf29c1b7fe1
adapter-v5/training_args.binWeights5.2 KB c351202c60be
qjev35-0.8b-f16.ggufWeights1.5 GB b4abcde2be06
qjev35-0.8b-q8_0.ggufWeights811.8 MB b29a8e732100
qjev35-lora-v1.ggufWeights25.6 MB f3f19af8b9da
qjev35-lora-v5.ggufWeights25.6 MB 91470a6bf428
adapter-v1/adapter_config.jsonConfiguration1.1 KB —
adapter-v1/training_summary.jsonConfiguration309 B —
adapter-v5/adapter_config.jsonConfiguration1.1 KB —
adapter-v5/training_summary.jsonConfiguration293 B —
qjev_client.pyConfiguration6.4 KB —
reports/after.jsonConfiguration39.9 KB —
reports/baseline.jsonConfiguration41.3 KB —
reports/battery_v5.jsonConfiguration5.0 KB —
reports/battery_v5_seedext.jsonConfiguration676 B —
reports/battery_v6.jsonConfiguration4.8 KB —
reports/battery_v7.jsonConfiguration4.9 KB —
reports/calibration_v1.jsonConfiguration35.7 KB —
reports/calibration_v2.jsonConfiguration36.0 KB —
reports/calibration_v5.jsonConfiguration37.6 KB —
reports/calibration_v6.jsonConfiguration37.7 KB —
reports/calibration_v7.jsonConfiguration37.7 KB —
reports/control_openjev.jsonConfiguration86.5 KB —
reports/control_openjev_compaction.jsonConfiguration14.3 KB —
reports/decide_bench_seed_v5.jsonConfiguration1.0 KB —
reports/decide_bench_seed_v7.jsonConfiguration1.0 KB —
reports/engine_comparison_full.jsonConfiguration136.9 KB —
reports/engine_comparison_smoke.jsonConfiguration12.9 KB —
reports/nanojev_smoke.jsonConfiguration2.9 KB —
reports/nli3_v1.jsonConfiguration53.3 KB —
reports/nli3_v3.jsonConfiguration70.9 KB —
reports/nli3_v5.jsonConfiguration93.2 KB —
reports/nli3_v5_fmtfix.jsonConfiguration74.9 KB —
reports/nli3_v6.jsonConfiguration93.8 KB —
reports/nli3_v7.jsonConfiguration93.4 KB —
reports/nli_binary_v1.jsonConfiguration78.9 KB —
reports/nli_binary_v3.jsonConfiguration78.9 KB —
reports/nli_binary_v5.jsonConfiguration83.2 KB —
reports/nli_binary_v5_fmtfix.jsonConfiguration83.2 KB —
reports/nli_binary_v6.jsonConfiguration83.2 KB —
reports/nli_binary_v7.jsonConfiguration83.3 KB —
reports/nli_v1.jsonConfiguration47.1 KB —
reports/official_jev_seed.jsonConfiguration35.1 KB —
reports/official_jev_seedext.jsonConfiguration24.0 KB —
reports/openjev_v1_test.jsonConfiguration40.5 KB —
reports/openjev_v3_test.jsonConfiguration40.5 KB —
reports/openjev_v5_test.jsonConfiguration70.1 KB —
reports/openjev_v6_test.jsonConfiguration70.1 KB —
reports/openjev_v7_test.jsonConfiguration70.1 KB —
reports/v1_eval.jsonConfiguration39.9 KB —
reports/v1_vs_v2.jsonConfiguration68.4 KB —
reports/v1_vs_v3.jsonConfiguration68.4 KB —
MODEL_CARD.zh.mdDocumentation21.7 KB —
PROJECT-README.mdDocumentation28.6 KB —
README.mdDocumentation12.6 KB —
adapter-v1/README.mdDocumentation5.2 KB —
adapter-v5/README.mdDocumentation5.2 KB —
reports/after.mdDocumentation864 B —
reports/baseline.mdDocumentation841 B —
reports/battery_v5.mdDocumentation2.3 KB —
reports/battery_v5_seedext.mdDocumentation427 B —
reports/battery_v6.mdDocumentation2.2 KB —
reports/battery_v7.mdDocumentation2.4 KB —
reports/final_report.mdDocumentation4.4 KB —
reports/v1_eval.mdDocumentation836 B —
adapter-v1/chat_template.jinjaOther7.8 KB —
adapter-v5/chat_template.jinjaOther7.8 KB —
calibration.pngOther73.3 KB —
families.pngOther38.2 KB —
latency.pngOther43.3 KB —
reports/battery_v5_calibration.txtOther941 B —
reports/battery_v5_decide.txtOther350 B —
reports/battery_v5_nli3.txtOther768 B —
reports/battery_v5_nli_binary.txtOther632 B —
reports/battery_v5_openjev.txtOther532 B —
reports/battery_v5_seed.txtOther514 B —
reports/battery_v5_seedext.txtOther514 B —
reports/battery_v5_val.txtOther1.8 KB —
reports/battery_v6_calibration.txtOther993 B —
reports/battery_v6_nli3.txtOther760 B —
reports/battery_v6_nli_binary.txtOther632 B —
reports/battery_v6_openjev.txtOther532 B —
reports/battery_v6_seed.txtOther514 B —
reports/battery_v6_seedext.txtOther514 B —
reports/battery_v6_val.txtOther1.8 KB —
reports/battery_v7_calibration.txtOther991 B —
reports/battery_v7_decide.txtOther350 B —
reports/battery_v7_nli3.txtOther770 B —
reports/battery_v7_nli_binary.txtOther631 B —
reports/battery_v7_openjev.txtOther531 B —
reports/battery_v7_seed.txtOther514 B —
reports/battery_v7_seedext.txtOther514 B —
reports/battery_v7_val.txtOther1.8 KB —
reports/distractor_v5.jsonl.txtOther514 B —
reports/distractor_v5.txtOther514 B —
reports/val_probe_v5.txtOther1.8 KB —
trajectory.pngOther86.0 KB —
where-it-wins.pngOther47.8 KB —
.gitattributesRepository1.9 KB —
adapter-v1/tokenizer.jsonTokenizer20.0 MB 06b9509352d2
adapter-v1/tokenizer_config.jsonTokenizer1.1 KB —
adapter-v5/tokenizer.jsonTokenizer20.0 MB 06b9509352d2
adapter-v5/tokenizer_config.jsonTokenizer1.1 KB —

License and Download

License
apache-2.0
Access
Open weights, no gate
Download size
2.5 GB
Download from Ziyi LI

Released by Ziyi LI through its official repository on Hugging Face. Read the license.

Built From

Memory Requirements

PrecisionWeights in memory
As published2.5 GB

Weights only, from the published parameter count; the key-value cache and runtime add to this.

Questions About QJev3.5-0.8B-GGUF

Can I use QJev3.5-0.8B-GGUF commercially?

Yes. QJev3.5-0.8B-GGUF is released under Apache License 2.0. The Apache License 2.0 is a permissive open-source license. It permits commercial use, modification and redistribution. It requires keeping the license and copyright notices and any NOTICE file, stating significant changes, and it includes an express patent grant from contributors.

Similar Models

Model · Text classification

twitter-roberta-base-sentiment-latest

Cardiff NLP

This is a RoBERTa-base model trained on ~124M tweets from January 2018 to December 2021, and finetuned for sentiment analysis with the TweetEval benchmark. The original Twitter-based RoBERTa model can be found here and the original reference paper is TweetEval. This model is suitable for English. 0 -> Negative; 1 -> Neutral; 2 -> Positive This sentiment analysis model has been integrated into TweetNLP. You can access the demo here.

Open weights cc-by-4.0 514 tokens transformers

Model · Text classification

finbert-tone

Yi

FinBERT is a BERT model pre-trained on financial communication text. The purpose is to enhance financial NLP research and practice. It is trained on the following three financial communication corpus. The total corpora size is 4.9B tokens. More technical details on FinBERT: Click Link This released finbert-tone model is the FinBERT model fine-tuned on 10,000 manually annotated (positive, negative, neutral) sentences from analyst reports. This model achieves superior performance on financial tone analysis task. If you are simply interested in using FinBERT for financial tone analysis, give it a try. If you use the model in your academic work, please cite the following paper: Huang, Allen H.…

Open weights 512 tokens transformers

Model · Text classification

ms-marco-MiniLM-L-6-v2

Joshua

https://huggingface.co/cross-encoder/ms-marco-MiniLM-L-6-v2 with ONNX weights to be compatible with Transformers.js. If you haven't already, you can install the Transformers.js JavaScript library from NPM using: Note: Having a separate repo for ONNX weights is intended to be a temporary solution until WebML gains more traction. If you would like to make your models web-ready, we recommend converting to ONNX using Optimum and structuring your repo like this one (with ONNX weights located in a subfolder named onnx).

Open weights 512 tokens transformers.js

Model · Text classification

twitter-xlm-roberta-base-sentiment

Cardiff NLP

This is a multilingual XLM-roBERTa-base model trained on ~198M tweets and finetuned for sentiment analysis. The sentiment fine-tuning was done on 8 languages (Ar, En, Fr, De, Hi, It, Sp, Pt) but it can be used for more languages (see paper for details). This model has been integrated into the TweetNLP library.

Open weights 514 tokens transformers

Model · Text classification

unbiased-toxic-roberta

Unitary

The huggingface models currently give different results to the detoxify library (see issue here). For the most up to date models we recommend using the models from https://github.com/unitaryai/detoxify Trained models & code to predict toxic comments on 3 Jigsaw challenges: Toxic comment classification, Unintended Bias in Toxic comments, Multilingual toxic comment classification. Built by Laura Hanu at Unitary, where we are working to stop harmful content online by interpreting visual content in context. Score not directly comparable since it is obtained on the validation set provided and not on the test set. To update when the test labels are made available. It is also noteworthy to mention…

Open weights apache-2.0 514 tokens transformers

Model · Text classification

emotion-english-distilroberta-base

Hartmann

With this model, you can classify emotions in English text data. The model was trained on 6 diverse datasets (see Appendix below) and predicts Ekman's 6 basic emotions, plus a neutral class: 1) anger 2) disgust 3) fear 4) joy 5) neutral 6) sadness 7) surprise The model is a fine-tuned checkpoint of DistilRoBERTa-base. For a 'non-distilled' emotion model, please refer to the model card of the RoBERTa-large version. a) Run emotion model with 3 lines of code on single text example using Hugging Face's pipeline command on Google Colab: b) Run emotion model on multiple examples and full datasets (e.g.,.csv files) on Google Colab: Please reach out to [email protected] if you have any…

Open weights 514 tokens transformers