basal-omni-1.0-mini (Gemma 4 E4B) is the small model of basal-omni, basal's line on Google Gemma 4 (with basal-omni-1.0-max, 12B). It is an experimental release: it is trained on text decisions only, and it also answers the same questions about images and audio, read by Gemma 4's own encoders without media training (zero-shot; media training comes in the next releases). It answers the same typed questions as basal-1.5, over the same API.
What it is. Inspired by System 1 (fast, intuitive) decision models such as Jev. Instead of writing an answer,
the model reads a state (a message, a document, retrieved passages, an agent trace, a web page as JSON). It then
answers a typed question about it (choice, yes/no noul, score, and in the basal engine multi, act and
tool; a tool question over OpenAI or MCP tool definitions picks the tool, not its arguments). The answer is a
calibrated probability for each allowed answer, in one forward pass, without generating text. The answer never
falls outside the options you give, and the probability says how sure the model is.
What is new against basal-1.5 (4.5B).
"media", served with --media on), zero-shot.Served with the basal engine on one H100: basal-omni-1.0-mini with --mode eager, bf16, one option order; basal-1.5 (4.5B) as released (--mode fast, both option orders). Same items and the same clients for both.
| benchmark | basal-omni-1.0-mini (E4B) | basal-1.5 (4.5B) |
|---|---|---|
| Werdykt v1, macro (hidden PL + EN, 10 categories × 2 languages) | 0.769 | 0.721 |
| PL decisions (held-out test of basal-1.0, 7,081 items) | 0.932 | 0.922 |
| PL general (knowledge, exams, reading; 3,079 items) | 0.751 | 0.746 |
| PL-Real (300 real Polish documents) | 0.950 | 0.963 |
| EN external panel (10 public English decision tasks, 3,842 items) | 0.740 | 0.688 |
| Coverage at 1% error (share decided automatically with the shipped threshold) | 42.0%¹ | 51.0% |
--deterministic (one request per forward; no difference from the default mode on our tests). Weakest categories: rules (0.352; compute exact thresholds and dates in code), contracts (0.664) and long documents (0.686).1. Install into a fresh uv environment:
uv venv --python 3.12 --allow-existing ~/basal-env && source ~/basal-env/bin/activate
uv pip install torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cu128
uv pip install "basal[media] @ https://github.com/rkinas/basal/archive/refs/tags/v2.0.0.tar.gz"
2. Start the server. It prints basal: model ... ready:
basal-serve --model Remek/basal-omni-1.0-mini --mode eager --media on --port 8000
This release runs in the engine's eager mode only (PyTorch, bf16, about 16 GB of GPU memory). The fast mode
(shared prefix, CUDA graphs), the FP8 checkpoints and the MLX / GGUF ports of basal-1.5 come with a later release of
this line.
3. Ask questions, exactly as with basal-1.5:
curl -s localhost:8000/v1/systemone -H 'content-type: application/json' -d '{
"state": "Klient: od wczoraj nie mogę zalogować się do bankowości internetowej, system pokazuje błąd hasła.",
"questions": {
"dept": {"type": "choice", "instructions": "Do którego działu skierować zgłoszenie?",
"criteria": {"cards": "Reklamacje kart", "online": "Wsparcie bankowości elektronicznej", "loans": "Kredyty"}},
"urgent": {"type": "noul", "instructions": "Czy klient nie może korzystać z usługi?"}}}'
Full API (multi, act, tool, option keys, max_error): API.
With --media on, a request may carry images and audio with its state. They are placed where the state text goes,
before it, in the order given; the state text may be empty.
IMG=$(base64 < paragon.jpg | tr -d '\n')
curl -s localhost:8000/v1/systemone -H 'content-type: application/json' -d '{
"state": "", "lang": "pl",
"media": [{"type": "image", "data": "'"$IMG"'"}],
"questions": {
"card": {"type": "noul", "instructions": "Czy zapłacono kartą?"},
"vat": {"type": "choice", "instructions": "Jaka jest najwyższa stawka VAT na paragonie?",
"criteria": {"23": "23%", "8": "8%", "5": "5%", "0": "0% lub zwolniony"}}}}'
"media": a list of {"type": "image" | "audio", "data": "<base64>"} (a data: URL works too). Images: any format
Pillow reads. Audio: WAV, FLAC, OGG or MP3, any sample rate (mixed to mono, resampled to 16 kHz), at most 30 s a clip."detail": "default" (280 image tokens) or "high" (1,120; small print, slower)."lang": "pl" or "en", the prompt language when the state text does not show it (a state that is only media)."calibration": "text": the temperatures and the certified thresholds were fitted on text; validate
the thresholds on your own media before automating with them.On omni-probe-pl, our small Polish probe (each item asked from the media and from its text):
| probe | items | from the media | from the text | untrained Gemma 4 E4B, from the media |
|---|---|---|---|---|
| decision from an image of a rendered document | 160 | 0.725 | 0.831 (the document's text) | 0.500 |
| decision about a real photo | 150 | 0.667 | 0.507 (the question alone) | 0.640 |
| intent of a spoken request (MINDS-14) | 140 | 0.921 | 0.943 (transcript) | 0.900 |
| topic of a spoken passage | 100 | 0.870 | 0.900 (transcript) | 0.860 |
| spoken decision | 45 | 0.844 | 0.956 (transcript) | 0.600 |
One question per request, one option order, on one H100 (--mode eager, bf16, --media on):
| measurement | result |
|---|---|
| sequential, 200 requests | 61 ms p50 / 80 ms p95 per question |
| 32 concurrent clients, 1,000 requests | 35.2 decisions/s |
fast mode: 8.0 decisions/s).--orders 2 costs about twice as much per question.model-*.safetensors, tokenizer, chat_template.jinja, processor_config.json: the model.
--media on (processor_config.json).CALIBRATION.json: per-type temperatures and certified confidence thresholds for 1% / 5% error, fitted on the
served engine (--mode eager, bf16, one option order).CALIBRATION.o2.json: the same for --orders 2 (both option orders averaged).basal.json: prompt format 2 and the readout protocol.The model receives a fixed chat prompt with the state, the question and coded options (A–Z, then two-character codes,
up to 255). The assistant turn is prefilled with {"answer": ", and the decision is the softmax over the next-token
logits of the option codes only: one forward pass, no text generation. The server applies the calibrated temperature of
the question type from CALIBRATION.json.
Use the confidence. CALIBRATION.json stores thresholds for a target error of 1% or 5% among accepted decisions.
They were chosen on calibration data before testing; on the test data they accept 42.0% / 77.4% of decisions at 0.70% / 3.7% observed error (at the 1% target score questions have no certified threshold and are deferred). Accept decisions above the threshold
automatically and route the rest to a person.
eager engine only; the fast mode, FP8 and the MLX / GGUF ports come later.--orders 2 reduces sensitivity to option order at twice the cost.tool with no fitting tool: mini often answers "ask the user" instead of "no suitable tool" (4 of 6
out-of-scope requests in our test); do not rely on it to refuse requests no tool covers.@software{kinas2026basal20,
title = {basal-2.0: typed-decision models and inference engine for Polish and English},
author = {Kinas, Remigiusz},
year = {2026},
version = {2.0.0},
url = {https://github.com/rkinas/basal}
}
@techreport{kinas2026basal,
title = {basal-1.0: Reliable, Highly Optimized Typed Decisions for Polish},
author = {Kinas, Remigiusz},
institution = {ai5},
year = {2026},
type = {Technical report},
doi = {10.5281/zenodo.23022986},
url = {https://doi.org/10.5281/zenodo.23022986}
}
Apache-2.0. Fine-tuned from google/gemma-4-E4B-it (Apache-2.0).
basal-omni-1.0-mini (Gemma 4 E4B) is the small model of basal-omni, basal's line on Google Gemma 4 (with basal-omni-1.0-max, 12B). It is an experimental release: it is trained on text decisions only, and it also answers the same questions about images and audio, read by Gemma 4's own encoders without media training (zero-shot; media training comes in the next releases). It answers the same typed questions as basal-1.5, over the same API.
What it is. Inspired by System 1 (fast, intuitive) decision models such as Jev. Instead of writing an answer,
the model reads a state (a message, a document, retrieved passages, an agent trace, a web page as JSON). It then
answers a typed question about it (choice, yes/no noul, score, and in the basal engine multi, act and
tool; a tool question over OpenAI or MCP tool definitions picks the tool, not its arguments). The answer is a
calibrated probability for each allowed answer, in one forward pass, without generating text. The answer never
falls outside the options you give, and the probability says how sure the model is.
What is new against basal-1.5 (4.5B).
"media", served with --media on), zero-shot.Served with the basal engine on one H100: basal-omni-1.0-mini with --mode eager, bf16, one option order; basal-1.5 (4.5B) as released (--mode fast, both option orders). Same items and the same clients for both.
| benchmark | basal-omni-1.0-mini (E4B) | basal-1.5 (4.5B) |
|---|---|---|
| Werdykt v1, macro (hidden PL + EN, 10 categories × 2 languages) | 0.769 | 0.721 |
| PL decisions (held-out test of basal-1.0, 7,081 items) | 0.932 | 0.922 |
| PL general (knowledge, exams, reading; 3,079 items) | 0.751 | 0.746 |
| PL-Real (300 real Polish documents) | 0.950 | 0.963 |
| EN external panel (10 public English decision tasks, 3,842 items) | 0.740 | 0.688 |
| Coverage at 1% error (share decided automatically with the shipped threshold) | 42.0%¹ | 51.0% |
--deterministic (one request per forward; no difference from the default mode on our tests). Weakest categories: rules (0.352; compute exact thresholds and dates in code), contracts (0.664) and long documents (0.686).1. Install into a fresh uv environment:
uv venv --python 3.12 --allow-existing ~/basal-env && source ~/basal-env/bin/activate
uv pip install torch==2.11.0 torchvision==0.26.0 --index-url https://download.pytorch.org/whl/cu128
uv pip install "basal[media] @ https://github.com/rkinas/basal/archive/refs/tags/v2.0.0.tar.gz"
2. Start the server. It prints basal: model ... ready:
basal-serve --model Remek/basal-omni-1.0-mini --mode eager --media on --port 8000
This release runs in the engine's eager mode only (PyTorch, bf16, about 16 GB of GPU memory). The fast mode
(shared prefix, CUDA graphs), the FP8 checkpoints and the MLX / GGUF ports of basal-1.5 come with a later release of
this line.
3. Ask questions, exactly as with basal-1.5:
curl -s localhost:8000/v1/systemone -H 'content-type: application/json' -d '{
"state": "Klient: od wczoraj nie mogę zalogować się do bankowości internetowej, system pokazuje błąd hasła.",
"questions": {
"dept": {"type": "choice", "instructions": "Do którego działu skierować zgłoszenie?",
"criteria": {"cards": "Reklamacje kart", "online": "Wsparcie bankowości elektronicznej", "loans": "Kredyty"}},
"urgent": {"type": "noul", "instructions": "Czy klient nie może korzystać z usługi?"}}}'
Full API (multi, act, tool, option keys, max_error): API.
With --media on, a request may carry images and audio with its state. They are placed where the state text goes,
before it, in the order given; the state text may be empty.
IMG=$(base64 < paragon.jpg | tr -d '\n')
curl -s localhost:8000/v1/systemone -H 'content-type: application/json' -d '{
"state": "", "lang": "pl",
"media": [{"type": "image", "data": "'"$IMG"'"}],
"questions": {
"card": {"type": "noul", "instructions": "Czy zapłacono kartą?"},
"vat": {"type": "choice", "instructions": "Jaka jest najwyższa stawka VAT na paragonie?",
"criteria": {"23": "23%", "8": "8%", "5": "5%", "0": "0% lub zwolniony"}}}}'
"media": a list of {"type": "image" | "audio", "data": "<base64>"} (a data: URL works too). Images: any format
Pillow reads. Audio: WAV, FLAC, OGG or MP3, any sample rate (mixed to mono, resampled to 16 kHz), at most 30 s a clip."detail": "default" (280 image tokens) or "high" (1,120; small print, slower)."lang": "pl" or "en", the prompt language when the state text does not show it (a state that is only media)."calibration": "text": the temperatures and the certified thresholds were fitted on text; validate
the thresholds on your own media before automating with them.On omni-probe-pl, our small Polish probe (each item asked from the media and from its text):
| probe | items | from the media | from the text | untrained Gemma 4 E4B, from the media |
|---|---|---|---|---|
| decision from an image of a rendered document | 160 | 0.725 | 0.831 (the document's text) | 0.500 |
| decision about a real photo | 150 | 0.667 | 0.507 (the question alone) | 0.640 |
| intent of a spoken request (MINDS-14) | 140 | 0.921 | 0.943 (transcript) | 0.900 |
| topic of a spoken passage | 100 | 0.870 | 0.900 (transcript) | 0.860 |
| spoken decision | 45 | 0.844 | 0.956 (transcript) | 0.600 |
One question per request, one option order, on one H100 (--mode eager, bf16, --media on):
| measurement | result |
|---|---|
| sequential, 200 requests | 61 ms p50 / 80 ms p95 per question |
| 32 concurrent clients, 1,000 requests | 35.2 decisions/s |
fast mode: 8.0 decisions/s).--orders 2 costs about twice as much per question.model-*.safetensors, tokenizer, chat_template.jinja, processor_config.json: the model.
--media on (processor_config.json).CALIBRATION.json: per-type temperatures and certified confidence thresholds for 1% / 5% error, fitted on the
served engine (--mode eager, bf16, one option order).CALIBRATION.o2.json: the same for --orders 2 (both option orders averaged).basal.json: prompt format 2 and the readout protocol.The model receives a fixed chat prompt with the state, the question and coded options (A–Z, then two-character codes,
up to 255). The assistant turn is prefilled with {"answer": ", and the decision is the softmax over the next-token
logits of the option codes only: one forward pass, no text generation. The server applies the calibrated temperature of
the question type from CALIBRATION.json.
Use the confidence. CALIBRATION.json stores thresholds for a target error of 1% or 5% among accepted decisions.
They were chosen on calibration data before testing; on the test data they accept 42.0% / 77.4% of decisions at 0.70% / 3.7% observed error (at the 1% target score questions have no certified threshold and are deferred). Accept decisions above the threshold
automatically and route the rest to a person.
eager engine only; the fast mode, FP8 and the MLX / GGUF ports come later.--orders 2 reduces sensitivity to option order at twice the cost.tool with no fitting tool: mini often answers "ask the user" instead of "no suitable tool" (4 of 6
out-of-scope requests in our test); do not rely on it to refuse requests no tool covers.@software{kinas2026basal20,
title = {basal-2.0: typed-decision models and inference engine for Polish and English},
author = {Kinas, Remigiusz},
year = {2026},
version = {2.0.0},
url = {https://github.com/rkinas/basal}
}
@techreport{kinas2026basal,
title = {basal-1.0: Reliable, Highly Optimized Typed Decisions for Polish},
author = {Kinas, Remigiusz},
institution = {ai5},
year = {2026},
type = {Technical report},
doi = {10.5281/zenodo.23022986},
url = {https://doi.org/10.5281/zenodo.23022986}
}
Apache-2.0. Fine-tuned from google/gemma-4-E4B-it (Apache-2.0).