From fbddab6178e690c0757d44bc68ac46fe7fa1f721 Mon Sep 17 00:00:00 2001 From: Ryan Crabbe Date: Sat, 28 Mar 2026 13:59:17 -0700 Subject: [PATCH] Handle search error state and cancel wasted API call on filter reset - Set backendFilteredLogs to empty response on performSearch error so the UI shows "0 results" instead of appearing stuck in a loading state - Cancel debounced search on filter reset instead of firing a request whose result would be ignored (hasBackendFilters is false after reset) - Clear backendFilteredLogs immediately on filter change to prevent stale results from previous filter showing during debounce window - Normalize response.data with nullish coalescing to handle missing data - Use `not team_object.models` for None-safe emptiness check --- litellm/proxy/proxy_server.py | 2 +- .../components/view_logs/log_filter_logic.tsx | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 853ceb63c9d..59a234d09c8 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -9215,7 +9215,7 @@ def _add_team_models_to_all_models( for team_object in team_db_objects_typed: if ( - len(team_object.models) == 0 # empty list = all model access + not team_object.models # None or empty list = all model access or SpecialModelNames.all_proxy_models.value in team_object.models ): model_list = llm_router.get_model_list() diff --git a/ui/litellm-dashboard/src/components/view_logs/log_filter_logic.tsx b/ui/litellm-dashboard/src/components/view_logs/log_filter_logic.tsx index a4dd05b46e7..9acff32d63c 100644 --- a/ui/litellm-dashboard/src/components/view_logs/log_filter_logic.tsx +++ b/ui/litellm-dashboard/src/components/view_logs/log_filter_logic.tsx @@ -107,11 +107,21 @@ export function useLogFilterLogic({ }, }); - if (currentTimestamp === lastSearchTimestamp.current && response.data) { - setBackendFilteredLogs(response); + if (currentTimestamp === lastSearchTimestamp.current) { + setBackendFilteredLogs({ + ...response, + data: response.data ?? [], + }); } } catch (error) { console.error("Error searching users:", error); + setBackendFilteredLogs({ + data: [], + total: 0, + page: 1, + page_size: pageSize, + total_pages: 0, + }); } }, [accessToken, startTime, endTime, isCustomDate, pageSize, sortBy, sortOrder], @@ -267,6 +277,7 @@ export function useLogFilterLogic({ // Only call debouncedSearch if filters have actually changed if (JSON.stringify(updatedFilters) !== JSON.stringify(prev)) { setCurrentPage(1); + setBackendFilteredLogs(null); debouncedSearch(updatedFilters, 1); } @@ -281,8 +292,8 @@ export function useLogFilterLogic({ // Clear backend filtered logs to ensure fresh render setBackendFilteredLogs(null); - // Reset selections - debouncedSearch(defaultFilters, 1); + // Cancel any in-flight debounced search + debouncedSearch.cancel(); }; return {