diff --git a/ui/litellm-dashboard/src/components/VirtualKeysPage/VirtualKeysTable.tsx b/ui/litellm-dashboard/src/components/VirtualKeysPage/VirtualKeysTable.tsx index b30d4b6ce5b..e4d9d7b3ac4 100644 --- a/ui/litellm-dashboard/src/components/VirtualKeysPage/VirtualKeysTable.tsx +++ b/ui/litellm-dashboard/src/components/VirtualKeysPage/VirtualKeysTable.tsx @@ -94,11 +94,15 @@ export function VirtualKeysTable({ teams, organizations, onSortChange, currentSo }); const [expandedAccordions, setExpandedAccordions] = useState>({}); - // Use the filter logic hook + // Stabilize the keys array reference so that useFilterLogic's useEffect + // (which depends on `keys`) only fires when the actual data changes, not on + // every render caused by setFilteredKeys → re-render → new [] literal. + const stableKeys = useMemo(() => keys?.keys ?? [], [keys]); + // Use the filter logic hook const { filters, filteredKeys, filteredTotalCount, allTeams, allOrganizations, handleFilterChange, handleFilterReset } = useFilterLogic({ - keys: keys?.keys || [], + keys: stableKeys, teams, organizations, });