Ornith released 1.5 in August in three scales — 397B MoE, 35B MoE, and 9B dense — with open weights under MIT and quantizations the same day for all three. The headline the company wants you to read is the big model’s: the 397B scores 86.1 on Terminal-Bench 2.1 and sits right next to Claude Opus 4.8. Very nice. You’re not going to run a 397B model, and neither am I.
The number that deserves your attention is at the other end of the family. The 9B scores 70.6 on SWE-bench Verified. As reference, the 397B on that same table scores 86. The model that is forty-four times smaller holds 82% of the score — and the file you download to have it weighs 5.63 GB.
That’s a laptop. Let’s install it.
What actually got released, and what each size costs you
Ornith uploaded everything to Hugging Face in the ornith-15 collection the same day: bf16 weights for all three sizes, GGUF for all three, FP8 and NVFP4 for the two MoEs, and MLX for the 9B and 35B. All the model cards I reviewed declare MIT. It’s worth pointing out because the announcement page doesn’t use the word “license” or “MIT” anywhere — the license lives only on the Hugging Face cards.
Here’s the honest hardware ladder:
| Model | Architecture | What the card asks for | Realistic local path |
|---|---|---|---|
| Ornith-1.5-397B | MoE | 8× H200 141GB, tensor parallel 8 | Not happening on your desk |
| Ornith-1.5-35B-A3B | MoE, ~3B active/token | 2× 80GB GPU in bf16 (~70 GB) | GGUF quant, workstation |
| Ornith-1.5-9B | Dense | one 80GB GPU in bf16 (~19 GB) | Q4_K_M, 5.63 GB, any modern laptop |
The 9B card’s own guide — “serves on a single 80GB GPU” — is written for someone renting an H100. The GGUF repo is written for the rest of us. That’s the one you want.
Available quantizations of the 9B, with their actual disk weight:
Q4_K_M— 5.63 GBQ5_K_M— 6.47 GBQ6_K— 7.36 GBQ8_0— 9.53 GBBF16— 17.9 GB
Start with Q4_K_M. If the output disappoints you on your real work, go up a step before concluding the model is bad — jumping to Q5_K_M costs you less than a gigabyte.
Installing it: three paths
The quick one — Ollama
ollama run ornith-1.5:9b
That’s it. Ollama downloads a quantized build and drops you in a chat. If you just want to know whether the model deserves more of your time, spend three minutes here first.
The one that gives you control — llama.cpp
Ollama picks the quant for you. llama.cpp lets you name it:
llama-server -hf ornith-ai/Ornith-1.5-9B-GGUF:Q4_K_M --port 8000
That spins up an OpenAI-compatible endpoint at localhost:8000 that you can point any client at. Change the tag after the colon to switch quantizations — :Q5_K_M, :Q6_K, :Q8_0 — and llama.cpp downloads only what you asked for.
The 9B card also includes the full-context invocation:
llama-server -hf hf.co/ornith-ai/Ornith-1.5-9B-GGUF --port 8000 -c 262144
Don’t start there. That -c 262144 is the model’s declared maximum context, and on a dense 9B the KV cache at a quarter-million tokens is significantly larger than the 5.63 GB of weights you just downloaded — what kills your process is that memory reserve, not the model file. Neither the model card nor the GGUF repo publishes a KV cache figure at any context length, which is exactly the number someone on a laptop needs and exactly the column the table doesn’t have. Measure it yourself instead of guessing: start at -c 8192, watch your RAM, and double until you hit your ceiling. Then keep your working context one step below that.
Apple Silicon — MLX
mlx_lm.chat --model "ornith-ai/Ornith-1.5-9B-MLX"
or as a server:
mlx_lm.server --model "ornith-ai/Ornith-1.5-9B-MLX"
One caveat that matters on a Mac: the 9B-MLX repo weighs 17.9 GB and is bf16 — it’s not a quantized build. If you have 16 GB of unified memory, your path is GGUF via llama.cpp, not this.
Sampling parameters are not optional
Ornith publishes two profiles and the difference between them is big enough that you shouldn’t run with defaults:
- General use:
temperature=1.0, top_p=0.95, top_k=20, min_p=0.0, presence_penalty=1.5, repetition_penalty=1.0 - Precise code:
temperature=0.6, top_p=0.95, top_k=20, min_p=0.0, presence_penalty=0.0, repetition_penalty=1.0
Notice the presence_penalty: 1.5 for chat, 0.0 for code. It’s a bigger jump than most model cards recommend, and running code work with the general profile is the most likely reason your first session goes sideways.
It’s a reasoning model — expect the block <think>
Card text:
“Ornith-1.5-9B is a reasoning model: by default the assistant turn opens with a
<think> … </think>block before the final answer.”
That is: by default the assistant turn opens with a reasoning block before the final answer. The recipes above activate a reasoning parser that returns that chain of thought in a separate field, reasoning_content, instead of leaving it inline. If you’re wiring this to your own client, handle that field — if not, your users read the model thinking out loud before it answers. It also means your token budget per turn is larger than the response length suggests, something worth knowing before you set that context ceiling.
Stretching Beyond 262K
If you really need more than 262,144 tokens, the card gives a YaRN block for configuration:
{
"rope_scaling": {
"rope_type": "yarn",
"factor": 4.0,
"original_max_position_embeddings": 262144
}
}
A factor of 4.0 points to around 1M tokens. Given the reality of the KV cache above, treat this as a server option, not a laptop one.
About the Phone
The announcement says the 9B, “with its quantized Ornith-1.5-9B-Mobile version, can be readily deployed on iPhone and Android devices”, and all three model cards repeat the claim. That repo isn’t published. It’s not in the ornith-15 collection, no card links to it, and a search on Hugging Face returns only 9B, 9B-GGUF, and 9B-MLX. Announced, not published — so the phone stuff is a promise for now, and the 5.63 GB of Q4_K_M on a laptop is what you can actually do today.
Reading the Benchmark Tables Against the Vendor
Three things about the numbers the coverage is flattening.
Terminal-Bench 2.1 has two harness columns, not one. Ornith reports each model under Terminus-2 and under Claude Code, and the scores diverge. The 397B scores 86.1 with Terminus-2 and 85.2 with Claude Code; the 9B scores 46.2 and 47.0 respectively. If you see a comparison citing 86.1 for the large model and 47.0 for the small one, those two numbers come from different harnesses. Under one alone, either is defensible — but don’t mix them.
Ornith beats Opus on Terminal-Bench and loses to DeepSWE against a third model. Terminus-2: Ornith-1.5-397B 86.1, Claude Opus 4.8 85.0. With the Claude Code harness: 85.2 versus 78.9, a wider margin. But on DeepSWE it’s Ornith 56.0, Opus 59.0 — and Kimi K3 takes that column with 67.5, well ahead of both. The 35B scores 22 on DeepSWE. The 9B doesn’t have a DeepSWE column at all.
The 9B doesn’t win its own table. It beats Qwen3.5-9B handily (46.2 versus 21.3 on Terminal-Bench, 70.6 versus 53.2 on SWE-bench Verified) and beats Gemma-4-31B. But Ornith includes Qwen3.6-35B-A3B in that same table, and that model wins both columns — 52.5 and 73.4. Qwen3.6-35B-A3B also activates around 3B parameters per token, so on a machine with enough RAM to sustain it, the comparison someone actually running local faces is a 9B dense model against a 35B MoE with similar compute budget per token, and today Qwen wins. Ornith’s own 35B-A3B is the answer to that — 68.5 and 79, nineteen points above Qwen’s on Terminal-Bench — but it’s a 70 GB model in bf16, which is a different machine.
All figures are self-reported by Ornith, averaged over five independent runs, at temperature 1.0 and top_p 1.0 in a 128K context window, with network access disabled and Git history removed from task environments. The anti-gaming measures are better documented than most vendors’, and the numbers are still theirs.
What Ornith-1.5 Actually Is
The announcement opens with: “Today, we are introducing Ornith-1.5, a major step toward building foundation models through end-to-end self-improvement.” Read the model cards and a clearer picture emerges:
“Ornith-1.5 extends Ornith-1.0 (which was developed on top of Qwen3.5 and Gemma4 with additional continued pretraining, mid-training, and post-training).”
That Ornith-1.5 extends Ornith-1.0, which in turn was built on top of Qwen3.5 and Gemma4. The 397B carries the architecture tag qwen3_5_moe. The serving recipes call --tool-call-parser qwen3_xml and --reasoning-parser qwen3. The card states plainly that “we adjust the Qwen chat template to ensure consistency between training and inference”. On Hacker News the thread reached the same conclusion without being told — colingauvin: “Ornith-1.5-397B is derived from Qwen3.5-397B-A17B via post-training. That process preserves exact parameter count.”
So Ornith-1.5 isn’t a foundation model trained from scratch. It’s open bases from Qwen and Gemma plus a post-training pipeline — and the pipeline is the genuinely new part, so it deserves a plain description instead of a dismissal.
The loop, in Ornith’s words: the model “proposes new tasks, generates task-specific scaffolds, and produces solution rollouts” for reinforcement learning. Task proposal is conditioned — “given an environment or codebase, high-level instructions about the task type, and access to the model’s previous task-solving history, the system proposes progressively harder tasks.” The model writes its own curriculum, builds the harness that grades it, and trains on those rollouts via GRPO. The deltas from 1.0 to 1.5 in Ornith’s own tables are the closest thing to a result: the 9B goes from 43.1 to 46.2 on Terminal-Bench and from 69.4 to 70.6 on SWE-bench Verified; the 35B goes from 64.2 to 68.5 and from 75.6 to 79.
An open question worth flagging, because Ornith doesn’t address it: the cards declare MIT, but Gemma4 ships under Google’s Gemma Terms of Use, which aren’t OSI-approved and carry usage restrictions that MIT doesn’t. Ornith’s cards carry no attribution or mention of upstream terms. For someone installing this on a laptop, irrelevant. For anyone shipping a product on these weights, worth reading both licenses before you commit.
Wiring It to an Agent
The 9B card lists Hermes Agent, OpenClaw, OpenCode, Ollama, and Unsloth Studio as compatible out of the box, and the endpoint exposes OpenAI-standard tool calling with tool_calls already parsed. So if you already have an agent pointing at a hosted API, changing base_url to http://localhost:8000/v1 is most of the migration.
Agentic scores are the honest reason to try it instead of assuming: the 9B marks 54.2 on MCP-Atlas and 41.2 on Toolathlon-Verified. They’re not frontier numbers. But an HN commenter running the 35B-A3B for real work reported it “on par with Qwen3.8 27B at a much higher speed and at a higher quant” — on par with Qwen3.8 27B, noticeably faster and with better quant. That’s the kind of claim worth verifying against your own tasks rather than against a table.
Have you ever swapped a hosted model for a local one in real work — and what broke first, quality or context window? Tell us in the comments, especially if you got Ornith-1.5-9B running at a context that leaves you happy and what -c value you ended up with.