From 969cde4f0ce224260ab8e07e2f2cb33a75f25e7a Mon Sep 17 00:00:00 2001 From: Moe Khalil Date: Fri, 18 Sep 2026 20:07:07 +0000 Subject: [PATCH] feat(ui): complete JEV auto router configuration and connection probes Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../AutoRouters/autoRouterRows.test.ts | 9 +- .../components/AutoRouters/autoRouterRows.ts | 1 + .../add_model/ClassificationMethodConfig.tsx | 14 ++ .../add_model/ComplexityRouterConfig.tsx | 35 ++-- .../JevClassifierConfig.integration.test.tsx | 158 ++++++++++++++++++ .../add_model/JevClassifierConfig.tsx | 88 ++++++++++ .../JevConnectionTest.integration.test.tsx | 148 ++++++++++++++++ .../add_model/NonReasoningTierToggle.tsx | 2 +- .../components/add_model/TierConfigIntro.tsx | 3 + .../add_model/add_auto_router_tab.tsx | 63 ++++--- .../add_model/auto_router_connection_test.tsx | 72 +++++++- ...d_auto_router_routing_test_request.test.ts | 37 +++- .../build_auto_router_routing_test_request.ts | 33 ++++ .../build_complexity_router_config.test.ts | 94 +++++++++++ .../build_complexity_router_config.ts | 83 +++++---- .../classifier_type_transition.test.ts | 41 ++++- .../add_model/classifier_type_transition.ts | 17 +- .../components/add_model/classifier_types.ts | 15 ++ .../add_model/jev_classifier_config.ts | 28 ++++ .../add_model/nonReasoningTierFields.ts | 2 +- .../src/components/add_model/tier_rows.ts | 2 +- ...d_updated_complexity_router_config.test.ts | 65 ++++++- .../edit_auto_router_modal.tsx | 10 +- .../src/components/model_info_view.tsx | 7 + .../src/components/networking.tsx | 2 +- .../RoutingDecisionCard.test.tsx | 4 +- .../LogDetailsDrawer/RoutingDecisionCard.tsx | 23 ++- .../src/lib/autorouter_presets.test.ts | 26 +++ .../src/lib/autorouter_presets.ts | 9 +- 29 files changed, 978 insertions(+), 113 deletions(-) create mode 100644 ui/litellm-dashboard/src/components/add_model/JevClassifierConfig.integration.test.tsx create mode 100644 ui/litellm-dashboard/src/components/add_model/JevClassifierConfig.tsx create mode 100644 ui/litellm-dashboard/src/components/add_model/JevConnectionTest.integration.test.tsx create mode 100644 ui/litellm-dashboard/src/components/add_model/classifier_types.ts create mode 100644 ui/litellm-dashboard/src/components/add_model/jev_classifier_config.ts 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 23585f6c110..79c4243271e 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 @@ -83,13 +83,16 @@ describe("autoRouterRows", () => { expect(row.targets).toEqual(["gpt-4o-mini", "anthropic-sonnet-4-6"]); }); - it("labels a router using the LLM classifier", () => { + it.each([ + ["llm", "LLM Classifier"], + ["jev", "JEV Classifier"], + ])("labels a router using the %s classifier", (classifierType, label) => { const row = toAutoRouterRow( { ...complexityDeployment, litellm_params: { ...complexityDeployment.litellm_params, - complexity_router_config: { tiers: {}, classifier_type: "llm", adaptive: true }, + complexity_router_config: { tiers: {}, classifier_type: classifierType, adaptive: true }, }, }, 0, @@ -97,7 +100,7 @@ describe("autoRouterRows", () => { null, ); - expect(row.typeLabel).toBe("LLM Classifier"); + expect(row.typeLabel).toBe(label); }); it("treats a deployment carrying complexity_router_config as complexity even off the canonical model string", () => { 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 dffb5811c0d..1faf3408c23 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,6 +57,7 @@ const dedupe = (models: string[]): string[] => Array.from(new Set(models)); const COMPLEXITY_TYPE_LABELS: Record = { llm: "LLM Classifier", + jev: "JEV Classifier", capability: "Capability", llm_v2: "Fuse v2", heuristic_first: "Heuristic first", diff --git a/ui/litellm-dashboard/src/components/add_model/ClassificationMethodConfig.tsx b/ui/litellm-dashboard/src/components/add_model/ClassificationMethodConfig.tsx index 64b08fc9ed1..322515e0ac5 100644 --- a/ui/litellm-dashboard/src/components/add_model/ClassificationMethodConfig.tsx +++ b/ui/litellm-dashboard/src/components/add_model/ClassificationMethodConfig.tsx @@ -1,4 +1,5 @@ import { transitionClassifierType } from "./classifier_type_transition"; +import JevClassifierConfig from "./JevClassifierConfig"; import { Info } from "lucide-react"; import { SimpleTooltip } from "@/components/ui/tooltip"; import { MultiSelect } from "@/components/shared/MultiSelect"; @@ -37,6 +38,7 @@ import { effectiveTierLabel, heuristicScoringRole, usesLlmClassifier, + usesClassifierContext, DEFAULT_HYBRID_BOUNDARY_MARGIN, HEURISTIC_FIRST_MAX_TIER_KEYS, effectiveClassifierType, @@ -208,6 +210,13 @@ const ClassifierTypeRadios: React.FC<{ calls a model to decide the tier (e.g. a small/fast model) +