Decision Models¶
A judgment needs a decision model: a model built to score typed questions rather than generate text. Open-source ones are published as GGUF files on Hugging Face, and LM Studio runs the GGUF builds.
Models known to work¶
These three were verified end to end with this gem, over both decision endpoints:
| Model | Hugging Face | Params | Size | Images | decision_type |
License |
|---|---|---|---|---|---|---|
| D1 Omni 600M | LiquidAI/d1-omni-600M-GGUF | 600M | 0.8 GB | yes | lfm2-d1-omni |
Liquid AI's own license |
| Kev 0.8B | ggml-org/Kev-0.8B-GGUF | 753M | 0.8 GB | no | kev |
Apache-2.0 |
| Clef Flash | ggml-org/Clef-Flash-GGUF | 9.1B | 7.4 GB | yes | clef |
Apache-2.0 |
Download with lms get and the repository URL:
lms get https://huggingface.co/LiquidAI/d1-omni-600M-GGUF
lms get https://huggingface.co/ggml-org/Kev-0.8B-GGUF
lms get https://huggingface.co/ggml-org/Clef-Flash-GGUF
lms ls then lists them under their own DECISION heading.
Other repositories tagged
decision-model on
Hugging Face — the rest of the ggml-org Kev, Clef and vllm-d3 families, Laya,
Julia-1, LiquidAI's d1-3B — should work too, as long as LM Studio lists them as
decision models. Check each license: some (OpenJev, Bespoke-Nimble) are
non-commercial.
Which one to use¶
Measured on an M2 Max with the questions from example 18_decision_models.rb
(one ticket, three questions), warm model:
| Model | Time per judgment | Quality, in practice |
|---|---|---|
| D1 Omni 600M | ~30 ms | Strong on clear-cut text and spam; noticeably sensitive to wording; reads images reliably only over :system_one |
| Kev 0.8B | ~65 ms | Least sure of itself; sent "I was charged twice. Please fix it today." to other rather than billing, and could not spot a gift-card scam |
| Clef Flash | ~600 ms | Most accurate and most consistent across wording and endpoints; reads images over both endpoints |
A reasonable default: start with D1 Omni 600M, tune your questions on it,
and move to Clef Flash where the small model's answers aren't trustworthy
enough. Examples 16-20 default to D1 Omni 600M (LMS_DECISION_MODEL overrides
it).
It has to be a decision model to LM Studio¶
LM Studio decides what counts, and it must say so itself. GET /api/v1/models
reports a recognized model with type: "decision":
{ "key": "d1-omni-600m", "type": "decision", "decision_type": "lfm2-d1-omni",
"has_vision_adapter": true, "architecture": "lfm2", "format": "gguf" }
A model that merely shares a decision model's name is not enough. An MLX
conversion of Clef Flash (mlx-community/clef-flash) loads as an ordinary LLM,
and both decision endpoints reject it. Use the GGUF repositories above.
A chat model is refused with a RubyLLM::BadRequestError:
Invalid model identifier "qwen/qwen3.8-27b". Please specify a valid downloaded
model (e.g., d1-omni-600m, kev-0.8b, clef-flash).
With no decision model downloaded at all, the message is "There are no downloaded decision models."
How the gem lists them¶
provider.list_models reports decision models as judgment models, so you can
find them programmatically:
provider = RubyLLM::Provider.resolve!(:lms).new(RubyLLM.config)
deciders = provider.list_models.select { |model| model.capabilities.include?('judgment') }
deciders.each do |model|
puts [model.id, model.metadata[:decision_type], model.modalities.input.inspect].join(' ')
end
# clef-flash clef ["text", "image"]
# d1-omni-600m lfm2-d1-omni ["text", "image"]
# kev-0.8b kev ["text"]
| Field | For a decision model |
|---|---|
capabilities |
["judgment"] and nothing else — they don't chat |
modalities.output |
["judgment"] |
modalities.input |
["text"], plus "image" when LM Studio reports a vision adapter |
metadata[:decision_type] |
the kind of decision model, as LM Studio reports it |
Loading and memory¶
Decision models load on demand like any other model, with the same idle TTL.
One quirk worth knowing: if you load a model yourself (in the app, or with
lms load) and a decision request then loads it on demand, LM Studio can start
a second instance beside yours. lms ps shows both (clef-flash and
clef-flash:2), each holding its own memory, and judgment.model reports the
instance that answered — clef-flash:2, not the model id. Unload the copy you
don't need with lms unload.