feat(ui): run the Lite preset's medium and complex tiers at their documented efforts

Lite ran Muse Spark 1.2 and Kimi K3 at whatever effort each provider happens to
default to. Set the ones their own docs name: Muse Spark 1.2 at xhigh, and Kimi
K3 at max, which is Kimi's own default and what the model map now declares for
that model.

Stacked on the map change, since without it kimi-k3 resolves to unknown levels
and the tier editor's capability-blind fallback list does not offer max.
This commit is contained in:
Tin Chi Lo 2026-08-27 01:39:04 -07:00
parent 44d84360fb
commit 542649b59a
2 changed files with 22 additions and 1 deletions

View file

@ -36,7 +36,7 @@
},
"lite": {
"label": "Lite",
"description": "Cost-optimized routing across providers: DeepSeek V4 Flash for simple queries, Muse Spark 1.2 for medium, Kimi K3 for complex, Claude Opus 5 for reasoning-heavy requests. An LLM classifier with the agentic rubric assigns tiers.",
"description": "Cost-optimized routing across providers: DeepSeek V4 Flash for simple queries, Muse Spark 1.2 at xhigh for medium, Kimi K3 at max for complex, Claude Opus 5 for reasoning. An LLM classifier with the agentic rubric assigns tiers.",
"complexity_router_config": {
"tiers": {
"SIMPLE": ["deepseek-v4-flash"],
@ -44,6 +44,10 @@
"COMPLEX": ["kimi-k3"],
"REASONING": ["claude-opus-5"]
},
"tier_model_configs": {
"MEDIUM": [{ "model_name": "muse-spark-1.2", "litellm_params": { "reasoning_effort": "xhigh" } }],
"COMPLEX": [{ "model_name": "kimi-k3", "litellm_params": { "reasoning_effort": "max" } }]
},
"classifier_type": "llm",
"classifier_llm_config": {
"model": "deepseek-v4-flash",

View file

@ -109,6 +109,14 @@ describe("autorouter_presets", () => {
});
});
// Kimi K3 at max needs the map to declare max for kimi-k3, which is the commit below this one.
it("pins the lite preset's per-tier reasoning efforts", () => {
expect(getPresetByKey("lite")!.complexity_router_config.tier_model_configs).toEqual({
MEDIUM: [{ model_name: "muse-spark-1.2", litellm_params: { reasoning_effort: "xhigh" } }],
COMPLEX: [{ model_name: "kimi-k3", litellm_params: { reasoning_effort: "max" } }],
});
});
// serializeTierModelConfigs filters on the tier's models, so a stray name drops silently.
it("never names a model in tier_model_configs that its own tier does not hold", () => {
for (const preset of getAllPresets()) {
@ -129,6 +137,15 @@ describe("autorouter_presets", () => {
});
});
it("prefills the lite preset's efforts through to tier_model_params", () => {
const lite = getPresetByKey("lite")!;
const prefill = buildPresetPrefill(lite.complexity_router_config, groupsOnly(getRequiredModelsInPreset(lite)));
expect(prefill.complexityRouterConfig.tier_model_params).toEqual({
MEDIUM: { "muse-spark-1.2": { reasoning_effort: "xhigh" } },
COMPLEX: { "kimi-k3": { reasoning_effort: "max" } },
});
});
it("pins the gemini preset to concrete model ids, never Google's hot-swapping -latest aliases", () => {
const gemini = getPresetByKey("gemini_family")!;
const config = gemini.complexity_router_config;