fix: dashboard usage display datas for last 30 days
This commit is contained in:
@@ -25,6 +25,10 @@
|
|||||||
font-weight: var(--font-weight-bold);
|
font-weight: var(--font-weight-bold);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
h1,
|
h1,
|
||||||
h2,
|
h2,
|
||||||
h3,
|
h3,
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import _ from 'lodash';
|
|
||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
|
|
||||||
const baseColorMap = {
|
const baseColorMap = {
|
||||||
@@ -29,36 +28,15 @@ interface TopUserData {
|
|||||||
topUserList: string[];
|
topUserList: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
const getAdjustedDateRange = (startDate: number, endDate: number): string[] => {
|
const getLast30Days = () => {
|
||||||
const start = dayjs(startDate);
|
const dates: string[] = [];
|
||||||
const end = dayjs(endDate);
|
|
||||||
const diff = end.diff(start, 'day') + 1;
|
|
||||||
|
|
||||||
const targetRange = 30;
|
for (let i = 29; i >= 0; i--) {
|
||||||
const diffDays = targetRange - diff;
|
const date = dayjs().subtract(i, 'day').format('YYYY-MM-DD');
|
||||||
|
dates.push(date);
|
||||||
let preDays = Math.ceil(diffDays / 2);
|
|
||||||
let postDays = Math.floor(diffDays / 2);
|
|
||||||
|
|
||||||
// if the difference is more than 30 days, adjust the start and end dates
|
|
||||||
if (diff >= targetRange) {
|
|
||||||
return Array.from({ length: targetRange }, (_, i) =>
|
|
||||||
end.subtract(i, 'day').format('YYYY-MM-DD')
|
|
||||||
).reverse();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const adjustedStart = start.subtract(preDays, 'day');
|
return dates;
|
||||||
const adjustedEnd = end.add(postDays, 'day');
|
|
||||||
|
|
||||||
const totalDays = adjustedEnd.diff(adjustedStart, 'day') + 1;
|
|
||||||
|
|
||||||
const dateRange: string[] = [];
|
|
||||||
|
|
||||||
for (let i = 0; i < totalDays; i++) {
|
|
||||||
dateRange.push(adjustedStart.add(i, 'day').format('YYYY-MM-DD'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return dateRange;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const generateValueMap = (list: { timestamp: number; value: number }[]) => {
|
const generateValueMap = (list: { timestamp: number; value: number }[]) => {
|
||||||
@@ -85,14 +63,7 @@ export default function useUseageData(data: any) {
|
|||||||
requestTokenData: RequestTokenData;
|
requestTokenData: RequestTokenData;
|
||||||
topUserData: TopUserData;
|
topUserData: TopUserData;
|
||||||
}>(() => {
|
}>(() => {
|
||||||
const startDate = _.get(data?.api_request_history, '0.timestamp', 0);
|
const dateRange = getLast30Days();
|
||||||
const endDate = _.get(
|
|
||||||
data?.api_request_history || [],
|
|
||||||
data?.api_request_history?.length - 1,
|
|
||||||
0
|
|
||||||
).timestamp;
|
|
||||||
|
|
||||||
const dateRange = getAdjustedDateRange(startDate * 1000, endDate * 1000);
|
|
||||||
|
|
||||||
const completionTokenHistory = data.completion_token_history || [];
|
const completionTokenHistory = data.completion_token_history || [];
|
||||||
const promptTokenHistory = data.prompt_token_history || [];
|
const promptTokenHistory = data.prompt_token_history || [];
|
||||||
|
|||||||
@@ -97,6 +97,8 @@ const AddModal: FC<AddModalProps> = (props) => {
|
|||||||
const [selectedModel, setSelectedModel] = useState<any>({});
|
const [selectedModel, setSelectedModel] = useState<any>({});
|
||||||
const [collapsed, setCollapsed] = useState<boolean>(false);
|
const [collapsed, setCollapsed] = useState<boolean>(false);
|
||||||
const [isGGUF, setIsGGUF] = useState<boolean>(false);
|
const [isGGUF, setIsGGUF] = useState<boolean>(false);
|
||||||
|
const [isEvaluatModel, setIsEvaluatModel] = useState<boolean>(false);
|
||||||
|
const [isEvaluatModelFile, setIsEvaluatModelFile] = useState<boolean>(false);
|
||||||
const modelFileRef = useRef<any>(null);
|
const modelFileRef = useRef<any>(null);
|
||||||
|
|
||||||
const getDefaultSpec = (item: any) => {
|
const getDefaultSpec = (item: any) => {
|
||||||
@@ -114,7 +116,7 @@ const AddModal: FC<AddModalProps> = (props) => {
|
|||||||
}
|
}
|
||||||
return categories || null;
|
return categories || null;
|
||||||
};
|
};
|
||||||
const handleSelectModelFile = (item: any) => {
|
const handleSelectModelFile = (item: any, evaluate?: boolean) => {
|
||||||
form.current?.form?.resetFields(resetFields);
|
form.current?.form?.resetFields(resetFields);
|
||||||
const modelInfo = onSelectModel(selectedModel, props.source);
|
const modelInfo = onSelectModel(selectedModel, props.source);
|
||||||
form.current?.setFieldsValue?.({
|
form.current?.setFieldsValue?.({
|
||||||
@@ -129,7 +131,7 @@ const AddModal: FC<AddModalProps> = (props) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleOnSelectModel = (item: any) => {
|
const handleOnSelectModel = (item: any, evaluate?: boolean) => {
|
||||||
setSelectedModel(item);
|
setSelectedModel(item);
|
||||||
if (!item.isGGUF) {
|
if (!item.isGGUF) {
|
||||||
setIsGGUF(false);
|
setIsGGUF(false);
|
||||||
@@ -209,7 +211,6 @@ const AddModal: FC<AddModalProps> = (props) => {
|
|||||||
}, [onCancel]);
|
}, [onCancel]);
|
||||||
|
|
||||||
const handleOnOpen = () => {
|
const handleOnOpen = () => {
|
||||||
console.log('handleOnOpen----------', props.source, props.deploymentType);
|
|
||||||
if (props.deploymentType === 'modelFiles') {
|
if (props.deploymentType === 'modelFiles') {
|
||||||
form.current?.form?.setFieldsValue({
|
form.current?.form?.setFieldsValue({
|
||||||
...props.initialValues
|
...props.initialValues
|
||||||
@@ -233,6 +234,27 @@ const AddModal: FC<AddModalProps> = (props) => {
|
|||||||
return warningStatus.show && warningStatus.type !== 'success';
|
return warningStatus.show && warningStatus.type !== 'success';
|
||||||
}, [warningStatus.show, warningStatus.type]);
|
}, [warningStatus.show, warningStatus.type]);
|
||||||
|
|
||||||
|
const displayEvaluateStatus = () => {
|
||||||
|
console.log('displayEvaluateStatus===');
|
||||||
|
setWarningStatus({
|
||||||
|
show: true,
|
||||||
|
title: '',
|
||||||
|
type: 'transition',
|
||||||
|
message: intl.formatMessage({ id: 'models.form.evaluating' })
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (isEvaluatModel || isEvaluatModelFile) {
|
||||||
|
setWarningStatus({
|
||||||
|
show: true,
|
||||||
|
title: '',
|
||||||
|
type: 'transition',
|
||||||
|
message: intl.formatMessage({ id: 'models.form.evaluating' })
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [isEvaluatModel, isEvaluatModelFile]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (open) {
|
if (open) {
|
||||||
handleOnOpen();
|
handleOnOpen();
|
||||||
@@ -289,6 +311,7 @@ const AddModal: FC<AddModalProps> = (props) => {
|
|||||||
hasLinuxWorker={hasLinuxWorker}
|
hasLinuxWorker={hasLinuxWorker}
|
||||||
modelSource={props.source}
|
modelSource={props.source}
|
||||||
onSelectModel={handleOnSelectModel}
|
onSelectModel={handleOnSelectModel}
|
||||||
|
displayEvaluateStatus={displayEvaluateStatus}
|
||||||
></SearchModel>
|
></SearchModel>
|
||||||
</ColumnWrapper>
|
</ColumnWrapper>
|
||||||
<Separator></Separator>
|
<Separator></Separator>
|
||||||
@@ -309,6 +332,7 @@ const AddModal: FC<AddModalProps> = (props) => {
|
|||||||
modelSource={props.source}
|
modelSource={props.source}
|
||||||
onSelectFile={handleSelectModelFile}
|
onSelectFile={handleSelectModelFile}
|
||||||
collapsed={collapsed}
|
collapsed={collapsed}
|
||||||
|
displayEvaluateStatus={displayEvaluateStatus}
|
||||||
></HFModelFile>
|
></HFModelFile>
|
||||||
)}
|
)}
|
||||||
</ColumnWrapper>
|
</ColumnWrapper>
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ interface HFModelFileProps {
|
|||||||
loadingModel?: boolean;
|
loadingModel?: boolean;
|
||||||
modelSource: string;
|
modelSource: string;
|
||||||
ref: any;
|
ref: any;
|
||||||
onSelectFile?: (file: any) => void;
|
onSelectFile?: (file: any, evaluate?: boolean) => void;
|
||||||
|
displayEvaluateStatus?: (show?: boolean) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const pattern = /^(.*)-(\d+)-of-(\d+)\.(.*)$/;
|
const pattern = /^(.*)-(\d+)-of-(\d+)\.(.*)$/;
|
||||||
@@ -49,7 +50,7 @@ const includeReg = /\.(safetensors|gguf)$/i;
|
|||||||
const filterRegGGUF = /\.(gguf)$/i;
|
const filterRegGGUF = /\.(gguf)$/i;
|
||||||
|
|
||||||
const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => {
|
const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => {
|
||||||
const { collapsed, modelSource, isDownload } = props;
|
const { collapsed, modelSource, isDownload, displayEvaluateStatus } = props;
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const [isEvaluating, setIsEvaluating] = useState(false);
|
const [isEvaluating, setIsEvaluating] = useState(false);
|
||||||
const [dataSource, setDataSource] = useState<any>({
|
const [dataSource, setDataSource] = useState<any>({
|
||||||
@@ -73,8 +74,8 @@ const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => {
|
|||||||
const checkTokenRef = useRef<any>(null);
|
const checkTokenRef = useRef<any>(null);
|
||||||
const timer = useRef<any>(null);
|
const timer = useRef<any>(null);
|
||||||
|
|
||||||
const handleSelectModelFile = (item: any) => {
|
const handleSelectModelFile = (item: any, evaluate?: boolean) => {
|
||||||
props.onSelectFile?.(item);
|
props.onSelectFile?.(item, evaluate);
|
||||||
setCurrent(item.path);
|
setCurrent(item.path);
|
||||||
currentPathRef.current = item.path;
|
currentPathRef.current = item.path;
|
||||||
};
|
};
|
||||||
@@ -243,7 +244,7 @@ const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
setIsEvaluating(true);
|
setIsEvaluating(true);
|
||||||
|
displayEvaluateStatus?.(true);
|
||||||
const evaluationList = await getEvaluateResults(evaluateFileList);
|
const evaluationList = await getEvaluateResults(evaluateFileList);
|
||||||
|
|
||||||
const resultList = _.map(list, (item: any, index: number) => {
|
const resultList = _.map(list, (item: any, index: number) => {
|
||||||
@@ -257,7 +258,7 @@ const HFModelFile: React.FC<HFModelFileProps> = forwardRef((props, ref) => {
|
|||||||
(item: any) => item.path === currentPathRef.current
|
(item: any) => item.path === currentPathRef.current
|
||||||
);
|
);
|
||||||
if (currentItem) {
|
if (currentItem) {
|
||||||
handleSelectModelFile(currentItem);
|
handleSelectModelFile(currentItem, true);
|
||||||
}
|
}
|
||||||
setDataSource({ fileList: resultList, loading: false });
|
setDataSource({ fileList: resultList, loading: false });
|
||||||
setIsEvaluating(false);
|
setIsEvaluating(false);
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ interface SearchInputProps {
|
|||||||
isDownload?: boolean;
|
isDownload?: boolean;
|
||||||
setLoadingModel?: (flag: boolean) => void;
|
setLoadingModel?: (flag: boolean) => void;
|
||||||
onSourceChange?: (source: string) => void;
|
onSourceChange?: (source: string) => void;
|
||||||
onSelectModel: (model: any) => void;
|
onSelectModel: (model: any, evaluate?: boolean) => void;
|
||||||
|
displayEvaluateStatus?: (show?: boolean) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SearchModel: React.FC<SearchInputProps> = (props) => {
|
const SearchModel: React.FC<SearchInputProps> = (props) => {
|
||||||
@@ -51,7 +52,8 @@ const SearchModel: React.FC<SearchInputProps> = (props) => {
|
|||||||
isDownload,
|
isDownload,
|
||||||
hasLinuxWorker,
|
hasLinuxWorker,
|
||||||
setLoadingModel,
|
setLoadingModel,
|
||||||
onSelectModel
|
onSelectModel,
|
||||||
|
displayEvaluateStatus
|
||||||
} = props;
|
} = props;
|
||||||
const [dataSource, setDataSource] = useState<{
|
const [dataSource, setDataSource] = useState<{
|
||||||
repoOptions: any[];
|
repoOptions: any[];
|
||||||
@@ -108,8 +110,8 @@ const SearchModel: React.FC<SearchInputProps> = (props) => {
|
|||||||
return isGGUF || isGGUFFromMs;
|
return isGGUF || isGGUFFromMs;
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleOnSelectModel = (item: any) => {
|
const handleOnSelectModel = (item: any, evaluate?: boolean) => {
|
||||||
onSelectModel(item);
|
onSelectModel(item, evaluate);
|
||||||
setCurrent(item.id);
|
setCurrent(item.id);
|
||||||
currentRef.current = item.id;
|
currentRef.current = item.id;
|
||||||
};
|
};
|
||||||
@@ -232,6 +234,7 @@ const SearchModel: React.FC<SearchInputProps> = (props) => {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
setIsEvaluating(true);
|
setIsEvaluating(true);
|
||||||
|
displayEvaluateStatus?.(true);
|
||||||
const evaluations = await getEvaluateResults(repoList);
|
const evaluations = await getEvaluateResults(repoList);
|
||||||
const resultList = list.map((item, index) => {
|
const resultList = list.map((item, index) => {
|
||||||
return {
|
return {
|
||||||
@@ -251,7 +254,7 @@ const SearchModel: React.FC<SearchInputProps> = (props) => {
|
|||||||
(item) => item.id === currentRef.current
|
(item) => item.id === currentRef.current
|
||||||
);
|
);
|
||||||
if (currentItem) {
|
if (currentItem) {
|
||||||
handleOnSelectModel(currentItem);
|
handleOnSelectModel(currentItem, true);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
setIsEvaluating(false);
|
setIsEvaluating(false);
|
||||||
|
|||||||
Reference in New Issue
Block a user