vera-medium-omni

vera-medium-omni

vera-medium-omni is a non-autoregressive System 1 decision model that reads text and images. Give it a state (text, email, ticket, JSON, plus any number of images: photos, screenshots, charts, scanned documents) and typed questions; it returns typed answers with calibrated probabilities. It never generates text, so there is nothing to parse and nothing to hallucinate. It speaks the same wire format as Jev (POST /v1/systemone), with one optional images field.

It is the first omni vera: a 4.5B model (Qwen3.5-4B backbone and its vision tower) that reads options the vera-core-2 and vera-large way. On our local proxy of the Decision Index vision board (11 public benchmarks) it scores 75.29, ahead of vera-large read through its own base model's vision tower (74.78), at a sixth of the parameters. On text it scores 59.85 on our proxy of the Decision Index Full score, against 60.12 before vision training. Every request is read whole: the state, the question and the option descriptions are never cut.

Base model

vera-medium-omni is derived from Qwen3.5-4B; it keeps the text backbone (~4.2B parameters) and the stock vision tower (ViT and patch merger, ~0.33B parameters). Each question is read in one forward pass: the prompt lists every option under a short answer code, the full-attention layers see the whole prompt (the Gated DeltaNet layers stay causal), and each option is scored at the last prompt token through its answer code plus an option-pointer readout that looks back at the option's own line. The probabilities are temperature-calibrated per question type.

Images are part of the state. The vision tower turns each image into one feature per 32x32-pixel block (images are resized to at most 1.6 MP); the features fill <|image_pad|> slots placed after the state's text, and positions follow Qwen3.5's multimodal rotary embedding (M-RoPE).

Use cases

  • Document and receipt understanding: read invoices, receipts, forms and scans, and route or check them.
  • Screenshot and UI decisions: pick the element or action on a web page or app screenshot.
  • Chart and infographic questions: answer multiple-choice questions about plots, tables and infographics.
  • Content moderation: flag images and memes (image plus caption) against your own policy.
  • Visual inspection and counting: classify product photos, damage, defects, or count objects.
  • Routing and triage: send a ticket, email or request (with its attachments) to the right team or priority.
  • Intent, policy and scoring: the same text skills as the rest of the vera family, with calibrated confidence.
  • Confidence-gated workflows: act automatically when confident, hand off to a slower model or a human when not.

Quickstart

vera-medium-omni uses the same vera package (vera-s1, version 0.1.7 or newer) as the rest of the family:

pip install -U "vera-s1[fast]>=0.1.7"

Python 3.10 or newer. The weights (~9 GB: 8.4 GB backbone and head, 0.67 GB vision tower) are downloaded once, on first use, and cached. A GPU with 16 GB or more is recommended (CUDA or ROCm); CPU works but is slow. [fast] adds flash-linear-attention for the DeltaNet layers.

import vera

agent = vera.load("scar-ai/vera-medium-omni")

state = "Expense report from Dana, travel category. Policy: meals over $75 need a manager's approval."
questions = {
    "category": {"type": "choice", "instructions": "What kind of expense is on the receipt?",
                 "criteria": {"meal": "restaurant, cafe, food", "lodging": "hotel, rental",
                              "transport": "taxi, train, flight, fuel", "other": "anything else"}},
    "needs_approval": {"type": "noul", "instructions": "Does this receipt need a manager's approval under the policy?"},
    "legibility": {"type": "score", "instructions": "How readable is the receipt?",
                   "criteria": ["unreadable", "partly readable", "fully readable"]},
}
result = agent.predict(state, questions, images=["receipt.jpg"])
print(result["answers"]["category"]["choice"])
print(result["answers"]["needs_approval"]["noul"])         # probability the answer is yes
print(result["answers"]["legibility"])                     # expected score and full distribution

Without images, it is a text model with the same call as every other vera. All questions in a call are answered together. The state can be plain text, any JSON-serialisable object, or None when the images are the whole state. Question types: choice (2 to 255 options), score (2 to 10 ordered levels, returns an expected score and the full distribution) and noul (yes/no probability).

Images

  • Inputs: PIL images, file paths, http(s) URLs, data:image/...;base64, URIs, bare base64 strings, raw bytes, or objects {"url": ...} / {"image_url": {"url": ...}}. Any format Pillow decodes (JPEG, PNG, WebP, GIF first frame, ...).
  • Placement: images are read after the state's text, in order, tagged Image: (or Image 1:, Image 2:, ...). Refer to them that way in a question ("Does Image 2 show the same product as Image 1?").
  • Size: each image is resized to between 65,536 pixels and 1.6 MP, keeping its aspect ratio, and costs up to ~1,600 tokens (one per 32x32 block). Up to 16 images per request.
  • Cost: the images of a request are encoded once and shared by all its questions.
  • Video is not supported.

Weights

main holds the backbone in bf16 and the decision readout, option pointer and temperatures in fp32 (model.safetensors, 8.4 GB), plus the frozen vision tower in bf16 (vision.safetensors, 0.67 GB). There is no separate fp32 branch.

Self-hosting: Jev-compatible HTTP server

vera-serve exposes the model on the same POST /v1/systemone request and response shape as Jev, so existing clients work by changing their base URL. Images go in an optional images list:

vera-serve --model scar-ai/vera-medium-omni --port 8200                    # PyTorch engine
vera-serve --model scar-ai/vera-medium-omni --engine vllm --port 8200      # vLLM engine
curl -s localhost:8200/v1/systemone -H 'Content-Type: application/json' -d '{
  "state": "Customer photo attached to a return request.",
  "images": ["data:image/jpeg;base64,'"$(base64 < photo.jpg | tr -d '\n')"'"],
  "questions": {"damaged": {"type": "noul", "instructions": "Is the product visibly damaged?"}}
}'

Over HTTP, images are base64 data URIs (or bare base64). Image URLs are fetched by the server only when it is started with --allow-image-urls, and server-side file paths are never read. The response's usage counts the images. It binds 127.0.0.1 by default (use --host 0.0.0.0 to expose it) and has no authentication, so put it behind your own gateway if you expose it. Concurrent requests are batched, with and without images.

Use with transformers

The checkpoint also loads through transformers with AutoModel (custom code, so trust_remote_code=True). It needs transformers 5 or newer, in a release that includes Qwen3.5. Outputs match the vera package. Loading needs no download of the base model; the vision tower is loaded from vision.safetensors on the first call with images.

from transformers import AutoModel

model = AutoModel.from_pretrained("scar-ai/vera-medium-omni", trust_remote_code=True).to("cuda")
questions = {"damaged": {"type": "noul", "instructions": "Is the product visibly damaged?"}}
print(model.predict("Customer photo attached to a return request.", questions, images=["photo.jpg"])["answers"])

The same model is also available as a transformers pipeline task, decision:

from transformers import pipeline

decide = pipeline("decision", model="scar-ai/vera-medium-omni", trust_remote_code=True, device=0)
print(decide(state="Customer photo attached to a return request.", questions=questions, images=["photo.jpg"])["answers"])
# also: decide({"state": ..., "questions": {...}, "images": [...]})

For tensor-level use, model.encode_batch(state, questions, images) builds the inputs (including the image features) and model(**batch).logits returns the calibrated option scores (softmax(logits, -1) gives probabilities). The model is non-autoregressive and has no generate().

Inference engine and decision API status

engine / API status notes
vera-serve (Jev-compatible POST /v1/systemone) Supported Text and images. Batches concurrent requests. PyTorch or vLLM engine (--engine vllm).
vera.load(...).predict(...) (Python) Supported Text and images. Same result shape as the HTTP API.
transformers (AutoModel, trust_remote_code=True) Supported Text and images. See above. predict() mirrors the decision API.
vLLM Supported Text and images, through vera-serve --engine vllm, or the engines/ adapter with no vera package.

An OpenAI-style chat or completions client will not work with vera-medium-omni on any engine: the model scores options, it does not generate text.

The vera family

All share the same System One interface and wire format, so you can swap one for another.

  • vera-large: our largest and most accurate model (~26B parameters).
  • vera-medium-omni (this repo): text and images (~4.5B parameters).
  • vera-core-2: the same way of reading options at ~2B parameters.

All are generalist bases meant to be fine-tuned for your use case.

License

Apache-2.0, like the base model Qwen3.5-4B.

Downloads last month
20
Safetensors
Model size
4B params
Tensor type
F32
ยท
BF16
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for scar-ai/vera-medium-omni

Finetuned
Qwen/Qwen3.5-4B
Finetuned
(1,288)
this model