From b1e0e9e84b6710f45d746111b47fd21e04bada06 Mon Sep 17 00:00:00 2001 From: tin-berri Date: Fri, 2 Oct 2026 12:17:55 -0700 Subject: [PATCH] feat(ui): select Laya for OSS classification (#43768) --- .../AutoRouters/autoRouterRows.test.ts | 3 +- .../components/AutoRouters/autoRouterRows.ts | 3 +- .../add_model/AutoRouterAvailability.tsx | 2 +- ...oRouterClassifierTabs.integration.test.tsx | 2 +- .../add_model/AutoRouterClassifierTabs.tsx | 30 ++++- .../add_model/ClassificationMethodConfig.tsx | 4 +- .../add_model/ClassifierTypeRadios.tsx | 4 +- .../add_model/ComplexityRouterConfig.tsx | 2 +- .../JevClassifierConfig.integration.test.tsx | 111 ++++++++++-------- .../add_model/JevClassifierConfig.tsx | 35 ++++-- .../JevConnectionTest.integration.test.tsx | 8 +- .../add_auto_router_tab.integration.test.tsx | 39 +++--- .../add_model/auto_router_connection_test.tsx | 10 +- ...d_auto_router_routing_test_request.test.ts | 14 +-- .../build_auto_router_routing_test_request.ts | 15 ++- .../build_complexity_router_config.test.ts | 22 ++-- .../build_complexity_router_config.ts | 16 ++- .../add_model/jev_classifier_config.ts | 34 +++++- ...d_updated_complexity_router_config.test.ts | 41 ++++--- .../edit_auto_router_modal.tsx | 1 + .../hydrate_complexity_router_config.ts | 12 +- .../LogDetailsDrawer/RoutingDecisionCard.tsx | 2 +- .../src/lib/autorouter_presets.test.ts | 13 +- .../src/lib/autorouter_presets.ts | 7 +- 24 files changed, 280 insertions(+), 150 deletions(-) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AutoRouters/autoRouterRows.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AutoRouters/autoRouterRows.test.ts index 79c4243271e..153b77666a7 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AutoRouters/autoRouterRows.test.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AutoRouters/autoRouterRows.test.ts @@ -85,7 +85,8 @@ describe("autoRouterRows", () => { it.each([ ["llm", "LLM Classifier"], - ["jev", "JEV Classifier"], + ["jev", "OSS Classifier"], + ["oss_classifier", "OSS Classifier"], ])("labels a router using the %s classifier", (classifierType, label) => { const row = toAutoRouterRow( { diff --git a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AutoRouters/autoRouterRows.ts b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AutoRouters/autoRouterRows.ts index 1faf3408c23..3c3366a767d 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AutoRouters/autoRouterRows.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/models-and-endpoints/components/AutoRouters/autoRouterRows.ts @@ -57,7 +57,8 @@ const dedupe = (models: string[]): string[] => Array.from(new Set(models)); const COMPLEXITY_TYPE_LABELS: Record = { llm: "LLM Classifier", - jev: "JEV Classifier", + jev: "OSS Classifier", + oss_classifier: "OSS Classifier", capability: "Capability", llm_v2: "Fuse v2", heuristic_first: "Heuristic first", diff --git a/ui/litellm-dashboard/src/components/add_model/AutoRouterAvailability.tsx b/ui/litellm-dashboard/src/components/add_model/AutoRouterAvailability.tsx index b1233ef03b8..135ebb958db 100644 --- a/ui/litellm-dashboard/src/components/add_model/AutoRouterAvailability.tsx +++ b/ui/litellm-dashboard/src/components/add_model/AutoRouterAvailability.tsx @@ -136,7 +136,7 @@ export const AutoRouterLimits = () => { Routing and customization limits

- Rule-based, Complexity, and Jev are unlimited with built-in settings. Choose or change tier models freely. + Rule-based, Complexity, and OSS are unlimited with built-in settings. Choose or change tier models freely. Customization allowances are shared across this proxy.

diff --git a/ui/litellm-dashboard/src/components/add_model/AutoRouterClassifierTabs.integration.test.tsx b/ui/litellm-dashboard/src/components/add_model/AutoRouterClassifierTabs.integration.test.tsx index f843a472d15..08f329e4ad7 100644 --- a/ui/litellm-dashboard/src/components/add_model/AutoRouterClassifierTabs.integration.test.tsx +++ b/ui/litellm-dashboard/src/components/add_model/AutoRouterClassifierTabs.integration.test.tsx @@ -68,7 +68,7 @@ describe("Auto-router classifier selection", () => { llm: "LLM", heuristic_first: "LLM", hybrid: "LLM", - jev: "Jev", + jev: "OSS Classifier", }[classifier_type]; expect(screen.getByRole("radio", { name: new RegExp(`^${family}$`) })).toBeChecked(); fireEvent.click(screen.getByRole("radio", { name: new RegExp(`^${family}$`) })); diff --git a/ui/litellm-dashboard/src/components/add_model/AutoRouterClassifierTabs.tsx b/ui/litellm-dashboard/src/components/add_model/AutoRouterClassifierTabs.tsx index 92fc8d2a335..3a1e0065530 100644 --- a/ui/litellm-dashboard/src/components/add_model/AutoRouterClassifierTabs.tsx +++ b/ui/litellm-dashboard/src/components/add_model/AutoRouterClassifierTabs.tsx @@ -16,6 +16,7 @@ import { type ClassifierType, type ComplexityRouterConfigValue, } from "./ComplexityRouterConfig"; +import { defaultJevClassifierConfig, normalizeJevClassifierConfig } from "./jev_classifier_config"; import { transitionClassifierType } from "./classifier_type_transition"; import { isForecastClassifier } from "./forecast_classifier_config"; import { @@ -148,6 +149,14 @@ const AutoRouterClassifierTabs: React.FC = ({ val if (next === "llm") changeType("llm"); if (next === "jev") changeType("jev"); }; + const changeProvider = (provider: unknown) => { + if (provider !== "jev" && provider !== "laya") return; + const defaults = defaultJevClassifierConfig(provider); + onChange({ + ...value, + jev_classifier_config: { ...defaults, ...value.jev_classifier_config, provider, model: defaults.model }, + }); + }; const approachLabels: Partial> = { capability: "Capability", llm_v2: "Fuse v2" }; const approachDescription: Partial> = { capability: "Use the efficient model when it is likely to succeed", @@ -164,7 +173,7 @@ const AutoRouterClassifierTabs: React.FC = ({ val {[ { value: "heuristics", label: "Heuristics", description: "Classify locally, with no API call" }, { value: "llm", label: "LLM", description: "Use a judge model to choose a solver" }, - { value: "jev", label: "Jev", description: "Use TypeSafe System One Choice to choose a tier" }, + { value: "jev", label: "OSS Classifier", description: "Use Jev or Laya to choose a tier" }, ].map((option) => (