import { PageAction } from '@/config'; import { PaginationKey, TABLE_SORT_DIRECTIONS } from '@/config/settings'; import useTableFetch from '@/hooks/use-table-fetch'; import { useBenchmarkTargetInstance } from '@/pages/llmodels/hooks/use-run-benchmark'; import { useQueryModelList } from '@/pages/llmodels/services/use-query-model-list'; import { DeleteModal, FilterBar, IconFont, NoResult } from '@gpustack/core-ui'; import { useIntl, useNavigate } from '@umijs/max'; import { useMemoizedFn, useToggle } from 'ahooks'; import { ConfigProvider, Table, message } from 'antd'; import _ from 'lodash'; import { useEffect, useRef, useState } from 'react'; import PageBox from '../_components/page-box'; import { useQueryClusterList } from '../cluster-management/services/use-query-cluster-list'; import { BENCHMARKS_API, createBenchmark, deleteBenchmark, queryBenchmarkList, updateBenchmark } from './apis'; import AddBenchmarkModal from './components/add-benchmark-modal'; import LeftActions from './components/left-actions'; import RightActions from './components/right-actions'; import ViewLogsModal from './components/view-logs-modal'; import { FormData, BenchmarkListItem as ListItem } from './config/types'; import Filters from './filters'; import useBenchmarkColumns from './hooks/use-benchmark-columns'; import useColumnSettings from './hooks/use-column-settings'; import useCreateBenchmark from './hooks/use-create-benchmark'; import useViewLogs from './hooks/use-view-logs'; import { useExportBenchmark } from './services/use-export-benchmark'; import useQueryDataset from './services/use-query-dataset'; import useQueryProfiles from './services/use-query-profiles'; import useStopBenchmark from './services/use-stop-benchmark'; const Benchmark: React.FC = () => { const { dataSource, rowSelection, queryParams, sortOrder, modalRef, handleDelete, handleDeleteBatch, fetchData, handlePageChange, handleTableChange, handleQueryChange, handleSearch, handleNameChange } = useTableFetch({ key: PaginationKey.Benchmarks, fetchAPI: queryBenchmarkList, deleteAPI: deleteBenchmark, API: BENCHMARKS_API, watch: true, contentForDelete: 'menu.models.benchmark' }); const intl = useIntl(); const navigate = useNavigate(); const { openBenchmarkModal, closeBenchmarkModal, openBenchmarkModalStatus } = useCreateBenchmark(); const { dataList: modelList, fetchData: fetchModelList } = useQueryModelList({ getValue: (item: any) => item.name }); const { openViewLogsModal, closeViewLogsModal, openViewLogsModalStatus } = useViewLogs(); const { handleStopBenchmark } = useStopBenchmark(); const { datasetList, fetchDatasetData } = useQueryDataset(); const { exportData } = useExportBenchmark(); const { fetchClusterList, cancelRequest: cancelClusterRequest, clusterList } = useQueryClusterList(); const { benchmarkTargetInstance } = useBenchmarkTargetInstance(); const { profilesOptions, fetchProfilesData, cancelRequest: cancelProfilesRequest } = useQueryProfiles(); const { SettingsButton, columns: selectedColumns } = useColumnSettings({ contentHeight: 320, clusterList, profileOptions: profilesOptions }); const [filtersVisible, { toggle: toggleFilters }] = useToggle(); const filterRef = useRef(null); const [filterValues, setFilterValues] = useState({}); useEffect(() => { fetchModelList({ page: -1 }); fetchDatasetData(); fetchProfilesData(); fetchClusterList({ page: -1 }).then(() => { if (benchmarkTargetInstance.model_name) { openBenchmarkModal( PageAction.CREATE, intl.formatMessage({ id: 'benchmark.button.add' }) ); } }); return () => { cancelClusterRequest(); cancelProfilesRequest(); }; }, []); const handleAddBenchmark = () => { openBenchmarkModal( PageAction.CREATE, intl.formatMessage({ id: 'benchmark.button.add' }) ); }; const handleModalOk = async (data: FormData) => { const params = { ...data }; try { if (openBenchmarkModalStatus.action === PageAction.EDIT) { await updateBenchmark({ data: { ...params }, id: openBenchmarkModalStatus.currentData!.id }); } else { await createBenchmark({ data: params }); } fetchData(); closeBenchmarkModal(); message.success(intl.formatMessage({ id: 'common.message.success' })); } catch (error) { closeBenchmarkModal(); } }; const handleModalCancel = () => { closeBenchmarkModal(); }; const handleEdit = (row: ListItem) => { openBenchmarkModal( PageAction.EDIT, intl.formatMessage({ id: 'benchmark.button.edit' }), row ); }; const handleSelect = useMemoizedFn((val: any, row: ListItem) => { if (val === 'edit') { handleEdit(row); } else if (val === 'delete') { handleDelete({ ...row, name: row.name }); } else if (val === 'viewlog') { openViewLogsModal(row); } else if (val === 'stop') { handleStopBenchmark(row.id); } else if (val === 'export') { exportData([row.id], row.name); } }); const handleOnCellClick = useMemoizedFn( (record: ListItem, dataIndex: string) => { if (dataIndex === 'name') { navigate( `/models/benchmark/detail?id=${record.id}&name=${record.name}`, { state: 'benchmark-details' } ); } } ); const renderEmpty = (type?: string) => { if (type !== 'Table') return; return ( } filters={_.omit(queryParams, ['sort_by'])} noFoundText={intl.formatMessage({ id: 'noresult.benchmark.nofound' })} title={intl.formatMessage({ id: 'noresult.benchmark.title' })} subTitle={intl.formatMessage({ id: 'noresult.benchmark.subTitle' })} onClick={handleAddBenchmark} buttonText={intl.formatMessage({ id: 'noresult.button.add' })} > ); }; const columns = useBenchmarkColumns({ sortOrder, columns: selectedColumns, handleSelect, onCellClick: handleOnCellClick }); const handleExportData = () => { exportData(rowSelection.selectedRowKeys); }; const handleOnFilterChange = (filters: any) => { handleQueryChange({ page: 1, ...filters }); setFilterValues(filters); }; const handleOnClearFilters = () => { filterRef.current?.reset(); }; const filtersCount = Object.values(filterValues).filter( (value) => value !== undefined && value !== null && value !== '' ); return (
} right={ } >
); }; export default Benchmark;