Released v1.0.0October 11, 2026. Open weights, Apache 2.0.

Avrik-Pro-12B

The default Avrik model. About 90 ms per decision on one GPU.

The Pro tier and the default model of the Avrik family: a 12B decision model that answers in about 90 ms on one GPU, or on a CPU or 16 GB card with the GGUF build. The right starting point for most workloads.

91.3%Dev-set accuracy292 of 320, 95% CI 87.6–93.9%
90.4 msPer decision on one H100p50 at 702 tokens, bf16
86.1%JevBench public tasks199 of 231, self-run, not official
2 buildsbf16 and GGUF Q8_0Each with its own calibration

What it’s for.

Send a state, like a ticket, a transaction, a policy and a case, and one or more typed questions. Get back a calibrated probability for every option, read straight from the model’s output in one forward pass.

  • Routing, triage and approvals
  • Guardrails and policy checks in agent loops
  • A fast first stage in front of people or larger models

Pick a build.

Same model, same API, two ways to run it. Each build has its own repo and its own calibration, fitted on that build’s outputs.

bf16

avrik-ai/Avrik-Pro-12B
Format
bf16 safetensors
Size
23 GiB
Runs on
One GPU via vLLM
Context
70,000 tokens
Latency
90.4 ms p50 (94.6 ms p95) at 702 tokens on an H100
Temperatures
choice 2.52, yes/no 5.0
Calibration
cal-12b-bf16-frozen-20261011-1

GGUF Q8_0

avrik-ai/Avrik-Pro-12B-GGUF
Format
GGUF Q8_0
Size
12 GiB
Runs on
llama.cpp on a CPU or a 16 GB card
Context
4,096 tokens
Latency
First decision in 23.7 s on a 6-thread laptop CPU, including model load
Temperatures
choice 2.84, yes/no 5.0
Calibration
cal-12b-q8-frozen-20261011-1

On the same 128 calibration items, Q8_0 and bf16 both got 105 right, and the top answer agreed on 126.

Batching: 32 questions on one 1,500-token state took 17.6 ms per decision.

Four question types. One API.

All three Avrik models answer the same /v1/systemone API with the same question types. Pick a tier by accuracy, latency, and hardware, and switch without changing your code.

TypeYou sendYou get
Yes or no noulA yes/no questionP(yes), from 0 to 1
Choice choiceA question and two or more named optionsThe top option and a probability for each
Score scoreA question and ordered levels, like low, medium, highThe expected level and a probability per level
Multi-label multi_labelA question and a set of labelsP(yes) per label, and the labels above a threshold
  • Confidence on every answerEach answer carries top, margin, confidence, and an abstain flag.
  • Room to say “I don’t know”With abstain_option, the model can answer “Insufficient information to decide.”
  • ReplayableEight audit fields per response. The same request on the same backend and precision returns the same numbers.

How an answer is made.

Run the model through avrik-server, not generate(). The readout and calibration are what turn raw weights into probabilities you can act on.

  1. 1

    Prompt renderer

    One fixed template per build, its SHA-256 in every response. Options become letters A, B, C.

  2. 2

    Gemma 4 decoder

    One forward pass per question. Questions on the same state are batched. Nothing is generated.

  3. 3

    Letter readout

    Reads the probability of every form of each option letter, and refuses if the letters hold under 98% of the mass.

  4. 4

    Calibration

    Per-type temperatures fitted for this exact build and bound to its hash.

Results, with their error bars.

Measured by Avrik AI on the bf16 build. Every accuracy carries a 95% Wilson interval, because a bare point estimate hides how few items sit behind it.

Avrik dev set

292/320 overall. 320 text items in 24 families. 100 labels are computed by code; 220 were drafted by a model and aren’t human-verified, so treat those families as indicative.

Agent governance

Prompt injection15/15
Intent alignment14/15
Personal data15/15
Tool-call authorization15/15

Core reasoning

Abstains when ambiguous10/10
Extraction10/10
Judgement15/15
Long policy10/10
Multi-hop10/10
Paraphrase edits12/15
Probability laws14/15
Routing10/10
Rule precedence15/15
Safety judgement15/15
Temporal and numeric20/24
Adversarial traps8/10

Long context

Buried policy clause7/16
Long records18/18
Needle in a haystack12/12

Consistency

Near-tie stability10/10
Negation pairs15/15
Order invariance8/10
Paraphrase invariance10/10

Scoring

Score quality4/10
Accuracy per family, dot is the point estimate, line is the 95% Wilson interval.

JevBench public tasks

The 231 public tasks of JevBench v1.4.2, run by Avrik AI. Not an official measurement, and not on the scale of the current leaderboard.

Easy48/48
Standard67/72
Hard84/111
Overall199/231
Top-answer accuracy by difficulty tier, with 95% Wilson intervals. Axis starts at 50%.

Held-out human evaluation

Pending. Avrik’s sealed evaluation set is written by people, kept encrypted, and never used for training or tuning. Results will be added to the model card in a later revision.

Calibration

Expected calibration error, 10 bins, top option. Lower is better. When this model says 0.8, it should be right about 80% of the time. Calibration pool held out from dev; dev shown for comparison. The pool’s yes/no items come from two hard families, which is why the yes/no temperature sits at the top of the fit range (5.0). It is refitted when the pool widens.

bf16 build, calibration cal-12b-bf16-frozen-20261011-1.

GGUF Q8_0 build

GGUF Q8_0 build, calibration cal-12b-q8-frozen-20261011-1, fitted on this build’s own outputs.

Run it in a few commands.

avrik pull verifies every file before anything loads. avrik serve exposes the API on 127.0.0.1:8080, loopback only.

On a GPU with vLLM (Linux, CUDA). avrik pull downloads the repo and verifies every file, vLLM serves the weights on loopback, and avrik serve puts the decision API in front.

pip install avrik "vllm==0.30.0"
avrik pull Avrik-Pro-12B --format bf16          # -> ~/.cache/avrik/Avrik-Pro-12B-bf16

HF_HUB_OFFLINE=1 VLLM_NO_USAGE_STATS=1 DO_NOT_TRACK=1 VLLM_BATCH_INVARIANT=1 \
  vllm serve ~/.cache/avrik/Avrik-Pro-12B-bf16 --served-model-name avrik \
  --dtype bfloat16 --max-model-len 70000 --logprobs-mode raw_logprobs \
  --host 127.0.0.1 --port 8000 &

avrik ask Avrik-Pro-12B --format bf16 --vllm-url http://127.0.0.1:8000 \
  --state "Customer bought headphones 12 days ago, unopened, receipt attached. \
Policy: unopened items within 30 days get a full refund." \
  --noul "Should the refund be approved?" --choice "Which action?=approve,deny,escalate"

avrik serve Avrik-Pro-12B --format bf16 --vllm-url http://127.0.0.1:8000   # API on :8080

On a CPU (Linux, macOS or Windows; no GPU needed). The first line installs llama.cpp’s prebuilt CPU wheel, so nothing has to compile.

pip install llama-cpp-python==0.3.35 --no-deps --only-binary=:all: \
  --index-url https://abetlen.github.io/llama-cpp-python/whl/cpu
pip install "avrik[cpu]"

avrik pull Avrik-Pro-12B                    # downloads avrik-ai/Avrik-Pro-12B-GGUF and verifies it
avrik ask Avrik-Pro-12B \
  --state "Customer bought headphones 12 days ago, unopened, receipt attached. \
Policy: unopened items within 30 days get a full refund." \
  --noul "Should the refund be approved?" \
  --choice "Which action?=approve,deny,escalate"
avrik serve Avrik-Pro-12B                   # the API on http://127.0.0.1:8080
RoutePurpose
POST /v1/systemoneDecide: state and questions in, calibrated answers out
GET /healthReadiness and the loaded build’s hashes
GET /v1/modelsThe served model
GET /openapi.jsonThe OpenAPI 3.1 schema
# Typed Python client, sync and async
pip install avrik-sdk

Use it well.

Set your own thresholds: approve above 0.95, send to a person between 0.2 and 0.95, and so on.

Built for

  • Automated decisions with a threshold a person sets
  • Triage, routing, policy and eligibility checks
  • Classification with calibrated confidence
  • A fast first stage in front of people or larger models

Not built for

  • Explanations or free text. It generates none.
  • Acting alone on legal, medical, financial, or safety decisions without human review
  • Images, in this release. Input is text or JSON.
  • Languages other than English, which haven’t been evaluated

Weakest dev-set areas: score_quality (4/10), long_policy_buried (7/16), order_invariance (8/10). The model judges only what’s in the state, so instructions planted there can sway it. Keep untrusted text clearly delimited.

Provenance you can check.

Every file is listed with its SHA-256 in MANIFEST.sha256. Inference makes no network calls, sends no telemetry, and stores nothing.

Basegoogle/gemma-4-12B-it at 707f0a3b8a3c7ad586ed01e27eafbad8a27dd0f7
RecipeFrozen base with fitted per-type temperatures. No fine-tuning.
Release gateFrozen base. Fine-tuned builds replace this one only if they beat it on the sealed, human-authored set.
bf16 buildModel hash avrik-ai/Avrik-Pro-12B@cfd9cc0c27e96d1ePrompt template 8d1575803fdb25b66865405afa0d2e6bb3df4eff08003e858769225b3bcc0b70
GGUF Q8_0 buildModel hash avrik-ai/Avrik-Pro-12B-GGUF@6fbf37d64038ea71Prompt template 3269884bf2b10959761578efcec48f09ec59ac185c735f0f759a9088440e2ce0
Releasev1.0.0, October 11, 2026
  • Tamper checksSwapped or altered downloads are refused, and the manifest’s own digest is pinned in the avrik package.
  • No code in releasesCode files, auto_map, and symlinks are refused. Tokenizers load with trust_remote_code=False.
  • LicenceApache 2.0 for the weights, calibration, and readout config. Keep NOTICE with any redistribution.

The rest of the family.

Same API, same question types. Move up a tier for accuracy, or down for speed and cost.

  • Edge4B

    Avrik-Lite-4B

    Calibrated decisions on an ordinary CPU.

    Dev-set accuracy
    86.6%
    Per decision on a laptop CPU
    5.0 s
    • GGUF Q4_K_M
    • bf16
    Hugging Face
  • Max31B

    Avrik-Max-31B

    The most accurate Avrik model, for the hardest calls.

    Dev-set accuracy
    96.9%
    Per decision on one H100
    168.4 ms

Get Avrik-Pro-12B on Hugging Face.

Open weights under Apache 2.0, with calibration and hashes for every build. Questions or a use case to talk through? We’d like to hear it.