How it answers
Options are labelled A, B, C, ... in the prompt. The answer is read from the label logits at the answer position and softmaxed over the listed options only. One forward pass per question, no sampling, no thinking.
- Up to 624 options per question:
A-Z, a-z, 0-9, then every two-letter pair AA..ZZ that is a single Qwen3.8 token (562 of them). Larger questions are refused as unsupported, never truncated. Questions with 62 or fewer options use only the single-character labels the model was trained on.
- Context up to 65,536 tokens on the served path.
- Images: up to 8 per request,
max_pixels 4,000,000.
Run it
pip install vllm fastapi uvicorn peft transformers git+https://github.com/apolinario/decision-indexcd codepython -m train.merge --ckpt .. --out ../merged # adapter -> plain bf16 model (one-time)python -m serve.server --model ../merged --perms 1 --port 8000
Then POST /v1/systemone with {"model", "state", "questions"}, the Decision Index wire format. state may be a string, a JSON object, or a list mixing text and {"image": "https://... | data:..."} parts. The code is in code/.
The same model also runs in-process as a kit engine: --engine serve.engine:JVEngine --option adapter=<path>.
Results
Table with columns: Benchmark, Result, Notes| Benchmark | Result | Notes |
|---|
| typed-decisions (2,000 decisions) | acc 0.714, KL 0.318, Brier 0.129, ECE 0.026 | #7 overall; lowest ECE on the board |
| jev-bench test (22,773 records) | macro acc 0.734, ECE 0.084, Brier 0.334, TVD→human 0.391 | base in 4-bit NF4; Jev 1.13.0 API scores 0.733 / 0.113 / 0.349 / 0.432; files |
| Decision Index public text suite (140,178 rows) | index 49.58 | run |
Speed
Table with columns: Path, median, mean, p80| Path | median | mean | p80 |
|---|
| Text decisions, 1 client, A100 80GB, vLLM | 120 ms | 590 ms | 614 ms |
| Image decisions, RTX PRO 6000, vLLM | 254 ms | 399 ms | 635 ms |
The image row was measured with two option orders averaged; the shipped setting is one order. The full public 0.3 text suite (140,620 requests) took about 4 hours on one H100 with 16 concurrent clients.
Training
- Base:
Qwen/Qwen3.8-27B, LoRA r=32, alpha=64, on the language model's attention, linear-attention and MLP projections. The vision tower is frozen.
- Loss: KL to soft or label-smoothed targets at the answer position.
- Text: 18k rows of
SargeDev/jev-distill-corpus-v3.
- Vision: about 13k rows built from train splits only (COCO boxes, ChartQA, DocumentVQA, CORD, Multimodal-Mind2Web train, Hateful Memes train with balanced classes, ScienceQA, COCO caption word swaps, SAT). Every training image was pHash-checked against the evaluation images, and near-duplicates were dropped.
- 2,000 steps, then 400 more at a lower learning rate with the balanced Hateful Memes rows and without SAT.
Limits
Benchmark numbers on this card come from our own replica of the public vision benchmarks, not the official board.