From 6fd7a3ec766278e962f8512694bf1951cf861e37 Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Wed, 8 Apr 2026 17:13:50 -0700 Subject: [PATCH 01/11] [Feature] UI - Teams: Add router settings to team Settings tab Add RouterSettingsAccordion to the team edit form and a read-only display of router settings (routing strategy, retries, fallbacks, cooldown, timeout, tag filtering) in the Settings tab. --- .../src/components/team/TeamInfo.tsx | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/ui/litellm-dashboard/src/components/team/TeamInfo.tsx b/ui/litellm-dashboard/src/components/team/TeamInfo.tsx index 6308be65860..722c5218ce6 100644 --- a/ui/litellm-dashboard/src/components/team/TeamInfo.tsx +++ b/ui/litellm-dashboard/src/components/team/TeamInfo.tsx @@ -41,6 +41,7 @@ import ObjectPermissionsView from "../object_permissions_view"; import NumericalInput from "../shared/numerical_input"; import VectorStoreSelector from "../vector_store_management/VectorStoreSelector"; import EditLoggingSettings from "./EditLoggingSettings"; +import RouterSettingsAccordion, { RouterSettingsAccordionValue } from "../common_components/RouterSettingsAccordion"; import MemberModal from "./EditMembership"; import MemberPermissions from "./member_permissions"; import { @@ -98,6 +99,7 @@ export interface TeamData { access_group_models?: string[]; access_group_mcp_server_ids?: string[]; access_group_agent_ids?: string[]; + router_settings?: Record; guardrails?: string[]; policies?: string[]; object_permission?: { @@ -187,6 +189,7 @@ const TeamInfoView: React.FC = ({ const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isDeleting, setIsDeleting] = useState(false); const [isTeamSaving, setIsTeamSaving] = useState(false); + const [routerSettings, setRouterSettings] = useState(null); const [organization, setOrganization] = useState(null); const { userRole, userId } = useAuthorized(); const { data: userOrganizations = [] } = useOrganizations(); @@ -588,10 +591,21 @@ const TeamInfoView: React.FC = ({ updateData.access_group_ids = values.access_group_ids; } + // Handle router_settings + if (routerSettings?.router_settings) { + const hasValues = Object.values(routerSettings.router_settings).some( + (value) => value !== null && value !== undefined && value !== "", + ); + if (hasValues) { + updateData.router_settings = routerSettings.router_settings; + } + } + const response = await teamUpdateCall(accessToken, updateData); NotificationsManager.success("Team settings updated successfully"); setIsEditing(false); + setRouterSettings(null); fetchTeamInfo(); } catch (error) { console.error("Error updating team:", error); @@ -1086,6 +1100,15 @@ const TeamInfoView: React.FC = ({ + + 0 ? { data: userModels.map((model) => ({ model_name: model })) } : undefined} + /> + + @@ -1373,6 +1396,44 @@ const TeamInfoView: React.FC = ({
TPM Limit: {info.team_member_budget_table?.tpm_limit || "No Limit"}
RPM Limit: {info.team_member_budget_table?.rpm_limit || "No Limit"}
+
+ Router Settings + {info.router_settings && Object.values(info.router_settings).some( + (v) => v !== null && v !== undefined && v !== "" && !(Array.isArray(v) && v.length === 0) + ) ? ( +
+ {info.router_settings.routing_strategy && ( +
+ Routing Strategy:{" "} + {info.router_settings.routing_strategy} +
+ )} + {info.router_settings.num_retries != null && ( +
Number of Retries: {info.router_settings.num_retries}
+ )} + {info.router_settings.allowed_fails != null && ( +
Allowed Failures: {info.router_settings.allowed_fails}
+ )} + {info.router_settings.cooldown_time != null && ( +
Cooldown Time: {info.router_settings.cooldown_time}s
+ )} + {info.router_settings.timeout != null && ( +
Timeout: {info.router_settings.timeout}s
+ )} + {info.router_settings.retry_after != null && ( +
Retry After: {info.router_settings.retry_after}s
+ )} + {info.router_settings.fallbacks && Array.isArray(info.router_settings.fallbacks) && info.router_settings.fallbacks.length > 0 && ( +
Fallbacks: {info.router_settings.fallbacks.length} configured
+ )} + {info.router_settings.enable_tag_filtering && ( +
Tag Filtering: Enabled
+ )} +
+ ) : ( +
No router settings configured
+ )} +
Organization ID
{info.organization_id}
From a449cf801f6b2976cc3e4a9e29cc01a91e41ac60 Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Wed, 8 Apr 2026 17:17:45 -0700 Subject: [PATCH 02/11] fix: reset router settings state on cancel to prevent stale data --- ui/litellm-dashboard/src/components/team/TeamInfo.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/litellm-dashboard/src/components/team/TeamInfo.tsx b/ui/litellm-dashboard/src/components/team/TeamInfo.tsx index 722c5218ce6..1459f323a64 100644 --- a/ui/litellm-dashboard/src/components/team/TeamInfo.tsx +++ b/ui/litellm-dashboard/src/components/team/TeamInfo.tsx @@ -1308,7 +1308,7 @@ const TeamInfoView: React.FC = ({
-