Saina Helm 0.8B — GGUF
CPU build of run-saina/saina-helm-0.8b, a decision model that answers typed questions (yes/no, single choice, multiple choice, rating) with probabilities. No text is generated.
Try it in the browser: Saina Helm decision demo (no install).
| File | Size |
|---|---|
saina-helm-0.8b-q8_0.gguf | 0.8 GB |
saina-helm-0.8b-f16.gguf | 1.5 GB |
The GGUF holds the model trunk only. The probability head (head.safetensors) is
applied in Python by helm.py. It does not work as a chat model in
llama-server, Ollama or LM Studio: it needs the small helm-hidden runner, which
returns the final hidden state for a list of token IDs.
Build the runner
Tested with llama.cpp commit abeada335e2e78bd3fe63febafab7e900ce75810; the C API it
uses changes between versions.
git clone https://github.com/ggml-org/llama.cpp && git -C llama.cpp checkout abeada335e2e78bd3fe63febafab7e900ce75810
cmake -S llama.cpp -B llama.cpp/build -DGGML_CUDA=OFF -DGGML_METAL=OFF -DLLAMA_BUILD_TESTS=OFF
cmake --build llama.cpp/build --target llama -j 8
c++ -std=c++17 -O3 hidden.cpp -Illama.cpp/include -Illama.cpp/ggml/include \
-Lllama.cpp/build/bin -Wl,-rpath,"$PWD/llama.cpp/build/bin" -lllama -o helm-hidden
Usage
pip install transformers safetensors numpy huggingface_hub
hf download run-saina/saina-helm-0.8b-GGUF --local-dir saina-helm-gguf
import sys; sys.path.insert(0, 'saina-helm-gguf')
from helm import Helm
model = Helm('saina-helm-gguf', runner='./helm-hidden', filename='saina-helm-0.8b-q8_0.gguf')
Call model.close() when done.
Question types
ask() takes a piece of state (text or JSON) and any number of typed questions,
each answered with its own forward pass:
| Type | You provide | You get |
|---|---|---|
yes_no | question, optional descriptions: {yes, no} | yes, no, confidence |
single_choice | question, options: {key: description or None} (2–255) | probabilities, selection, confidence |
multi_choice | question, options (2–255) | independent memberships per option |
rating | question, ordered levels (2–10) | probabilities per level, expected_level, confidence |
answers = model.ask(
state='Order #4417: parcel arrived crushed, customer wants their money back. Third complaint this month.',
questions={
'refund': {'type': 'yes_no', 'question': 'Is a refund requested?'},
'team': {'type': 'single_choice', 'question': 'Which team should handle this?',
'options': {'billing': 'Payments and refunds', 'shipping': 'Delivery and carriers', 'tech': None}},
'issues': {'type': 'multi_choice', 'question': 'Which issues apply?',
'options': {'damaged': 'Item damaged', 'late': 'Late delivery', 'repeat': 'Repeat complainer'}},
'urgency': {'type': 'rating', 'question': 'How urgent is this?',
'levels': ['Low', 'Medium', 'High', 'Critical']},
},
)
answers['urgency']['expected_level'] # e.g. 1.9 -> between Medium and High
Decision mode. Pass mode='decision' with a threshold (default 0.8) and,
for yes_no / single_choice, an optional min_margin; both can be overridden per
question. The answer then includes selected / selection / selections / level,
set to None with a reason (below_threshold, below_margin, tie) when the
model is not confident enough, so you can abstain and escalate instead of guessing.
Rating confidence accounts for distance between levels: probability spread across
neighbouring levels costs less than spread across distant ones.
For raw scores, model.predict(context, question, choices, mode='single_label' | 'multi_label')
returns one probability per choice.
Precision
f16 tracks the original model closely; q8_0 is smaller and faster with slightly larger probability differences. Top choices matched the original on our checks.
Versions
| Version | Date | Changes |
|---|---|---|
v1.0 | 2026-10-07 | First public release. |
Each release is a git tag on this repo, and main is the newest. Retrains that
only change the weights bump the minor version (v1.1). Changes that need callers
to change something (labels, prompt format, architecture) bump the major (v2.0).
Scores can shift between versions, so pin a tag if you've tuned thresholds.
hf download run-saina/saina-helm-0.8b-GGUF --revision v1.0
The matching weights are tag v1.0 of run-saina/saina-helm-0.8b.
Limitations
- Probabilities are not calibrated; set thresholds on your own data.
- Results are sensitive to how options and questions are phrased.
- Evaluate on your task before relying on it for consequential decisions.