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. */