A calibrated typed-decision model: give it a state (text, ticket, policy, JSON) and a typed question — choice, boolean, or rubric score — and it returns a probability for every option in a single forward pass (~24 ms). No generation, no parsing, nothing to hallucinate. 12 of 13 subsets exceed Bespoke Nimble-9B — a model 2.2× its size — same prompt format, same scoring protocol. The primary suite: BoolQ, MultiNLI, PAWS, PubMedQA, SQuAD-2, VitaminC, Civil Comments, Aegis 2.0, MASSIVE (en/de), HelpSteer-2, SummEval (consistency / relevance). Every item human-labeled; byte-reproducible (manifest-locked ids + sha256); same protocol as the Bespoke Nimble evaluation. Wins: verification-style noul…
Open-weight model · Text classification
OpenJudgement-4B-Preview
by Kitani kitaniai/OpenJudgement-4B-Preview
OpenJudgement-4B-Preview is an open-weight model for text classification from Kitani, released under Apache License 2.0. It has 4.5B parameters and a 262,144-token context. At 16-bit it needs about 10.9 GB of GPU memory, which fits on 1x MI300X from $1.85 an hour, at the lowest prices in the SAVRN Index. It draws 4 downloads a month.
Experimental open-weights judgment model by Kitani OpenJudgement is unfinished. We're releasing this checkpoint for people to experiment with, inspect, and build on. It still needs work on judgment quality, calibration, and inference efficiency.
Runs On
What it takes to serve OpenJudgement-4B-Preview (4.5B parameters): the memory its weights need at each precision, and the cheapest way to rent enough data-center GPUs to hold them.
| Precision | Weights | Memory needed | Cheapest setup | Per hour | Also fits |
|---|---|---|---|---|---|
| 16-bit | 9.1 GB | 10.9 GB | 1x MI300X (192 GB) Vultr |
$1.85 | 1x H100 $1.99 · 1x MI325X $2.00 |
| 8-bit | 4.5 GB | 5.4 GB | 1x MI300X (192 GB) Vultr |
$1.85 | 1x H100 $1.99 · 1x MI325X $2.00 |
| 4-bit | 2.3 GB | 2.7 GB | 1x MI300X (192 GB) Vultr |
$1.85 | 1x H100 $1.99 · 1x MI325X $2.00 |
Memory is the weights at that precision plus 20% for the runtime and a short context; a long context needs more. Prices are the lowest on-demand hourly rates in the SAVRN Index, read Oct 1, 2026.
OpenJudgement-4B-Preview on every accelerator the SAVRN Index prices, at every precision
Model Card
By Kitani, published under apache-2.0, revision eb2384f98ffa.
Experimental open-weights judgment model by Kitani OpenJudgement is unfinished. We're releasing this checkpoint for people to experiment with, inspect, and build on. It still needs work on judgment quality, calibration, and inference efficiency. It is not as good as Jev overall in our internal task comparisons. It does show a meaningful improvement over untouched Qwen on our recorded validation comparison: 75.4% versus 64.2% annotation agreement. That is a result on a particular evaluation set, not a claim that we beat the base model on every task. There are questions it handles well and questions it confidently gets wrong. Please judge the preview by your own examples rather than assuming…
Read Kitani's full model card
This is a preview, and we mean that
OpenJudgement is unfinished. We're releasing this checkpoint for people to experiment with, inspect, and build on. It still needs work on judgment quality, calibration, and inference efficiency.
It is not as good as Jev overall in our internal task comparisons. It does show a meaningful improvement over untouched Qwen on our recorded validation comparison: 75.4% versus 64.2% annotation agreement. That is a result on a particular evaluation set, not a claim that we beat the base model on every task.
There are questions it handles well and questions it confidently gets wrong. Please judge the preview by your own examples rather than assuming that clean JSON means a correct answer.
What is this?
OpenJudgement-4B-Preview is a Qwen3.5-4B derivative trained on custom typed-judgment datasets. Give it evidence, a question, and criteria; it returns a probability or a distribution over your answer options.
It supports three question types:
| Type | What it returns | Example |
|---|---|---|
| Noul | A number from 0 to 1 for the true option | Does this ticket describe a damaged delivery? |
| Choice | A selected key and probabilities over named options | Which support team should handle it? |
| Score | An expected value over an ordered rubric, plus its distribution | How urgent is this request? |
The API accepts multiple questions about the same state. The reference runtime currently evaluates those questions sequentially; it does not share document computation between them.
This is the checkpoint previously named OpenJudgment-4B-v2, released under the Preview name. The weights are unchanged. It does not contain our later experimental shared-document reader or encoder models.
How we modified Qwen
We kept Qwen's pretrained backbone, tokenizer, and vocabulary output head. We trained rank-16 LoRA adapters on the text backbone, including its attention, recurrent, and feed-forward projections, then merged the selected adapters into the released weights.
The important change is the training objective and inference path:
state + question + indexed answer criteria
↓
Qwen3.5 text backbone, one forward pass
↓
scores for answer-index tokens: 0, 1, 2, ...
↓
temperature scaling + probability normalization
↓
Python constructs the response JSON
Each candidate is assigned a numeric index. We score the corresponding next-token logits at the final prompt position, normalize over the available candidates, and train against the target distribution. We preserve soft human-label distributions where the dataset provides them. Thinking is disabled in the prompt.
The model does not generate the JSON token by token. It also does not generate an explanation or a hidden reasoning trace through this runtime. It remains an LLM-derived model with a causal backbone; this is not a newly invented encoder architecture or a model trained from scratch.
All options for one question are scored together. Seven questions still require seven backbone passes. This distinction matters when measuring latency.
Run it
The reference implementation uses Python 3.12, PyTorch, and Transformers. A CUDA GPU is recommended. The stored weights alone are approximately 9.1 GB; activations and runtime overhead require additional memory, especially for long inputs. CPU execution is available through device="cpu", but uses float32 weights and is much slower.
Download the repository, including its Python files and weights:
python -m venv .venv
source .venv/bin/activate
python -m pip install huggingface_hub
hf download kitaniai/OpenJudgement-4B-Preview --local-dir ./OpenJudgement-4B-Preview
cd OpenJudgement-4B-Preview
# Linux / NVIDIA CUDA 12.8 reference installation:
python -m pip install torch==2.8.0 --index-url https://download.pytorch.org/whl/cu128
python -m pip install -r requirements.txt
python examples/basic.py --device cuda
Use a PyTorch build appropriate for your platform if you are not using that CUDA environment. The merged checkpoint does not require PEFT for inference.
From a Python script in the downloaded repository:
import json
from openjudgement import OpenJudgement
model = OpenJudgement.from_pretrained(".", device="cuda")
result = model.system_one(
state={"ticket": "My parcel arrived with a cracked screen. I need a replacement."},
questions={
"damaged_delivery": {
"type": "noul",
"instructions": "Does the customer report receiving a damaged item?",
},
"team": {
"type": "choice",
"instructions": "Which team should handle this ticket?",
"criteria": {
"shipping_returns": "Damaged deliveries, returns, and replacements.",
"billing": "Payment failures, duplicate charges, and invoices.",
"account": "Passwords and account access.",
},
},
"urgency": {
"type": "score",
"instructions": "Rate urgency using this ordered rubric.",
"criteria": [
"Routine information request; no reported problem.",
"Minor inconvenience; the product is still usable.",
"Damaged or unusable product requiring a timely resolution.",
"Immediate danger or an explicitly reported safety emergency.",
],
},
},
)
print(json.dumps(result, indent=2))
print(result["answers"]["damaged_delivery"]["noul"])
print(result["answers"]["team"]["choice"])
print(result["answers"]["urgency"]["score"])
Once these Python files are available, OpenJudgement.from_pretrained("kitaniai/OpenJudgement-4B-Preview", device="cuda") can also download/cache the weights. Pass revision="<commit SHA>" to pin a Hub checkpoint.
Use the supplied wrapper, not a generic text-generation or text-classification pipeline. Simply calling .generate() does not reproduce this judgment API.
Serve a small HTTP API
From the downloaded repository:
uvicorn serve:app --host 127.0.0.1 --port 8000 --workers 1
The API loads one model instance. It exposes /health, /v1/judgments, and interactive API documentation at /docs.
curl http://127.0.0.1:8000/v1/judgments \
-H 'Content-Type: application/json' \
--data-binary @examples/request.json
Or run the included standard-library Python client:
python examples/client.py
OPENJUDGEMENT_MODEL, OPENJUDGEMENT_DEVICE, and OPENJUDGEMENT_MAX_LENGTH override the local model path, device, and context limit. Use one worker per model instance; increasing Uvicorn workers loads additional copies. This is a minimal local serving example, not a managed production service.
Understanding the response
- Noul:
answers[key].noulis the model's normalized true-option probability. Optionalcriteriamust contain both"true"and"false"descriptions. Absence of evidence is not universally the same as falsity; define your intended meaning in the question. - Choice:
choiceis the highest-probability key;probabilitiescontains every supplied key. Keys remain in input order. - Score: rubric positions are zero-based.
scoreis the probability-weighted position, not necessarily the winning level. With four criteria, its range is 0–3.legendmaps positions to their descriptions. - Confidence: Choice uses normalized maximum probability,
(K × max(p) − 1) / (K − 1); Score uses1 − H(p) / log(K). These are distribution-concentration heuristics, not independently calibrated probabilities of correctness.
Per-type temperatures from calibration.json are applied before normalization. This improves fit to the recorded calibration data; it does not guarantee reliable uncertainty on a new domain. We do not claim these formulas reproduce Jev's internal calibration.
Training and data
Dataset available at kitaniai/OpenJudgment-4B-Preview.
The custom corpus adapts human-supervised preference, moderation, evidence-assessment, and intent datasets into the same typed decision format. Sources include HelpSteer3, Aegis 2.0, ClimateCheck, UAReviews, and CoVal. This is not a dataset of Jev API responses.
| Item | Recorded value |
|---|---|
| Full corpus | 111,049 decisions |
| Training split | 87,621 decisions |
| Native training-split input tokens | 98,928,078 |
| Selected checkpoint | Step 700 |
| Examples seen at selected checkpoint | 44,741 |
| Input tokens seen at selected checkpoint | 49,046,168 |
| LoRA rank | 16 |
| Stored model parameters | 4,539,265,536 |
Corpus size, training-split size, and actual training exposures are different quantities. The selected checkpoint did not consume every training row. The repository retains the complete upstream backbone, including multimodal weights, but the judgment API is text-only.
Source revisions, annotations, adaptations, and source-specific licenses are documented in the dataset. Original training and evaluation records are retained in reports/; historical filenames and repository names in those records reflect the run at the time.
How good is it?
The saved comparison against untouched Qwen used the same 786 validation decisions:
| Metric | Qwen3.5-4B base | Selected fine-tune |
|---|---|---|
| Annotation argmax agreement ↑ | 64.2% | 75.4% |
| Macro-source negative log-likelihood ↓ | 0.918 | 0.661 |
The calibrated release recorded 76.8% annotation agreement on 816 test decisions. That test figure is not a base-versus-fine-tune comparison. Some targets encode subjective preferences or tied human votes, so agreement is not universal factual accuracy. Validation was used for selection and is not an untouched final test.
Full per-source and per-type results are in reports/final_metrics.json. These numbers are not a Jev benchmark and should not be read as a general model ranking. Our separate internal comparisons still put Jev ahead overall.
Known problems
It's unfinished. Date arithmetic, experience-duration questions, nuanced qualifiers, unfamiliar rubrics, and complicated evidence combinations can still go wrong. It can assign confident scores to an incorrect answer. Results vary by domain, and a better aggregate result can hide weak individual tasks.
The runtime currently supports 2–10 options per Choice or Score question, 1–128 questions per request, and a configured limit of 32,768 tokens per encoded question, including state, criteria, and prompt overhead. Oversized questions are rejected rather than silently truncated. Supporting a context length is not a guarantee of equal quality throughout that context.
Performance depends on hardware, input length, question count, and kernel support. Transformers can fall back to slower PyTorch implementations for Qwen's recurrent layers if optimized dependencies are absent. We are not advertising a universal latency number for this preview.
Why release it now?
The checkpoint is useful enough to experiment with, and the implementation is small enough to inspect. We would rather make the working weights, data, and inference path available than present an unfinished experiment as a finished Jev replacement.
The remaining work includes better evidence reasoning, stronger domain coverage, calibration, and reducing repeated work across questions. If you benchmark this checkpoint, please call it OpenJudgement-4B-Preview so the results stay tied to this release.
Attribution and license
Developed by Kitani, based on Qwen3.5-4B from the Qwen team / Alibaba. The upstream developers are not responsible for our fine-tuning, runtime, evaluations, or model behavior.
Model and release code: Apache 2.0; see LICENSE and NOTICE. Dataset contents retain their source-specific terms; the model license does not relicense the dataset.
Configuration
- Architecture
- Qwen3_5ForConditionalGeneration
- Context length (tokens)
- 262,144
- Layers
- 32
- Hidden size
- 2,560
- Feed-forward size
- 9,216
- Attention heads
- 16
- Key/value heads
- 4
- Head dimension
- 256
- Vocabulary size
- 248,320
- Model type
- qwen3_5
Identity and Version
- Repository
- kitaniai/OpenJudgement-4B-Preview
- Publisher
- Kitani
- Task
- Text classification
- Modality
- Text
- Library
- transformers
- Parameters
- 4.5B parameters
- Languages
- en, uk
- Revision
- eb2384f98ffa273bb31b175dcdb02b3de321a9dc
- First published
- 2026-09-17
- Last updated
- 2026-09-24
Files and Weights
50 files, 9.1 GB in total. The weights are 3 files totalling 9.1 GB in safetensors.
Every file
| File | Type | Size | SHA-256 |
|---|---|---|---|
| model-00001-of-00003.safetensors | Weights | 4.0 GB | 036d2e8cb9c0 |
| model-00002-of-00003.safetensors | Weights | 4.0 GB | 9f7a3846fa50 |
| model-00003-of-00003.safetensors | Weights | 1.1 GB | 575e42fc3e7f |
| artifact_manifest.json | Configuration | 9.5 KB | — |
| calibration.json | Configuration | 360 B | — |
| config.json | Configuration | 2.9 KB | — |
| core.py | Configuration | 3.5 KB | — |
| examples/basic.py | Configuration | 835 B | — |
| examples/client.py | Configuration | 471 B | — |
| examples/request.json | Configuration | 1.3 KB | — |
| generation_config.json | Configuration | 116 B | — |
| model.safetensors.index.json | Configuration | 66.2 KB | — |
| openjudgement.py | Configuration | 1.4 KB | — |
| openjudgment_config.json | Configuration | 571 B | — |
| preprocessor_config.json | Configuration | 390 B | — |
| reports/audit.json | Configuration | 726 B | — |
| reports/build.json | Configuration | 6.1 KB | — |
| reports/calibration.json | Configuration | 360 B | — |
| reports/dataset_manifest.json | Configuration | 6.1 KB | — |
| reports/encoding.json | Configuration | 514 B | — |
| reports/final_evaluation_plan.json | Configuration | 171.0 KB | — |
| reports/final_metrics.json | Configuration | 9.6 KB | — |
| reports/final_validation_selection.json | Configuration | 4.6 KB | — |
| reports/preview_release_checks.json | Configuration | 479 B | — |
| reports/reload_verification.json | Configuration | 73 B | — |
| reports/run_provenance.json | Configuration | 940 B | — |
| reports/selected_training_checkpoint.json | Configuration | 250 B | — |
| reports/tokenization.json | Configuration | 1.2 KB | — |
| reports/training_complete.json | Configuration | 289 B | — |
| reports/training_plan.json | Configuration | 1.2 KB | — |
| serve.py | Configuration | 1.7 KB | — |
| tests/test_api.py | Configuration | 1.7 KB | — |
| tests/test_release.py | Configuration | 1.8 KB | — |
| tests/test_runtime.py | Configuration | 5.7 KB | — |
| v4_finalize.py | Configuration | 19.9 KB | — |
| v4_model.py | Configuration | 11.4 KB | — |
| v4_prompt.py | Configuration | 1.9 KB | — |
| v4_train.py | Configuration | 18.2 KB | — |
| verification_fixture.json | Configuration | 47.7 KB | — |
| video_preprocessor_config.json | Configuration | 385 B | — |
| LICENSE | Documentation | 11.5 KB | — |
| NOTICE | Documentation | 672 B | — |
| README.md | Documentation | 12.9 KB | — |
| chat_template.jinja | Other | 7.8 KB | — |
| reports/environment.txt | Other | 1.5 KB | — |
| requirements-dev.txt | Other | 49 B | — |
| requirements.txt | Other | 255 B | — |
| .gitattributes | Repository | 1.6 KB | — |
| tokenizer.json | Tokenizer | 20.0 MB | 06b9509352d2 |
| tokenizer_config.json | Tokenizer | 1.1 KB | — |
License and Download
- License
- apache-2.0
- Access
- Open weights, no gate
- Download size
- 9.1 GB
Released by Kitani through its official repository on Hugging Face. Read the license.
Built From
- Derived from Qwen/Qwen3.5-4B
- Trained on (disclosed) kitaniai/OpenJudgment-4B-Preview
Memory Requirements
| Precision | Weights in memory |
|---|---|
| As published | 9.1 GB |
| 16-bit | 9.1 GB |
| 8-bit | 4.5 GB |
| 4-bit | 2.3 GB |
Weights only, from the published parameter count; the key-value cache and runtime add to this.
Questions About OpenJudgement-4B-Preview
How much GPU memory does OpenJudgement-4B-Preview need?
About 10.9 GB at 16-bit and 2.7 GB at 4-bit: the weights (4.5B parameters) plus a working margin. A long context needs more.
What is the cheapest GPU to run OpenJudgement-4B-Preview on?
At 16-bit, 1x MI300X from $1.85 an hour; at 4-bit, 1x MI300X from $1.85 an hour, at the lowest on-demand prices the SAVRN Index lists.
Can I use OpenJudgement-4B-Preview commercially?
Yes. OpenJudgement-4B-Preview 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.
What is OpenJudgement-4B-Preview's context length?
262,144 tokens, from the maximum position embeddings in its published configuration.
Similar Models
Small, fast decisions for routing and checks at volume. Send text or JSON state with choice, noul (yes/no), or score questions. Get a probability for every offered answer, not generated text. Each batch takes one forward pass; large requests can use several batches. Use choice to route a request, noul for a yes/no check, or score for an ordered rating. The same call can ask several questions about a single state. Try it: POST /v1/systemone, GET /v1/models, and GET /healthz. Point TypeSafe's server-side Python or JavaScript SDKs at it with TYPESAFEBASEURL; text decisions use the same request and response fields as hosted Jev. Requests run one at a time by default; --batch-window-ms 5 enables…
Mapika/decider-4b v2.1 quantized to FP8 for vLLM: FP8 E4M3 weights with one scale per output channel and FP8 activations scaled per token at run time. 4.85 GB against 8.41 GB for the bf16 checkpoint. Quantized and measured by LLM Tech; the model, its training and its evaluation protocol are Mapika's. Read the bf16 card for what the model is and how it was trained. The base revision is eb5fbdfc9448473ec25e399882912863afbdb70e. Tokenizer, chat template, generation config and deciderconfig.json (temperatures included) are the author's files unchanged, apart from the version and quantization fields. Both models were run through vLLM 0.29.0 on the same rows: the author's regression set rebuilt…
Kev-4B (a LoRA on Qwen3.5-4B-Base with a pointer head) packed for mlx-serve's POST /v1/decisions. Kev answers typed questions about a piece of text (choice, noul, score) with calibrated probabilities. It never generates text. The pack folds the LoRA into the base the way kev does on MLX, quantizes the trunk to 8-bit (affine, group 64; a bf16 build comes from --q-bits 0), and stores the pointer head as kevhead.safetensors with the calibration temperature in kevconfig.json. No PyTorch or pickle file is needed to serve it. Built with tests/convertkevweights.py from the mlx-serve repo. Kev and Qwen3.5 are Apache-2.0.
GPTQ Quantized Qwen/Qwen3-Reranker-4B with Ultrachat, THUIR/T2Ranking and m-a-p/COIG-CQIA for calibration set. VRAM Usage: 17430M -> 11000M (w/o FA2, according to Embedding model's result). I think <5% accuracy, further evaluation on the way... The Embedding one shows ~0.7%. pip install compressed-tensors optimum and auto-gptq / gptqmodel, then goto the official usage guide.
VirbiusAgent 安全分类器(Prompt L1 检测),基于 Qwen3Guard-Gen-4B 微调的 LoRA 模型。 输出严格 JSON:hitrule 与 triggeredid。 同口径评测相对基座:漏检 15.4% 降到 0.8%(gold1000 / V15),jailbreak 召回 57.1% 升到 100%。 0.6B 轻量版:https://www.modelscope.cn/models/i1see1you/VirbiusGuard 基座用官方 Safety 模板(Unsafe / Controversial 视为拦截);VirbiusGuard-4B 用引擎 JSON 协议。评测集与口径相同。 评测集:data/eval/gold1000.jsonl(615 unsafe / 385 safe)。误报 = FP / 385。 基座漏掉的主要是越狱与 Agent 工具滥用。V13.3 召回拉满但误报过高;V15 起进入可用区。V17 误报最低,但召回/自伤回退。 - 架构:Qwen3ForCausalLM(4B),LoRA(rank 32 / alpha 64) - 基座:Qwen3Guard-Gen-4B - 相对基座的补强:jailbreak 与 agent-behavior - V17 数据:与 0.6B V15 同口径,良性切片再平衡,含 oasst1、COIG 中文散文、OCR 风格文本 输出 10 种 unsafe 类别(triggeredid)或 safe(hitrule 为 false)。每条输入只输出一个主要类别:…