llama.cpp adds support for K2 Horizon dense and MoVA models
Release b11454 brings a new converter, tokenizer and chat template fixes for the K2 Horizon model family.
The facts
- llama.cpp release b11454 adds K2 Horizon dense and MoVA model support via PR #29535, including GGUF conversion, hparam/tensor loading and a dedicated compute graph
- A new unicode pre-tokenizer splitter was added for K2 Horizon after the project found its regex fell through to a broken std::regex fallback
- On Windows, MSVC's std::regex rejects \p{...} syntax, so llama-quantize, llama-imatrix and llama-perplexity previously aborted with regex_error before producing a token for any K2-Horizon GGUF
- Even where the fallback compiled, ZWNJ and ZWJ characters (U+200C/U+200D) were miscategorised as Control and mapped to a fallback byte, breaking K2's letter-run matching for scripts using those joiners
- The release adds chat support for K2 Horizon reasoning and tool calls, enforces response schemas, loads YaRN beta metadata instead of defaults, and tests CUDA/CPU builds plus 0.9B, 4B and MoVA conversation and tool round trips
- The release also adds jinja support for sequence indices in selectattr and rejectattr, and removes an obsolete 'K2 Aurora' alias
llama.cpp's latest pre-release, tagged b11454, adds support for the K2 Horizon dense and MoVA model family. The work came through a pull request, #29535. It brings a dedicated converter, tensor loading code, a compute graph and chat template support into the project.
The bulk of the work went into fixing the tokenizer. K2 Horizon's regex had no arm in the project's custom Unicode splitter. It fell through to a general std::regex fallback, which failed in two separate ways. On Windows, MSVC's std::regex implementation rejects \p{...} syntax outright. So no K2-Horizon GGUF file would load at all: llama-quantize, llama-imatrix and llama-perplexity all aborted with a regex_error before producing a single token. Where the fallback did compile, it was still wrong. It collapsed each codepoint to a single byte representing its Unicode category before matching. The zero-width non-joiner and zero-width joiner characters, U+200C and U+200D, fell into the Control category, which the project's lookup table doesn't cover. Both characters were mapped to the same fallback byte. So K2's literal joiner alternatives could never match, and every such character ended a letter run instead of continuing it.
The fix widens the existing llama3 splitter rule. A letter run now also takes marks, ZWNJ and ZWJ, matching how K2's regex actually differs from llama3's. The project added a regression test confirming the splitter now keeps a joined run intact where it previously broke it apart. The release also adds chat support for K2 Horizon's reasoning and tool-calling format. It enforces response schemas and JSON tool envelopes, and loads YaRN beta metadata instead of defaulting it. The team tested CUDA and CPU builds across the model's 0.9B, 4B and MoVA variants, for both conversation and tool round trips. Tensor-parallel support was disabled after triggering separate bugs, which the release also patches.
Separately, the release adds jinja template support for sequence indices in the selectattr and rejectattr filters. It also drops an obsolete 'K2 Aurora' conversion alias.
Why it matters
Anyone who pulled a K2 Horizon GGUF and tried to quantize or benchmark it on Windows before this release was hitting a silent regex crash, not a model fault. That's worth re-testing now the splitter is fixed. The episode is also a reminder that wiring a new model family into llama.cpp is never just tensors. Tokenizer edge cases around zero-width joiners are where support quietly breaks for scripts that depend on them.</parameter> </invoke>
Primary source
llama.cpp releases — github.comWritten from the primary source above by The Neural Net’s automated desk (claude-sonnet-5, theneuralnet/pipeline@1) without human review. How this works. Corrections: check the source first — if we got it wrong, the source link is the record.