diff --git a/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalogSettings/modelCatalogPerformanceFiltersApi.cy.ts b/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalogSettings/modelCatalogPerformanceFiltersApi.cy.ts index 80dda2c336..f6d0afd2f7 100644 --- a/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalogSettings/modelCatalogPerformanceFiltersApi.cy.ts +++ b/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalogSettings/modelCatalogPerformanceFiltersApi.cy.ts @@ -272,16 +272,23 @@ describe('Model Catalog Performance Filters API Behavior', () => { cy.findByTestId(PERFORMANCE_FILTER_TEST_IDS.hardwareTable).should('exist'); - // Change a filter to ensure something is set + // Change workload type filter changeWorkloadTypeFilter(); - // Click Clear all filters button in the toolbar (PatternFly's native button) + // Apply cold start filter (applies with default max value) + modelCatalog.openColdStartLatencyFilter(); + modelCatalog.applyColdStartLatencyFilter(); + + // Click Reset all defaults button in the toolbar cy.findByRole('button', { name: 'Reset all defaults' }).click(); - // Verify filters are reset to defaults - workload type should NOT show Code Fixing + // Verify workload type is reset - should NOT show Code Fixing cy.findByTestId(PERFORMANCE_FILTER_TEST_IDS.workloadType) .should('be.visible') .and('not.contain.text', 'Code Fixing'); + + // Verify cold start filter is still visible and reset to default + cy.findByTestId(PERFORMANCE_FILTER_TEST_IDS.coldStartLoadTime).should('be.visible'); }); it('should reset latency filter when Reset all filters is clicked', () => { @@ -321,25 +328,6 @@ describe('Model Catalog Performance Filters API Behavior', () => { }); }); - it('should NOT include cold_start_time_to_load_seconds after toggle is turned OFF', () => { - visitWithPerformanceToggle(true); - - modelCatalog.openColdStartLatencyFilter(); - modelCatalog.applyColdStartLatencyFilter(); - - modelCatalog.togglePerformanceView(); - modelCatalog.findLoadingState().should('not.exist'); - - cy.intercept('GET', '**/model_catalog/models*').as('getModelsWithoutColdStart'); - - triggerFilterRefresh(); - - cy.wait('@getModelsWithoutColdStart').then((interception) => { - const decodedUrl = decodeURIComponent(interception.request.url); - expect(decodedUrl).to.not.include('cold_start_time_to_load_seconds'); - }); - }); - it('should pass cold_start_time_to_load_seconds as orderBy when cold start sort is selected', () => { visitWithPerformanceToggle(true); diff --git a/clients/ui/frontend/src/app/context/modelCatalog/ModelCatalogContext.tsx b/clients/ui/frontend/src/app/context/modelCatalog/ModelCatalogContext.tsx index 9479badd70..a1d66a5b67 100644 --- a/clients/ui/frontend/src/app/context/modelCatalog/ModelCatalogContext.tsx +++ b/clients/ui/frontend/src/app/context/modelCatalog/ModelCatalogContext.tsx @@ -134,6 +134,8 @@ function useModelCatalogSetup(providerState: CatalogProviderState) { baseSetFilterData(latencyKey, undefined); }); baseSetFilterData(ModelCatalogStringFilterKey.HARDWARE_CONFIGURATION, []); + baseSetFilterData(ModelCatalogNumberFilterKey.MAX_RPS, undefined); + baseSetFilterData(ModelCatalogNumberFilterKey.COLD_START_LOAD_TIME, undefined); baseSetFilterData(ModelCatalogNumberFilterKey.MIN_VRAM, undefined); baseSetFilterData(ModelCatalogNumberFilterKey.IMAGE_SIZE, undefined); diff --git a/clients/ui/frontend/src/app/pages/modelCatalog/components/ModelCatalogFilters.tsx b/clients/ui/frontend/src/app/pages/modelCatalog/components/ModelCatalogFilters.tsx index d833245875..2566332a97 100644 --- a/clients/ui/frontend/src/app/pages/modelCatalog/components/ModelCatalogFilters.tsx +++ b/clients/ui/frontend/src/app/pages/modelCatalog/components/ModelCatalogFilters.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { Content, ContentVariants, Flex } from '@patternfly/react-core'; +import { Content, ContentVariants, Divider, Flex } from '@patternfly/react-core'; import { ModelCatalogContext } from '~/app/context/modelCatalog/ModelCatalogContext'; import { ModelCatalogNumberFilterKey, @@ -124,6 +124,7 @@ const ModelCatalogFilters: React.FC = () => { fallbackMin={4} fallbackMax={480} /> + = ({ if (option && option.range) { const { min, max } = option.range; if (min != null && max != null) { - return { min, max }; + return { min: Math.floor(min), max: Math.ceil(max) }; } } return { min: fallbackMin, max: fallbackMax }; @@ -116,6 +116,7 @@ const SidebarSliderFilter: React.FC = ({ suffix={suffix} ariaLabel={`${label} filter value`} showBoundaries + shouldRound /> diff --git a/clients/ui/frontend/src/app/pages/modelCatalog/components/globalFilters/SliderWithInput.tsx b/clients/ui/frontend/src/app/pages/modelCatalog/components/globalFilters/SliderWithInput.tsx index 576d4d4def..3900990a7d 100644 --- a/clients/ui/frontend/src/app/pages/modelCatalog/components/globalFilters/SliderWithInput.tsx +++ b/clients/ui/frontend/src/app/pages/modelCatalog/components/globalFilters/SliderWithInput.tsx @@ -27,7 +27,7 @@ const SliderWithInput: React.FC = ({ hasTooltipOverThumb = false, }) => { const roundValue = React.useCallback( - (val: number) => (shouldRound ? Math.ceil(val * 100) / 100 : val), + (val: number) => (shouldRound ? Math.round(val) : val), [shouldRound], ); diff --git a/clients/ui/frontend/src/app/pages/modelCatalog/utils/performanceFilterUtils.ts b/clients/ui/frontend/src/app/pages/modelCatalog/utils/performanceFilterUtils.ts index fac9295582..aaf3c31042 100644 --- a/clients/ui/frontend/src/app/pages/modelCatalog/utils/performanceFilterUtils.ts +++ b/clients/ui/frontend/src/app/pages/modelCatalog/utils/performanceFilterUtils.ts @@ -199,8 +199,12 @@ export const getDefaultFiltersFromNamedQuery = ( if (resolvedValue !== undefined) { if (fieldName === ModelCatalogNumberFilterKey.MAX_RPS) { result[ModelCatalogNumberFilterKey.MAX_RPS] = resolvedValue; - } else { + } else if (fieldName === ModelCatalogNumberFilterKey.COLD_START_LOAD_TIME) { result[ModelCatalogNumberFilterKey.COLD_START_LOAD_TIME] = resolvedValue; + } else if (fieldName === ModelCatalogNumberFilterKey.MIN_VRAM) { + result[ModelCatalogNumberFilterKey.MIN_VRAM] = resolvedValue; + } else { + result[ModelCatalogNumberFilterKey.IMAGE_SIZE] = resolvedValue; } } return; diff --git a/clients/ui/frontend/src/concepts/modelCatalog/const.ts b/clients/ui/frontend/src/concepts/modelCatalog/const.ts index 57f130fcf9..415cd6b445 100644 --- a/clients/ui/frontend/src/concepts/modelCatalog/const.ts +++ b/clients/ui/frontend/src/concepts/modelCatalog/const.ts @@ -488,8 +488,9 @@ export const MATCH_ALL_FILTER_KEYS: ModelCatalogStringFilterKey[] = [ export const DEPLOYMENT_RESOURCE_PREFIXES = ['vllm']; /** - * Performance filter keys that are shown when performance view is enabled. + * Performance filter keys that are shown as chips in the performance toolbar. * These filters should reset to default values (from namedQueries) instead of clearing. + * Note: MIN_VRAM and IMAGE_SIZE are sidebar-only filters (not shown as chips on the details page). * Note: HARDWARE_CONFIGURATION is NOT included here because it should clear normally * like basic filters, not reset to defaults. */ @@ -497,8 +498,6 @@ export const PERFORMANCE_FILTER_KEYS: ModelCatalogFilterKey[] = [ ModelCatalogStringFilterKey.USE_CASE, ModelCatalogNumberFilterKey.MAX_RPS, ModelCatalogNumberFilterKey.COLD_START_LOAD_TIME, - ModelCatalogNumberFilterKey.MIN_VRAM, - ModelCatalogNumberFilterKey.IMAGE_SIZE, ...ALL_LATENCY_FILTER_KEYS, ]; @@ -573,10 +572,13 @@ export const getAllFiltersToShow = ( const activeLatencyKeys = ALL_LATENCY_FILTER_KEYS.filter((key) => filterData[key] !== undefined); // Use Set to deduplicate since PERFORMANCE_FILTER_KEYS already includes latency fields // Include HARDWARE_CONFIGURATION which shows in performance toolbar but clears normally + // Include MIN_VRAM and IMAGE_SIZE which are sidebar-only filters shown on the landing page return [ ...new Set([ ...BASIC_FILTER_KEYS, ...PERFORMANCE_FILTER_KEYS, + ModelCatalogNumberFilterKey.MIN_VRAM, + ModelCatalogNumberFilterKey.IMAGE_SIZE, ModelCatalogStringFilterKey.HARDWARE_CONFIGURATION, ...activeLatencyKeys, ]),