diff --git a/ui/litellm-dashboard/src/autorouter_presets.json b/ui/litellm-dashboard/src/autorouter_presets.json index 41107e88b8c..4cbb548a855 100644 --- a/ui/litellm-dashboard/src/autorouter_presets.json +++ b/ui/litellm-dashboard/src/autorouter_presets.json @@ -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", diff --git a/ui/litellm-dashboard/src/lib/autorouter_presets.test.ts b/ui/litellm-dashboard/src/lib/autorouter_presets.test.ts index 02f39c5344c..2de1ac11db2 100644 --- a/ui/litellm-dashboard/src/lib/autorouter_presets.test.ts +++ b/ui/litellm-dashboard/src/lib/autorouter_presets.test.ts @@ -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;