hugging-apps/decider-2b-demo
decider-2b
A Gradio demo for `Mapika/decider-2b` (release v10).
The model does not generate text. It reads a state — free text or any JSON value — and a set of typed questions, each carrying its own option list, and returns a calibrated probability distribution for every question from a single forward pass. The answer letters are never generated: the hidden state at one Answer k: ( slot per question is projected onto the option-label rows of the LM head and softmaxed over the valid labels only. There is no decoding, no parsing and no output outside the options you defined.
1.9B parameters on Qwen/Qwen3.5-2B-Base, bf16 (~4 GB), served on ZeroGPU.
How to use it
Two textareas. State is what the decisions are about. Typed questions holds one question per blank-line-separated paragraph:
choice department: Which team should handle this?
- returns: Exchanges, refunds, wrong or damaged items
- billing: {"what": "Charges, invoices", "not_for": "delivery"}
- other
noul refund_requested: Does `ticket.messages[0].text` request a refund?
score frustration: How frustrated is the customer?
- calm
- frustrated
- very frustratedThe first line is <type> <id>: <instructions>. <type> is one of:
<type> may be omitted (choice is assumed) and <id> is optional — ids are only used to key the answer and are never shown to the model. Questions may reference a part of a JSON state by path, as in the example above.
Advanced settings holds the temperature applied to the option logits before the softmax (1.30 is the value fitted on in-task data and shipped in the checkpoint's decider_config.json — the calibrated setting), whether each question is scored in its own row, and whether Score levels are judged in isolation.
The Raw /v1/systemone response accordion shows the exact wire-format answer (TypeSafe's Jev format), and The prompt the model was shown accordion shows the rendered rows, so the one-pass slot readout is inspectable.
Examples
All six are the authors' own, unmodified:
- the support-ticket request from the model card's quick start (JSON state, one question of each type);
- the four-message bank routing schema from `examples/routing_with_confidence.py`;
- the Safari bug report and three Score rubrics from `examples/composite_scoring.py`;
- the duplicate-charge ticket and the ten-field incident schema from
decider/infer.py's own demo block; - a FrozenLake board rendered exactly as
decider/games/envs.pyrenders it, asked with the action question fromdecider/games/play.py— agent action choice is one of the training distributions.
What it is and is not
- Calibrated. Trained with a proper scoring rule; one temperature fitted on in-task data and checked on 28 held-out datasets (ECE 0.02–0.09). v10 adds 384 steps of calibration-aware RL whose only rewards are outcomes from live browser tasks and the exact probability laws of games.
- Not a chat model. It is called from software. Open-ended input still yields a distribution over your options.
- A 2B model without reasoning. Knowledge-heavy multiple choice barely improves over the base model, and a judgment needing several steps should be split into several questions. Rules embedded in a question ("fill if empty, otherwise skip") are not followed at this size. English only.
Implementation notes
decider/ is the authors' own inference subset, vendored verbatim from the model repository (github.com/Mapika/decider, Apache-2.0): prompt.py, model.py, systemone.py, infer.py. app.py's _system_one is decider.infer.Decider.system_one's eager branch with two changes: the checkpoint is loaded once at module scope and moved to CUDA eagerly (ZeroGPU), and the temperature is an explicit argument rather than instance state so concurrent requests cannot race. The prompt layout, the per-question row isolation, the isolated Score levels, the restriction of the answer logits to the option-label tokens and the -inf masking of unused slots are unmodified reference behaviour.
decider.engine's shape-bucketed CUDA graphs are deliberately not used: graph capture inside a forked ZeroGPU worker buys little for a single interactive request. The reference reports 49 ms per request for this eager path on a GH200.
Model weights: Apache-2.0. Space code: Apache-2.0.
