Merge pull request #24745 from BerriAI/litellm_fix-logs-filtering

Fix logs page showing unfiltered results when filter matches zero rows
This commit is contained in:
ryan-crabbe-berri 2026-03-28 16:24:09 -07:00 • committed by GitHub
commit 77ad1ab530
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 35 additions and 32 deletions

View file

@ -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()

View file

@ -69,13 +69,7 @@ export function useLogFilterLogic({
);
const [filters, setFilters] = useState<LogFilterState>(defaultFilters);
const [backendFilteredLogs, setBackendFilteredLogs] = useState<PaginatedResponse>({
data: [],
total: 0,
page: 1,
page_size: 50,
total_pages: 0,
});
const [backendFilteredLogs, setBackendFilteredLogs] = useState<PaginatedResponse | null>(null);
const lastSearchTimestamp = useRef(0);
const performSearch = useCallback(
async (filters: LogFilterState, page = 1) => {
@ -113,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],
@ -170,7 +174,7 @@ export function useLogFilterLogic({
data: [],
total: 0,
page: 1,
page_size: 50,
page_size: pageSize,
total_pages: 0,
};
}
@ -227,22 +231,23 @@ export function useLogFilterLogic({
// Choose which filtered logs to expose: backend result when active, otherwise client-derived
const filteredLogs: PaginatedResponse = useMemo(() => {
if (hasBackendFilters) {
// Prefer backend result if present; otherwise fall back to latest logs
if (backendFilteredLogs && backendFilteredLogs.data) {
// When backend filters are active, only show backend results.
// If search hasn't completed yet (null), show empty state rather than
// falling back to unfiltered logs — that caused filtered views to
// display mismatched data when the filter matched zero rows.
if (backendFilteredLogs !== null) {
return backendFilteredLogs;
}
return (
logs || {
data: [],
total: 0,
page: 1,
page_size: 50,
total_pages: 0,
}
);
return {
data: [],
total: 0,
page: 1,
page_size: pageSize,
total_pages: 0,
};
}
return clientDerivedFilteredLogs;
}, [hasBackendFilters, backendFilteredLogs, clientDerivedFilteredLogs, logs]);
}, [hasBackendFilters, backendFilteredLogs, clientDerivedFilteredLogs]);
// Fetch all teams and users for potential filter dropdowns (optional, can be adapted)
const { data: allTeams } = useQuery<Team[], Error>({
@ -272,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);
}
@ -284,16 +290,13 @@ export function useLogFilterLogic({
setFilters(defaultFilters);
// Clear backend filtered logs to ensure fresh render
setBackendFilteredLogs({
data: [],
total: 0,
page: 1,
page_size: 50,
total_pages: 0,
});
setBackendFilteredLogs(null);
// Reset selections
debouncedSearch(defaultFilters, 1);
// Cancel any in-flight debounced search
debouncedSearch.cancel();
// Reset to first page so the unfiltered view starts at page 1
setCurrentPage(1);
};
return {