Ollama 0.40.11: d3 decision models that never write a word, and Phonon speech on the Mac
Ollama 0.40.11 landed on October 24 with two features that look unrelated and are really one idea. The first is d3, a family of models that never write a sentence: you hand them a support ticket and a question, and they hand back a probability for every option you defined. The second is Phonon, a tiny text-to-speech model that reads a chat reply aloud on your Mac while it is still being generated. Both are small, specialised, local, and both quietly remove a cloud call from an agent pipeline. I read the release notes and both model cards, and the interesting part is where the pitch outruns the numbers.
What d3 actually returns
d3 comes from the vLLM Semantic Router team under Apache 2.0, and the Ollama library page is blunt about it: the model "does not write a conversational answer". You give it a state (text, structured JSON or a still image) and a set of questions. Each question is a choice between labelled options, a yes/no, or a score on an ordered scale. The output is a probability map over the options, plus a confidence equal to the winning option's probability. Locally that goes through a new endpoint, POST /v1/systemone on port 11434, or ollama.systemone() in the Python and JavaScript clients. On the CLI it looks like ollama run d3 "A customer says their card was charged twice." --ask "Which team should handle this?" followed by one --choice flag per label.
The upstream model card explains why this is cheap: every question gets its own forward pass over the input, and output tokens are always zero. There is no sampling, no "please answer with exactly one word", no regex to parse the reply. For routing, gating and tool selection that is exactly the contract I want. I made the same argument about the October wave of decision models: most of the value is the schema, and d3 is the first one I can pull with a single command.
The size ladder is a quality ladder
Ollama ships four sizes, and the publisher's Jev Decision Index 0.3.2 scores tell you more than the download sizes do.
| Tag | Loaded memory (Apple Silicon) | Text index | Vision index |
|---|---|---|---|
| d3:2b | 3.62 GB | 38.9 | 54.7 |
| d3:4b (default) | 5.63 GB | 52.6 | 63.2 |
| d3:9b | 10.09 GB | 55.8 | 66.9 |
| d3:27b | 28.61 GB | 66.3 | 71.3 |
The 27B checkpoint is a fine-tune of Qwen3.8-27B, and on the text index it beats Perplexity Decider v1.1 (62.8) and Decider 31B (64.6). That is the headline the morning brief carried. The part nobody puts in the headline is that the 2B model, the one you would actually run next to every agent step on an 8 GB machine, scores 38.9 on the same index. The 4B default sits at 52.6. The "replace your expensive classification call with a 2B model" story only holds for decisions that are easy enough that a 2B model gets them right, and you will not know which those are until you test on your own traffic.
Two more caveats from the card. The scores are for the original checkpoints, not the MXFP8 and Q8_0 packages Ollama distributes, and the library page lists a 256K context while its own limits section says the packages run at 4,096 tokens. Long tickets with attachments will be truncated. Ollama also only exposes text and still images; the upstream 27B reads video at 2 frames per second, but that path is not in the local packages. The brief described six sizes from 0.6B to 26B with video input; what actually shipped in Ollama is four sizes, 2B to 27B, without video.
A decision model gives you a probability, not a guarantee, and a threshold you never measured is just a guess with a decimal point.
The library page says it directly: scores and probabilities are model outputs, not real-world frequencies, so test before you set thresholds. I wrote about what happens when you skip that step in the JevAgentHarness piece, where a decider without a threshold cost 19 points.
Phonon: speech without a round trip
The second feature is smaller and, for my daily work, more fun. Per the Ollama blog, Phonon is a family of text-to-speech models from Gradium. The English phonon model has 31M parameters and is Apache 2.0. French, German, Spanish and Portuguese variants at 40M, plus a multilingual one, are CC BY-NC 4.0, which rules them out for anything commercial. It runs on Apple Silicon only for now, through MLX, and Ollama claims it is 35% faster than Gradium's own runtime on an M5 Max (45 seconds of speech, median of ten runs).
The useful trick is the pipe. ollama run gemma4 --hidethinking "..." | ollama run phonon starts speaking after the first sentence arrives, so a local assistant feels responsive even when the chat model is slow. For apps, the speech docs describe an OpenAI-compatible /v1/audio/speech endpoint that streams 24 kHz mono WAV or raw PCM, so existing OpenAI SDK code only needs a new base URL. The limits are honest: 4,096 characters per request, unsupported options return HTTP 400 rather than being silently ignored, and numeric dates like 10/23 are read as written, so feed it "October 23" instead.
What I would wire up this week
If you run agents locally, put d3:4b in front of one existing LLM classification call, not all of them. Log both answers for a few hundred real requests, plot accuracy against d3's confidence, and pick the threshold where the small model is right often enough that you stop paying for the big one below it. Everything under that threshold still goes to the generative model. Then pipe your slowest local chat model into Phonon and see whether the perceived latency problem you were going to buy hardware for disappears.