Build1 distinct publisher3 min readUpdated
A 9B MIT-licensed coding model that reportedly matches a 31B rival on SWE-Bench Verified is still unusable as a Claude Code backend, because the runtime never turns its tool-call XML into a file write.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A developer writing on dev.to tried to stand up Ornith-1.0, a June 2026 open-weight coding model, as a local Claude Code backend, and stopped short: the model emitted text shaped exactly like a file-write tool call, Claude Code displayed it, and the file never appeared on disk [1][10]. That failure sits in the runtime, not the weights, and it is the whole story of local agentic coding right now.
The model's pitch is genuinely different. Instead of being trained inside a harness a human already built, Ornith proposes a plan for each task during training, solves the task using that plan, and gets scored on both, so plans and answers improve together [2]. The 9B version is MIT-licensed, runs on a laptop, and is claimed to match or beat Gemma4-31B on SWE-Bench Verified and Terminal-Bench 2.1 [3]. The write-up calls that four times the size; 31 divided by 9 is about 3.4, so treat the multiplier as rounded in the model's favour [4].
None of that survives contact with the plumbing. The stack was Ollama running a model built from a raw Hugging Face GGUF because a registry pull was blocked by Zscaler, a local LiteLLM instance exposing an Anthropic-format /v1/messages front end, and Claude Code pointed at the proxy [5]. Two bugs were afternoon work. Building from a raw GGUF drops the chat-template metadata the registry manifest carries, so Ollama falls back to bare prompt passthrough with no turn boundaries, and the model answers, then keeps answering, on a loop; the fix was a hand-written ChatML template plus repeat_penalty 1.3 [7]. The im_start and im_end pairs are the turn boundaries the raw GGUF was missing, and the tool_call tags in that template are Hermes-style, matching what Ornith actually generates [8]. Then Claude Code failed to recognise the custom model ID and requested extended thinking on every call, which Ollama rejected outright because the Modelfile never declared that capability; MAX_THINKING_TOKENS=0 closed it [9].
The third one is structural. Ornith is Qwen-derived, so it speaks Qwen's Hermes-style XML tool-call format, which vLLM consumes with a single flag, --tool-call-parser qwen3_xml [11]. Ollama can render that template outbound perfectly well and has nothing built in to parse a tool_call block back into an executable call [12]. The schema injection and the parse-back logic have to be hand-written into the Modelfile template [11]. This is not an artefact of the manual GGUF build: the author points to a GitHub issue on ollama/ollama showing the same raw, unparsed XML on the official registry tag, and says other Ornith write-ups list it as the most common complaint about running the model on Ollama [13].
Worth noting what did not go wrong. The author has run Gemma4, Qwen2 and Qwen3 locally before, and says none stuck for reasons of trust rather than inference speed [6]. Ornith adds a second failure mode: not a wrong answer you can catch, but a correct-looking action that never happened.
What to watch: whether Ollama ships a named tool-call parser per family, the way vLLM already does [11]. Until it does, a benchmark score on a 9B model tells you what it could do inside a harness that can execute, and local Ollama is not that harness [12].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
Bug 1: building from a raw GGUF instead of pulling the registry tag drops the chat-template metadata the manifest normally carries, so Ollama falls back to bare prompt passthrough with no turn boundaries; the model answers, keeps going and repeats the same answer on a loop. Fix: a hand-written explicit ChatML template plus PARAMETER repeat_penalty 1.3, neither of which Ollama applies by default when the registry pull is skipped.
The im_start and im_end pairs in the hand-written template are the turn boundaries the raw GGUF was missing, and the tool_call XML tags are Hermes-style, matching what Ornith actually generates.
Root cause: Ornith is Qwen-derived and speaks Qwen's Hermes-style XML tool-call format, which vLLM handles with the single flag --tool-call-parser qwen3_xml; Ollama has no equivalent, so tool-schema injection and the parse-back-into-a-real-call logic must be hand-written into the Modelfile template.
Ollama can render the hand-written template fine but has nothing built in to parse a tool_call block back into a real, executable tool call.
Ornith-1.0 is a June 2026 open-weight coding model; the author could not get it running as a local Claude Code backend.
The setup was: Ollama as runtime with the model built from a raw HF GGUF because the registry pull was blocked by Zscaler on the author's network; LiteLLM as a local proxy with an Anthropic-format /v1/messages front end; Claude Code pointed at the local proxy instead of api.anthropic.com.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One reproducible first-hand build log; headline capability claims unverified
The failure diagnosis is unusually well evidenced for a single source: exact stack, Modelfile template excerpt, parameter values, error strings, env-var fix, and a filesystem check that exposed the phantom tool call. That supports the runtime-gap claims strongly. Against that, the cluster has exactly one publisher, the benchmark parity and training-method claims are relayed second-hand with no artifact, and the corroborating GitHub issue is asserted but not linked, so the wider generalization rests on unchecked references.
One failed hands-on deployment plus unlinked reports of the same wall
Observable adoption in the supplied material is minimal: an open-weight release available via Hugging Face and an Ollama tag, one documented deployment attempt that did not reach usable agentic behaviour, and an author-reported cluster of similar complaints. There are no download counts, production deployments, or organizational usage disclosures, and the one detailed attempt ended in abandonment for the intended use case.
Benchmark-led framing overstates present usability in the mainstream local runtime
The gap is between a capability narrative (9B matching a ~3.4x larger model, MIT-licensed, laptop-runnable) and a demonstrated inability to complete a basic agentic action such as writing a file through Ollama. The article itself is the corrective and does not oversell, so the overstatement sits in the upstream benchmark framing rather than in this publisher's coverage, which is why the gap is moderate rather than extreme. The parameter multiple is also rounded up.
Self-published practitioner log, no disclosed vendor or commercial tie
The observable incentive structure is light: an individual developer publishing on dev.to, writing a negative-result post about a model and runtime they have no stated relationship with, and repeatedly pointing back to their own earlier write-ups (the proxy pattern, a monitoring-agent build). That self-referencing is a mild audience-building incentive, and the framing of a resolved production pattern versus a failed experiment flatters the author's prior work; there is no evidence of vendor sponsorship, affiliate interest, or promotional pressure in either direction.
High confidence in the runtime gap, low confidence in the capability claims
Confidence splits by claim type. The tool-call parsing gap, the template fallback, and the thinking-capability rejection are precisely described first-hand with fixes and error strings, and are the kind of finding a reader can reproduce, so they are credible even from one source. The benchmark parity, the plan-then-solve training design, and the assertion that the failure reproduces on the official registry tag all rest on second-hand or unlinked material, and no second publisher is present to corroborate anything, which holds the aggregate near the middle.
build
Ornith-1.5 moves the RL loop upstream, and the hard job becomes reward design2 distinct publishers
build
A 12MB Go binary bets agent cost control is cache stickiness, not a dashboard1 distinct publisher
science
OX Security says MCP command execution is a design choice, so server owners own the risk1 distinct publisher
build
A 27B Apache-2.0 model in 17GB makes local inference a wiring decision, not a demo1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 18, 2026