imajev
imajev 1.0 · technical report

Typed decisions from photos and app state

imajev is a family of open models (2B, 4B and 9B parameters) that answer typed questions about photos and application records. You send up to two photos, a record, and questions with the options you allow; each answer is a probability over those options plus an explicit unknown. There is no text generation: one forward pass per question, on your own machine. The request shape is the one TypeSafe's Jev uses, so an existing Jev client works by changing its base URL.

Mohit GargSeptember 2026Apache-2.0Base models: Qwen3.5

ModelImajevBenchJevBench hardHard ECE, calibratedLatency p50Base download
imajev-2b71.7%60.4%0.123238 ms (83 raw)4.6 GB
imajev-4b recommended82.4%70.3%0.116350 ms (96 raw)9.3 GB
imajev-9b82.1%69.4%0.092316 ms (96 raw)19.3 GB

ImajevBench v2.0-lite test split, 279 items. JevBench public hard split, 111 text-only items, our same-protocol run, as served (4 option rotations, calibration file). Latency: one JevBench hard item as served, raw single pass in brackets, on one H100 under load, serial. Base download: the pinned Qwen3.5 weights.

Photo of beige suede boat shoes
State · listing
titleMen's suede boat shoes color product_type
Question · choice

Figure 1. A listing check answered by imajev-4b with its shipped calibration. Change the listing's colour or product type: every state shown was run through the model (). Option probabilities are given that the model answers; the unknown probability is reported beside them.

1What it does

Application code often needs a small, typed judgement about a photo: does it match the record, which field does it contradict, is the part damaged, did anything change between two photos. A general chat model can answer, but its answer is free text that has to be parsed, and it rarely says when it cannot tell.

imajev answers only in the options you supply, returns a probability for each, and has a trained unknown for missing or contradictory evidence. That lets your code act on a threshold, abstain, or send the case to a person. Three question types cover most uses: noul (yes or no), choice (one of 2 to 254 options) and score (2 to 10 ordered levels).

2Examples

Six requests from the demo playground, answered by imajev-4b. The action line is ordinary application code applied to the probabilities; the model never writes text. The playground's own checks pass on this model.

3Results

Both benchmarks were run with the same protocol for every system. JevBench is text-only; ImajevBench adds photos, written records, and items whose correct answer is unknown.

Figure 2. ImajevBench v2.0-lite, 279 test items: accuracy with 95% cluster-bootstrap intervals. Direct option scoring with all option orders. Jev-Omni is run through its own predict() API and shown apart because its interface differs.
Table
Figure 3. JevBench public hard split, 111 text-only items. Our runs with the jevbench harness, one H100, serial; imajev as served, with 4 option rotations and its calibration file. The official leaderboard adds sealed items and a four-axis score; an entry will be requested.
Table
Figure 4. ImajevBench accuracy of each untuned Qwen3.5 base and the same base with the imajev adapter. Paired cluster tests on the shipped adapters: 2B +11.5 points (p = 0.005), 4B +11.8 (p = 0.0006), 9B +5.4 (p = 0.131, not significant).

Not #1 on JevBench. JevK5 and Eikos-4B (73.9%) lead every imajev size on the hard split, by 3 to 4 items of 111; the 4B (70.3%) is above Hopper (67.6%). On the previous adapter the gap was mostly in items that judge the quality of an answer.

Jev-Omni on ImajevBench. 78.5% through its own API. imajev-4b and 9B lead by about 4 points, which is not significant (p ≈ 0.25 on the previous adapters; not re-run). The difference comes from the 21 items whose answer is unknown, which Jev-Omni cannot abstain on; on answerable items it is slightly ahead and better calibrated.

Reasoning is a different interface. A frozen Qwen3.6-35B-A3B with its reasoning turned on scores 97.3% on JevBench hard, at seconds and thousands of tokens per decision.

4Calibration

Each model ships a calibration.json with one temperature, fitted by NLL on 150 template-generated JevBench-style items (none from JevBench); the explicit unknown is kept, with no offset. Temperature scaling never changes an answer, only how confident the model says it is.

ECE, raw → calibrated2B4B9B
JevBench hard, served (4 rotations).176 → .123.164 → .116.187 → .092
MMLU, text only.141 → .038.150 → .035.123 → .031
Typed decisions, 2,000.128 → .039.149 → .047.159 → .026
SST-5, 2,210.221 → .105.220 → .020.211 → .029
Photo-only checks, 823.023 → .120.038 → .062.027 → .053

The four lower rows were measured on the previous adapters and temperatures and are not re-run for the shipped versions. The last row is the exception. On photo-only verification the raw probabilities are already well calibrated and the temperature softens them too much. If most of your traffic is photo-against-record checks, serve without --calibration or fit a temperature on your own sample (section 5.5).

5For developers

How to run it, call it, act on its answers, pick a size, check it on your own data, and reproduce every number on this page.

5.1 Run a server

One command serves one model on POST /v1/systemone. MLX on Apple silicon, PyTorch elsewhere; no network calls at inference.

5.2 Request and response

Questions are keyed by your own names. A choice lists its options as keys of criteria, each with an optional description; a score lists its levels in order. Images go as multipart files, or as data URLs in an images array when you send JSON.

probabilities
For choice and score: a distribution over your options that sums to 1, given that the model answers.
noul
P(yes) with half of the unknown mass added, as in Jev. For the plain yes-probability subtract unknown_probability / 2.
unknown_probability
The mass on imajev's trained unknown option: missing, contradictory or out-of-scope evidence.
abstained
true when unknown was the single most likely outcome.
confidence
How concentrated the option distribution is, scaled down by the unknown mass.
request limits
Up to 2 images, a state string or JSON object up to 32 KB, 1 to 8 questions, 2 to 254 options, 2 to 10 score levels, English.

5.3 Act, abstain or escalate

The probabilities are the product. A common pattern: act automatically above a threshold, send the case to a person when the model says unknown or is unsure, and log everything. Choose the threshold from your own error costs.

5.4 Choosing a size

ModelUse it whenImajevBenchMMLU (previous version)Unknown items right
imajev-2blatency or memory is the constraint71.7%59.8%5 / 21
imajev-4bthe default for almost everything82.4%74.5%14 / 21
imajev-9bknowledge-heavy text questions, when memory is not tight82.1%79.2%15 / 21

5.5 Check it on your own data

  • Measure first. Collect a few hundred of your own requests with the right answers, including cases where the right answer is "cannot tell". Send them through the server and compare accuracy at your threshold. The harness in src/imajev_bench does this for records in ImajevBench's format and reports cluster confidence intervals.
  • Fit your own temperature. The evaluators in scripts/ write one JSONL row per question with its logits. scripts/v1_text/fit_temperature_calibration.py rows.jsonl calibration.json fits one temperature per question type and option count, and the server loads the result with --calibration.
  • Compare on ImajevBench. The benchmark's public records, images and scorer are on Hugging Face. Run your own model and send the row.

5.6 Reproduce the numbers

Every figure on this page is rebuilt from files in the repository by python site/build_site.py. Benchmark predictions, per-run manifests and scores are under results/ and bench/. ImajevBench rows are rescored with python -m imajev_bench score and the paired tests with imajev_bench.stats.paired_cluster_test. JevBench runs keep every raw response.

6Data, training and compute

Each model is a LoRA (rank 16) on the language layers of Qwen3.5 plus a small readout over option codes; the vision encoder stays frozen. Teachers are open-weight models only. No JevBench items, no Jev outputs and no paid-API outputs were used in training.

StageData
1 · Image and textAbout half a million human-labelled decisions from licence-checked public datasets: 300k on images (21 sources) and 200k text-only (15 sources).
2 · New sourcesAbout 416k decisions on six photo and text sources the models had not seen, labelled by the 9B and kept only when two option orders agreed; then 72k photo-vs-record and two-photo decisions. The 2B and 4B were trained on this stage; the 9B, which produced its labels, went from stage 1 to stage 3.
3 · Hard questionsAbout 23k hard questions: documents and questions written and answered by open-weight teachers, kept only when the teachers agreed, plus licensed human reasoning sets. Stage 1 had cut the 9B's JevBench hard score from 64.9% to 42.3%; this stage took it to 68.5%. The shipped adapters are a weight-space average of two adapters: that one and a soft-target continuation on 39,515 further rows; served, the 9B scores 69.4%.

6.1 Models

All three use the same adapter: a LoRA with rank 16, α 32, no dropout and no bias, on every language-model projection (q, k, v, o, gate, up, down and the DeltaNet in_proj_qkv, in_proj_z, out_proj). The vision encoder is frozen and has no LoRA. Base weights run in bfloat16; the LoRA and readout weights are stored in float32.

imajev-2bimajev-4bimajev-9b
Base model, pinned revisionQwen3.5-2B @15852e8cQwen3.5-4B @851bf6e8Qwen3.5-9B @c2022362
LoRA parameters15,630,33630,474,24040,108,032
Decision readout (bias-free, float32)255 × 2048255 × 2560255 × 4096
Readout parameters522,240652,8001,044,480
Total trainable parameters16,152,57631,127,04041,152,512
Adapter file, float3262.6 MB122.0 MB160.5 MB
Readout file2.1 MB2.6 MB4.2 MB
Base weights to download4.6 GB9.3 GB19.3 GB
Shipped calibration temperature1.651.721.75

All three base models are Apache-2.0. Each supplied option is bound to one of 255 single-token codes; the readout maps the hidden state at a decision position to logits over those codes plus unknown, and a softmax after the calibration temperature gives the probabilities. One prefill per request, one forward pass per question, no text generation. Requests over 4,096 tokens are refused, not truncated.

6.2 Data by stage

A decision is one typed question answered about one request; a record is one request, which can hold up to eight decisions. No training data comes from JevBench, from Jev, or from any paid API.

StageWhat it containsCount
1 · Image and text36 licence-admitted sources in 466,135 records: 200,000 decisions from 15 text sources (24,832 of them carry an unrelated photo as an irrelevance control), 300,000 from 21 image sources, and 4,000 photo-vs-listing contradictions from Amazon Berkeley Objects. Held out from the same manifest: dev 30,026, calibration 25,217, test 35,528 decisions.504,000
train
2 · New sourcesThe calibrated 9B labelled 616,964 candidate decisions on sources the models had not seen and 475,305 were kept (77.0%): the answer had to be the same under two option orders with top probability at least 0.6 (or unknown at least 0.5). New photo and text sources 366,967 → 271,036 (73.9%); PD12M photos 179,997 → 144,871 (80.5%); photo-vs-record and natural pairs 70,000 → 59,398 (84.9%). Of 71,630 photo-vs-record and two-photo decisions, 45,999 check a photo against a written record, 8,469 compare two natural photos, and 17,162 compare a reference photo with an edited copy, labelled by construction. For the 2B each target was blended 0.5 : 0.5 with the untuned 2B's own distribution.475,305 kept
of 616,964
4B first runThe 4B was trained once on a combined mixture instead of stages 1 and 2 in sequence: 504,000 stage-1 decisions with their original labels, 296,482 stage-2 teacher decisions with unknown targets capped at 15%, and 66,372 photo-vs-record and pair decisions. 17.15% of its targets are unknown. No base-model blend.866,854
train
3 · Hard questionsTwo rounds of documents and questions written by open-weight teachers and kept only when independent answerers agreed, plus 8,532 items from 10 licensed human reasoning sets in round 1. Hard labels only. Then a soft-target continuation: the round-2 teacher rows relabelled with Qwen3.6-35B-A3B probability distributions, 9,880 new hard, judge and programmatic rows, the Eikos decisions strict slice (10,570, open-weight teachers only) and 5,000 image-replay rows.14,112 + 7,812
+ 39,515 soft
train records

Per-source counts and licences for all 36 stage-1 sources are in section 2 of the full technical specification. For 16 of the 21 image sources the recorded licence covers the annotations only; those photos stay under their upstream terms and are not redistributed. Stage-2 photo sources: PD12M (CC0-1.0), Wikimedia Commons (CC-BY-4.0, CC-BY-3.0, CC0-1.0) and Open Images (CC-BY-2.0).

Stage 3Round 1Round 2
WriterQwen3.6-27B @6a9e13bdQwen3.6-27B @6a9e13bd, reasoning on for hard families
AnswerersQwen3.6-27B (reasoning), gpt-oss-20b @6cee5e81the two, plus Qwen3.6-35B-A3B @995ad96e (reasoning)
Keep ruleboth answerers agree with the intended answerall three agree
Documents written4,4622,699
Questions / kept13,386 / 9,3688,097 / 4,852
Dropped4,013 disagreement, 5 JevBench overlap1,883 disagreement, 1,362 near-duplicates, 0 JevBench overlap
Human reasoning items8,532 from ARC-Challenge, CommonsenseQA, CosmosQA, DROP, GSM8K, QASC, StrategyQA, TruthfulQA and WANLI, at most 800 training rows per set; MMLU-Pro 800 for evaluation onlynone new
Training records14,112 (of 17,898)7,812: 3,598 new + 4,214 replayed from round 1

Round 2 also holds out a 622-record calibration fold from three domains kept out of training (telecom, hospitality, nonprofit grants).

6.3 Training by model

Every stage used the same trainer (scripts/train_decision_lora_torch.py, PyTorch and PEFT, 4 GPUs): cross-entropy on float32 readout logits over the listed options, soft cross-entropy where a record carries a target distribution, no label smoothing; AdamW with weight decay 0 and betas (0.9, 0.999); linear warm-up, then cosine decay to 10% of the peak rate; gradient clipping 1.0; seed 0. Each step is 2 micro-batches per GPU × 4 GPUs, each at most 40 examples under a padded-token budget. Stage 1 and the 2B's first run kept the checkpoint with minimum dev loss; later stages kept the best mean accuracy over the reasoning dev set and the JevBench-style dev set (6.5).

ModelStageStarted fromHardwareEpochsPeak LRSteps kept / totalStep time
imajev-2binitial run (594,214 records, earlier image mixture)Qwen3.5-2B4×H10012e-42,614 / 2,6141.3 h
imajev-2b1initial run4×H10011e-42,495 / 2,4951.3 h
imajev-2b2, first passstage 14×H1000.45e-51,100 / 1,8661.0 h
imajev-2b2, pairs passfirst pass4×H10015e-51,361 / 1,361*not recorded
imajev-2b3, round 1stage 24×H20023e-5250 / 2568 min
imajev-2b3, round 2round 14×H10022e-580 / 2209 min
imajev-2b3, soft-target continuationround 24×H10022e-5350 / 62022 min
imajev-4bfirst runQwen3.5-4B4×H2000.51.5e-41,900 / 2,5951.9 h
imajev-4b3, round 1first run4×H20023e-5250 / 30312 min
imajev-4b3, round 2round 14×H10022e-5266 / 26622 min
imajev-4b3, soft-target continuationround 24×H10022e-5260 / 74762 min
imajev-9b1Qwen3.5-9B4×H20012e-43,100 / 3,5082.6 h
imajev-9b3, round 1stage 14×H20023e-5300 / 40422 min
imajev-9b3, round 2round 14×H10022e-5260 / 36520 min
imajev-9b3, soft-target continuationround 24×H10022e-5510 / 1,01865 min

Step time is summed optimizer-step time. *Chosen by hand on probe results. Each shipped adapter is the element-wise average (LoRA and readout) of the round-2 adapter and the kept checkpoint of the soft-target continuation; the continuation was trained with soft-target cross-entropy, a rationale loss (weight 0.3, up to 192 tokens) and option permutation. Gradient checkpointing only for the 9B in stage 3. The 9B's stage 1 crashed eight times in its first 980 steps (a periodic diagnostic timer in the trainer, since removed) and resumed from 20-step checkpoints; the 2B's initial and stage-1 runs had similar resumes. No data was skipped.

6.4 Compute and cost

About $676 of rented GPU time for the whole project (RunPod, 17 pods, 21 to 24 September 2026; $499.07 for the first three stages, about $177 for the soft-target continuation), every run included: data labelling and generation, all training, all evaluations, the competitor benchmark runs and aborted pods.

UseHardwareCost
9B stage 14×H200$71.67
2B stage 2 (labelling, blending, training)4×H100$95.43
4B first run, stage-3 round-1 data generation, round-1 training of all three models, evaluations4×H200$129.36
Stage-3 round-2 data generation, round-2 training, a frozen 35B reference check, competitor benchmark runs7×H100$99.88
2B initial run and stage 1 with their evaluations (three pods)4×H100$92.69
ImajevBench base-model and generation rows1×H100$4.91
Release calibration check1×H100$2.32
Soft-target continuation: relabelling, training of all three models, evaluations, weight averaging8×H100≈ $177
Short-lived and aborted podsvarious$2.81
Total≈ $676

6.5 Evaluation sets

SetWhat it isHow it is kept out of trainingSize
ImajevBench v2.0-lite testphoto, state and photo+state typed decisions in 89 evidence clusters, 21 with an unknown answer; AI-generated imagesbuilt after training; an after-the-fact check found no shared images or questions (byte hashes, no perceptual hash)279
JevBench public splitshard / original / easy, text-only typed decisions8-gram overlap lint on all teacher data; a re-check found no row sharing 2 or more 8-grams111 / 72 / 48
MMLU-1000official MMLU test split, 17 to 18 per subject, also sent with an unrelated photoregistered as never-train; 589 matching MMLU-Pro items removed from stage 31,000
Irrelevance panelthe 2,000 MMLU rows plus 489 ABO and 334 VizWiz controls that score each donor photo with its own relevant questiondonors from the test partition; no panel image in training2,823
Typed-decisions testsynthetic workflow decisions (400 records × 5); gold is agreement with that dataset's teacher modelevaluation only2,000
SST-5official Stanford Sentiment Treebank test sentencesevaluation only, not redistributed2,210
Reasoning dev set6,000 from the typed-decisions train split plus 240 hand-written items in 8 familiesnot trained on, but used to pick checkpoints in stage 2 and stage-3 round 1, so its scores are not independent of selection6,240
JevBench-style dev settemplate-generated items in 10 families, none from JevBenchnot trained on; used to pick round-2 checkpoints and to fit the shipped calibration temperatures150
State probe / pairs probephoto-vs-record and two-photo questions from the training templates10 of the 200 state-probe items reuse photos seen in training; the pairs probe shares no images200 / 60
Held-out photo sourcesMM-UPD, TUBench, CountQA, LIVE in the Wild, Fashionpedia, MuirBench, plus 177 real two-photo pairssources never used in training; no shared images4,989

6.6 Checks

  • JevBench. Every stage-3 teacher question was linted against the public JevBench files (62,915 reference 8-grams); a question sharing two or more was dropped (5 in round 1, 0 in round 2). A re-run over both training manifests found no row at the threshold.
  • Evaluation panels. An audit gate fails any build that places MMLU, SST-5, typed-decisions test or any upstream test row outside the test partition. A re-check over the training partitions of all six training manifests found no question or long state shared with MMLU-1000, typed-decisions test, SST-5 or the reasoning dev set.
  • ImajevBench. Nothing excludes it by construction. An after-the-fact comparison of all 923 benchmark images and every record's text against all training partitions found no overlap. Training images were re-encoded, so a byte-hash check would miss the same photo saved differently; no perceptual-hash check was run.
  • Licences. Every training source is admitted with a licence receipt; 16 image sources are admitted for their annotations only, with photos under upstream terms and not redistributed.

The complete record, including the per-source table, is the technical specification in the repository.

7Limits

No reasoning at inferenceMulti-step arithmetic and answer-quality judging trail reasoning models. It is one forward pass by design.
Over-confident without calibrationRaw hard-item ECE is 0.16 to 0.19. Use the calibration file, or fit your own.
9B gain not significant+5.4 points over its untuned base on ImajevBench, p = 0.131, on the shipped adapter (+6.1, p = 0.074 on the previous one). The 4B and 9B are level there.
The 2B rarely abstains5 of 21 unknown items on ImajevBench, against 14 for the 4B and 15 for the 9B.
Hard-question training has a costIts last round lowered our reasoning dev set (6,000 typed-decisions items + 240 hand-written; also used for checkpoint selection) by 5.6 points (2B), 1.2 (4B) and 1.8 (9B); the soft-target continuation's checkpoint recovered most of it (2B 62.7%, 4B 67.2%, 9B 68.9%), not measured for the shipped average. MMLU did not move on the previous version.
The benchmark is a previewImajevBench images are AI-generated and model-audited, with no human audit yet. English only; at most two images per request.