test(models): cover kimi search alias for Kimi Coding k3

Assert the picker haystack keeps ordinary ids unchanged, surfaces wire
id k3 for "kimi"/"k3" queries, and accept search_labels in curses mocks.
This commit is contained in:
HexLab98 2026-07-19 16:55:51 +07:00 committed by Teknium
parent c63e0cd3e3
commit 39902f1888
3 changed files with 92 additions and 2 deletions

View File

@ -0,0 +1,28 @@
"""Picker search aliases for brand-less wire model ids."""
from hermes_cli.curses_ui import _filter_indices
from hermes_cli.model_search import model_search_text
def test_model_search_text_keeps_ordinary_ids():
assert model_search_text("kimi-k2.6") == "kimi-k2.6"
assert model_search_text("glm-5.2") == "glm-5.2"
def test_model_search_text_adds_kimi_aliases_for_k3():
assert model_search_text("k3") == "k3 kimi-k3 kimi"
assert model_search_text("K3") == "K3 kimi-k3 kimi"
def test_filter_indices_surfaces_k3_for_kimi_query():
models = ["kimi-k2.6", "kimi-k2.5", "k3", "kimi-for-coding"]
haystacks = [model_search_text(m) for m in models]
ranked = [models[i] for i in _filter_indices(haystacks, "kimi")]
assert "k3" in ranked
def test_filter_indices_still_finds_k3_by_wire_id():
models = ["kimi-k2.6", "k3", "kimi-for-coding"]
haystacks = [model_search_text(m) for m in models]
ranked = [models[i] for i in _filter_indices(haystacks, "k3")]
assert ranked == ["k3"]

View File

@ -14,9 +14,19 @@ def test_prompt_model_selection_uses_curses_radiolist():
seen = {}
def _fake(title, items, *, selected=0, cancel_returns=None, description=None, searchable=False):
def _fake(
title,
items,
*,
selected=0,
cancel_returns=None,
description=None,
searchable=False,
search_labels=None,
):
seen["title"] = title
seen["items"] = items
seen["search_labels"] = search_labels
return 1 # pick second model
with patch("hermes_cli.curses_ui.curses_radiolist", side_effect=_fake), \
@ -30,6 +40,8 @@ def test_prompt_model_selection_uses_curses_radiolist():
plain = [radio_item_plain(item) for item in seen["items"]]
assert plain[:2] == ["model-a", "model-b"]
assert "Skip (keep current)" in plain
assert seen["search_labels"] is not None
assert len(seen["search_labels"]) == len(seen["items"])
def test_prompt_model_selection_esc_cancels():
@ -70,8 +82,18 @@ def test_model_selection_with_pricing_passes_description():
seen = {}
def _fake(title, items, *, selected=0, cancel_returns=None, description=None, searchable=False):
def _fake(
title,
items,
*,
selected=0,
cancel_returns=None,
description=None,
searchable=False,
search_labels=None,
):
seen["description"] = description
seen["search_labels"] = search_labels
return len(items) - 1 # Skip
pricing = {

View File

@ -0,0 +1,40 @@
import { describe, expect, it } from 'vitest'
import { fuzzyRank } from './fuzzy.js'
import { modelSearchText } from './model-search-text.js'
describe('modelSearchText', () => {
it('keeps ordinary model ids unchanged', () => {
expect(modelSearchText('kimi-k2.6')).toBe('kimi-k2.6')
expect(modelSearchText('glm-5.2')).toBe('glm-5.2')
})
it('adds kimi aliases for the bare Kimi Coding k3 wire id', () => {
expect(modelSearchText('k3')).toBe('k3 kimi-k3 kimi')
expect(modelSearchText('K3')).toBe('K3 kimi-k3 kimi')
})
})
describe('model picker search with aliases', () => {
const models = [
'kimi-k2.6',
'kimi-k2.5',
'k3',
'kimi-for-coding',
]
it('surfaces k3 when the user searches kimi', () => {
const ranked = fuzzyRank(models, 'kimi', modelSearchText).map(r => r.item)
expect(ranked).toContain('k3')
})
it('still finds k3 by its wire id', () => {
const ranked = fuzzyRank(models, 'k3', modelSearchText).map(r => r.item)
expect(ranked).toEqual(['k3'])
})
it('does not invent k3 for unrelated queries', () => {
const ranked = fuzzyRank(models, 'glm', modelSearchText).map(r => r.item)
expect(ranked).toEqual([])
})
})