A System One decision model with open weights. Give it a document (text, email, ticket, log or JSON) and typed
questions; it returns typed answers (yes/no, a choice between options you describe, or a score on levels you define)
with a calibrated probability for every option, in one pass. It never generates text, so there is nothing to parse and
nothing to hallucinate. It runs on your own machines: your documents never leave them.
About 26B parameters, built on Google Gemma 4 26B-A4B (mixture of experts, about 4B active per token). Everything it needs is in this repository, so nothing else is downloaded. English text, up to 4,096 input tokens; needs one GPU with about 60 GB of memory (bf16).
| Model |
Size |
Runs on |
Best for |
Status |
| Bev-Large-C |
0.4B (ModernBERT-large base) |
laptop CPU/GPU, edge boxes, any GPU |
operations documents, logs and alerts, counting, amounts and limits, ticket routing, request safety |
coming soon |
| Bev-Pro-C |
26B (Gemma 4 26B-A4B base) |
one GPU with about 60 GB |
knowledge-heavy decisions: contracts, finance topics, large intent sets, dates and payment status |
available |
Installation
python -m pip install "bev-decisions[pro]"
Python 3.10 or newer. Optional extras: bev-decisions[serve] (HTTP server), bev-decisions[mcp] (MCP server for AI
assistants and agents), bev-decisions[structured] (Pydantic schemas), bev-decisions[all]. The first bev.load()
downloads the model from this repository and caches it; after that it works offline.
Quickstart
import bev
model = bev.load("sathiskumarjothi0/Bev-Pro-C")
answers = model.decide(
"Subject: Charged twice for order 88412. I was billed $49.99 twice on 3 October. Please refund one payment today.",
{
"team": {"type": "choice", "instructions": "Which team should handle this ticket?",
"criteria": {"billing": "payments, invoices, refunds", "tech": "bugs, outages, errors", "sales": "pricing and plans"}},
"urgent": {"type": "noul", "instructions": "Does the customer ask for urgent handling?"},
"severity": {"type": "score", "instructions": "How severe is the problem for the customer?", "criteria": ["low", "medium", "high"]},
},
)
answers["team"] # {"choice": ..., "confidence": ..., "probabilities": {...}}
| Type |
Use it for |
Answer |
noul |
yes or no |
noul: probability of yes |
choice |
one of the options you define (criteria: key → description, up to 300) |
choice, confidence, probabilities |
score |
ordered levels (criteria: list or key → description, lowest first) |
label, score (expected level), confidence, probabilities |
Up to 16 questions per call share one read of the document.
Confidence gating
sure, review = bev.gate(answers, threshold=0.8) # act on `sure`, send `review` to a person
Route mode
Route mode sends every question to Bev-Large-C first and only the unsure answers to Bev-Pro-C:
router = bev.Router(load_strong=True, threshold=0.8)
result = router.decide(text, questions)
result["answers"], result["routing"] # routing: {"team": "fast", "urgent": "strong"}
Route mode needs Bev-Large-C, which is coming soon.
Schema-driven decisions
from typing import Literal
from pydantic import BaseModel, Field
class Ticket(BaseModel):
urgent: bool = Field(description="Does the customer ask for urgent handling?")
team: Literal["billing", "tech", "sales"] = Field(description="Which team should handle this ticket?")
ticket = bev.decide_as(model, text, Ticket) # Ticket(urgent=True, team='billing')
Self-hosting: HTTP and MCP
pip install "bev-decisions[serve]"
bev serve --model sathiskumarjothi0/Bev-Pro-C --port 8000 # POST /v1/decide, /v1/batch; GET /v1/presets, /health
pip install "bev-decisions[mcp]"
bev mcp --model sathiskumarjothi0/Bev-Pro-C # tools: decide, decide_preset, list_presets
The server listens on 127.0.0.1 without authentication; put it behind your own gateway before exposing it. Docker files
and examples are in the GitHub repository.
Benchmarks
Accuracy (%) = correct answers ÷ questions on held-out test sets; the same cases for every system (October 2026). Bold =
best in the row; – = not run. * = an area Bev was not built for.
Decisions on documents
| Test |
Bev-Pro-C |
Jev |
Mistral Large 4 |
Mistral Large 3 |
gpt-oss 120B |
Gemma 4 31B |
Nemotron 3 Super |
| Bev-Bench (operations documents) |
91.9 |
87.9 |
83.7 |
74.6 |
91.1 |
88.9 |
70.6 |
| Typed decisions |
79.2 |
73.8 |
72.0 |
68.0 |
68.8 |
75.0 |
62.7 |
| Rules-Bench (rules shown) |
92.0 |
92.3 |
83.1 |
81.4 |
94.5 |
91.6 |
82.7 |
| JailbreakBench refusal |
84.0 |
83.5 |
77.5 |
62.0 |
68.0 |
87.5 |
65.0 |
| Aegis 2.0 request safety |
78.2 |
71.5 |
70.5 |
66.9 |
69.5 |
73.1 |
69.3 |
Public classification tests
| Test |
Bev-Pro-C |
Jev |
Mistral Large 4 |
Mistral Large 3 |
gpt-oss 120B |
Gemma 4 31B |
Nemotron 3 Super |
| AG News |
90.6 |
91.8 |
90.8 |
88.8 |
88.8 |
91.8 |
87.8 |
| Emotion |
56.2 |
57.6 |
55.8 |
55.6 |
57.8 |
55.4 |
50.2 |
| Banking77 (77 intents) |
70.6 |
79.2 |
75.8 |
71.2 |
81.0 |
78.8 |
69.2 |
| SST-5 (5-level sentiment) |
51.8 |
56.8 |
51.4 |
49.4 |
49.6 |
53.2 |
46.8 |
| XNLI (English) |
86.4 |
89.2 |
84.8 |
77.6 |
80.2 |
89.2 |
75.0 |
| MASSIVE intents |
74.8 |
80.8 |
78.4 |
75.2 |
81.6 |
83.8 |
69.4 |
Areas Bev was not built for
| Test |
Bev-Pro-C |
Jev |
Mistral Large 4 |
Mistral Large 3 |
gpt-oss 120B |
Gemma 4 31B |
Nemotron 3 Super |
| Product reviews* |
96.4 |
96.4 |
96.4 |
96.6 |
95.4 |
97.2 |
94.8 |
| Unfair contract terms* |
76.0 |
62.0 |
54.6 |
52.8 |
47.6 |
74.4 |
44.0 |
| Financial-news sentiment* |
59.2 |
66.4 |
64.0 |
50.4 |
68.4 |
71.2 |
64.0 |
| Poem sentiment* |
65.1 |
44.5 |
42.6 |
32.1 |
59.8 |
62.7 |
45.5 |
| Support intents* |
88.0 |
89.8 |
85.4 |
86.2 |
90.0 |
90.4 |
76.6 |
| Toxic comments* |
79.2 |
78.8 |
68.0 |
73.0 |
80.8 |
76.4 |
69.6 |
| Financial-news topics* |
69.8 |
65.0 |
61.8 |
61.6 |
63.4 |
64.2 |
57.2 |
| Legal case holdings* |
71.2 |
77.6 |
69.2 |
72.2 |
61.2 |
71.6 |
55.0 |
Bev-Bench, question by question
Averages hide weak spots. Bold = within 10 points of always answering the most common label, i.e. little or no skill.
| Question (300 cases each) |
Bev-Pro-C |
Always-most-common baseline |
| Invoice: payment status vs due date |
100.0% |
38.3% |
| Security log: attack category |
100.0% |
20.7% |
| Security log: severity |
100.0% |
39.0% |
| Outage alert: root cause |
100.0% |
5.3% |
| Outage alert: SLO breached? |
100.0% |
82.0% |
| Ticket: urgent? |
100.0% |
66.0% |
| Which date is earlier |
100.0% |
50.0% |
| Choosing among many options |
100.0% |
0.7% |
| Comparing two amounts |
99.3% |
52.0% |
| Ticket: which department |
94.7% |
16.0% |
| Security log: failed-login count |
91.3% |
59.7% |
| Invoice: how late |
89.3% |
35.3% |
| Invoice: total over a limit? |
85.0% |
51.3% |
| Invoice: items above a price |
82.7% |
14.7% |
| Long log: intrusion? |
74.0% |
52.7% |
| Ticket: sentiment |
70.3% |
24.3% |
| Counting items in a list |
62.7% |
10.0% |
Calibration
| Test |
Accuracy |
Answered at confidence ≥ 0.8 |
Accuracy of those |
ECE |
| Bev-Bench (operations documents) |
91.9% |
89.7% |
95.0% |
0.032 |
| Rules-Bench (rules shown) |
92.0% |
87.2% |
97.0% |
0.011 |
| Aegis 2.0 request safety |
78.2% |
51.1% |
92.6% |
0.024 |
| Product reviews |
96.4% |
93.0% |
97.9% |
0.014 |
| Support intents |
88.0% |
98.8% |
88.3% |
0.105 |
| Typed decisions |
79.2% |
61.7% |
91.5% |
0.040 |
ECE (expected calibration error) = Σ over 10 confidence bins of (share of answers in the bin × |accuracy − mean
confidence|); 0 is perfect. Example: a bin holding 40% of the answers at mean confidence 0.95 with 90% of them right adds
0.4 × 0.05 = 0.02. Calibration temperatures: noul 1.0, choice 1.2, score 1.2.
Package check
This repository, loaded with the bev-decisions package, was checked against the official evaluation run (accuracy = correct ÷ questions on the same cases):
| Test |
Questions |
Package |
Official run |
| Bev-Bench (operations documents) |
1,200 |
88.9% |
89.2% |
| Typed decisions |
1,500 |
79.9% |
79.3% |
| Product reviews |
300 |
97.3% |
98.0% |
A few answers that are close to a tie can change with batch size on a mixture-of-experts model in bf16; accuracy stays within 1 point.
Honest limits
- Knowledge-heavy decisions are not solved: legal case holdings 71.2%, financial-news topics 69.8%.
- Questions with more than 26 options are answered as a tournament (a winner per group of 26, then a final); accuracy is lower there (Banking77 70.6%) and confidence less well calibrated.
- Five-level sentiment is hard (SST-5 51.8%).
- Needs a large GPU; for laptops and edge boxes use Bev-Large-C (coming soon).
- English only; text beyond 4,096 tokens is cut; no images.
- Not for medical, legal or financial advice. For decisions with serious consequences, validate on your own data
(
bev eval my_cases.jsonl) and keep a person in the loop.
Files
| File |
Contents |
model-*.safetensors, config.json, tokenizer files |
Gemma 4 26B-A4B, unchanged (bf16) |
adapter/ |
Bev's decision weights, loaded together with Gemma's |
bev_config.json |
Bev settings and calibration temperatures |
NOTICE |
Gemma attribution (Apache-2.0) |
assets/ |
the charts on this page |
Links
Support
If Bev is useful to you, you can support its development: buymeacoffee.com/sjothi
Licence and credit
Apache-2.0, © 2026 Dr. Sathiskumar JOTHI. Built on Gemma 4 26B-A4B (Apache-2.0) by Google. Bev is named after Sir William Beveridge (1879–1963), British
economist, whose 1942 Beveridge Report laid the foundations of the welfare state and the NHS.