From 1bf8bd2c7d2057de4fdf80236b0b017f7d7097e4 Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Fri, 21 Aug 2026 13:20:37 -0700 Subject: [PATCH] feat(models): 'ox alpha' now finds x-preview-f-free in every model picker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The OpenCode Zen wire slug for the Ox Alpha stealth model is opaque (x-preview-f-free); users searching the picker for 'ox' or 'ox-alpha' found nothing. Adds the search alias across all four synced alias tables (CLI, desktop, web, TUI) plus tests. Wire id is unchanged and still what renders and gets sent to the provider, matching the k3 → kimi-k3 precedent. No canonical-dedup collision with opencode-go's keyed ox-alpha-free slug. --- apps/desktop/src/lib/model-search-text.ts | 5 ++++- hermes_cli/model_search.py | 3 +++ tests/hermes_cli/test_model_search.py | 14 ++++++++++++++ ui-tui/src/lib/model-search-text.test.ts | 13 +++++++++++++ ui-tui/src/lib/model-search-text.ts | 5 ++++- web/src/lib/model-search-text.ts | 3 +++ 6 files changed, 41 insertions(+), 2 deletions(-) diff --git a/apps/desktop/src/lib/model-search-text.ts b/apps/desktop/src/lib/model-search-text.ts index 5cbe59d3ec..2717e7aa3f 100644 --- a/apps/desktop/src/lib/model-search-text.ts +++ b/apps/desktop/src/lib/model-search-text.ts @@ -9,7 +9,10 @@ * web/src/lib/model-search-text.ts, and hermes_cli/model_search.py. */ const MODEL_SEARCH_ALIASES: Record = { - k3: ['kimi-k3', 'kimi'] + k3: ['kimi-k3', 'kimi'], + // OpenCode Zen serves the "Ox Alpha" stealth model under an opaque + // preview slug; let users find it by its public codename. + 'x-preview-f-free': ['ox-alpha', 'ox'] } /** Haystack for fuzzy/substring model search; never changes the wire id. */ diff --git a/hermes_cli/model_search.py b/hermes_cli/model_search.py index 7004324604..23d3bae14b 100644 --- a/hermes_cli/model_search.py +++ b/hermes_cli/model_search.py @@ -13,6 +13,9 @@ from __future__ import annotations # Lowercased wire id → extra tokens appended to the search haystack only. _MODEL_SEARCH_ALIASES: dict[str, tuple[str, ...]] = { "k3": ("kimi-k3", "kimi"), + # OpenCode Zen serves the "Ox Alpha" stealth model under an opaque + # preview slug; let users find it by its public codename. + "x-preview-f-free": ("ox-alpha", "ox"), } # Lowercased wire id → canonical public slug it aliases. Used by picker diff --git a/tests/hermes_cli/test_model_search.py b/tests/hermes_cli/test_model_search.py index c6c5053584..a430608603 100644 --- a/tests/hermes_cli/test_model_search.py +++ b/tests/hermes_cli/test_model_search.py @@ -16,3 +16,17 @@ def test_filter_indices_surfaces_k3_for_kimi_query(): assert "k3" in ranked +def test_model_search_text_adds_ox_alpha_aliases(): + assert model_search_text("x-preview-f-free") == "x-preview-f-free ox-alpha ox" + assert model_search_text("X-Preview-F-Free") == "X-Preview-F-Free ox-alpha ox" + + +def test_filter_indices_surfaces_ox_alpha_preview_slug(): + models = ["x-preview-f-free", "gpt-5.6-sol", "kimi-k3"] + haystacks = [model_search_text(m) for m in models] + for query in ("ox", "ox-alpha"): + ranked = [models[i] for i in _filter_indices(haystacks, query)] + assert "x-preview-f-free" in ranked, query + + + diff --git a/ui-tui/src/lib/model-search-text.test.ts b/ui-tui/src/lib/model-search-text.test.ts index 5ef8e612c0..3440127323 100644 --- a/ui-tui/src/lib/model-search-text.test.ts +++ b/ui-tui/src/lib/model-search-text.test.ts @@ -13,6 +13,11 @@ describe('modelSearchText', () => { expect(modelSearchText('k3')).toBe('k3 kimi-k3 kimi') expect(modelSearchText('K3')).toBe('K3 kimi-k3 kimi') }) + + it('adds ox-alpha aliases for the Ox Alpha preview wire id', () => { + expect(modelSearchText('x-preview-f-free')).toBe('x-preview-f-free ox-alpha ox') + expect(modelSearchText('X-Preview-F-Free')).toBe('X-Preview-F-Free ox-alpha ox') + }) }) describe('model picker search with aliases', () => { @@ -32,4 +37,12 @@ describe('model picker search with aliases', () => { const ranked = fuzzyRank(models, 'glm', modelSearchText).map(r => r.item) expect(ranked).toEqual([]) }) + + it('surfaces the Ox Alpha preview slug when the user searches ox', () => { + const zenModels = ['x-preview-f-free', 'gpt-5.6-sol', 'kimi-k3'] + const ranked = fuzzyRank(zenModels, 'ox', modelSearchText).map(r => r.item) + expect(ranked).toContain('x-preview-f-free') + const rankedFull = fuzzyRank(zenModels, 'ox-alpha', modelSearchText).map(r => r.item) + expect(rankedFull).toContain('x-preview-f-free') + }) }) diff --git a/ui-tui/src/lib/model-search-text.ts b/ui-tui/src/lib/model-search-text.ts index bc7732ad69..487015e4ea 100644 --- a/ui-tui/src/lib/model-search-text.ts +++ b/ui-tui/src/lib/model-search-text.ts @@ -9,7 +9,10 @@ * hermes_cli/model_search.py. */ const MODEL_SEARCH_ALIASES: Record = { - k3: ['kimi-k3', 'kimi'] + k3: ['kimi-k3', 'kimi'], + // OpenCode Zen serves the "Ox Alpha" stealth model under an opaque + // preview slug; let users find it by its public codename. + 'x-preview-f-free': ['ox-alpha', 'ox'] } /** Haystack for fuzzy/substring model search; never changes the wire id. */ diff --git a/web/src/lib/model-search-text.ts b/web/src/lib/model-search-text.ts index 471d80c472..ab64c5c7c0 100644 --- a/web/src/lib/model-search-text.ts +++ b/web/src/lib/model-search-text.ts @@ -10,6 +10,9 @@ */ const MODEL_SEARCH_ALIASES: Record = { k3: ["kimi-k3", "kimi"], + // OpenCode Zen serves the "Ox Alpha" stealth model under an opaque + // preview slug; let users find it by its public codename. + "x-preview-f-free": ["ox-alpha", "ox"], }; /** Haystack for fuzzy/substring model search; never changes the wire id. */