diff --git a/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.test.tsx b/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.test.tsx index 5d55a8b014f..1a8d33df05c 100644 --- a/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.test.tsx +++ b/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.test.tsx @@ -110,6 +110,25 @@ describe("RouterSettingsAccordion", () => { expect(fetchAvailableModels).not.toHaveBeenCalled(); }); + it("ignores a stale team fetch that resolves after teamId changes", async () => { + let resolveFirst: (value: { data: { model_name: string }[] }) => void = () => {}; + const firstResponse = new Promise<{ data: { model_name: string }[] }>((resolve) => { + resolveFirst = resolve; + }); + vi.mocked(modelInfoCall) + .mockReturnValueOnce(firstResponse as ReturnType) + .mockResolvedValueOnce({ data: [{ model_name: "team-b-model" }] }); + + const { rerender } = render(); + rerender(); + await flushPromises(); + + resolveFirst({ data: [{ model_name: "team-a-model" }] }); + await flushPromises(); + + expect(screen.getByTestId("available-models").textContent).toBe("team-b-model"); + }); + it("uses the global model list when no teamId is provided", async () => { vi.mocked(fetchAvailableModels).mockResolvedValueOnce([{ model_group: "shared-gpt" }]); diff --git a/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.tsx b/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.tsx index 81e07592705..4255f06af73 100644 --- a/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.tsx +++ b/ui/litellm-dashboard/src/components/common_components/RouterSettingsAccordion.tsx @@ -181,10 +181,14 @@ const RouterSettingsAccordion = forwardRef { try { if (teamId) { const response = await modelInfoCall(accessToken, "", "", 1, 1000, undefined, undefined, teamId); + if (cancelled) { + return; + } const teamModels: ModelGroup[] = (response?.data ?? []) .map((item: { model_name?: string }) => item.model_name) .filter((name: string | undefined): name is string => Boolean(name)) @@ -193,12 +197,18 @@ const RouterSettingsAccordion = forwardRef { + cancelled = true; + }; }, [accessToken, teamId]); // Helper function to build router_settings from current state