Models / 2B v4

Jev-Style 2B v4: local text and image decisions

Jev-Style 2B v4 answers typed questions about text, JSON, receipts, screenshots, and charts. Use PyTorch for images, or the MLX and GGUF builds for text.

Try the HF demo ↗Run locally ↓View on GitHub ↗

Open weights · Apache-2.0 · Examples for jev-style 0.6.0

2.2Bparameters
32,768request token limit
Text + imagesPyTorch build

Choose the build for your input

The package release name 2b selects Jev-Style-2B-Decision-v4. Each backend uses the release’s matching decision runtime. The table lists weight sizes, not total runtime memory.

BuildInputsPublished weight sizes
PyTorch / safetensorsText + images4.43 GB
MLXText only3.76 GB bf16 / 2.00 GB 8-bit
GGUFText only3.78 GB F16 / 2.01 GB Q8_0 / 1.27 GB Q4_K_M

For long text on the 2B releases, the project recommends Q8_0 or F16 rather than Q4_K_M. Generic text-generation commands do not produce the decision scores: use jev-style or the supplied runtime.

Run the image-capable build

Use Python 3.10 or newer in a virtual environment. Install the backend for your machine, then keep the server running in this terminal.

bash
python -m pip install "jev-style[torch]"

jev-style serve --release 2b --backend torch

The first run downloads the model. Once it is ready, open the local Playground. Run the Python examples in a second terminal with the same environment.

For text-only use on Apple silicon, install jev-style[mlx] instead and run jev-style serve --release 2b. Automatic backend selection uses MLX there; choose --backend torch explicitly when you need images.

Ask a typed question about a receipt

Save a receipt image as receipt.png, then run the Python example below in the same environment. Supported image inputs are PNG or JPEG, with each side between 280 and 1,568 pixels. The asset key r1 is referenced in the state.

python
from jev_style import JevStyle, image, noul

# Save a PNG or JPEG receipt as receipt.png in this directory.
with JevStyle(base_url="http://127.0.0.1:8765") as model:
    result = model.decide(
        {"receipt": "r1", "policy": "Meals over 50 EUR need manager approval."},
        {"approval": noul("Does this receipt require manager approval under the policy?")},
        assets={"r1": image("receipt.png")},
    )
print(result["answers"]["approval"]["noul"])

The result is a probability for the policy question. It is not an extracted receipt, an explanation, or authorization to reimburse an expense. Check uncertain cases against the original image and policy.

Read the results with their protocol

The release reports one self-run with the official tools: 74.9% on the 231 public JevBench v1.4.1 items, 44.37 on the Decision Index 0.3 public suite, and 57.55 on its public Vision suite. These are different evaluation scales and should not be combined.

The JevBench run used float32 on Apple MPS and reports a 95% confidence interval of 68.9–80.0%. The Decision Index headline Full score uses maintainers’ private tests; the public self-run is not an official board rank. Some benchmark train splits occur in training, so consult the per-dataset protocol before interpreting a result as zero-shot.

See the full model card for training sources, runtime revisions, protocols, and limitations. The release was trained in part with soft labels distilled from TypeSafe Jev 1.14 through its public API.

What to check before using it

The combined request limit is 32,768 tokens. MLX and GGUF distributions contain the language model only. Image capability is available through the PyTorch distribution and its matching runtime.

Small print, ambiguous charts, unusual layouts, and your own domain can produce errors even when the reported probability is high. Test examples from the target task and keep a review path. If you need a smaller text-only starting point, use 0.8B v3.