chore: add model api
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
import AutoTooltip from '@/components/auto-tooltip';
|
||||
import CopyButton from '@/components/copy-button';
|
||||
import DeleteModal from '@/components/delete-modal';
|
||||
import DropDownActions from '@/components/drop-down-actions';
|
||||
import DropdownButtons from '@/components/drop-down-buttons';
|
||||
import PageTools from '@/components/page-tools';
|
||||
import StatusTag from '@/components/status-tag';
|
||||
import useAppUtils from '@/hooks/use-app-utils';
|
||||
import useTableFetch from '@/hooks/use-table-fetch';
|
||||
import { modelSourceMap } from '@/pages/llmodels/config';
|
||||
import {
|
||||
@@ -13,14 +15,66 @@ import {
|
||||
onLineSourceOptions
|
||||
} from '@/pages/llmodels/config/button-actions';
|
||||
import DownloadModal from '@/pages/llmodels/download';
|
||||
import { convertFileSize } from '@/utils';
|
||||
import { DeleteOutlined, DownOutlined, SyncOutlined } from '@ant-design/icons';
|
||||
import { useIntl } from '@umijs/max';
|
||||
import { Button, ConfigProvider, Empty, Input, Space, Table } from 'antd';
|
||||
import dayjs from 'dayjs';
|
||||
import { useState } from 'react';
|
||||
import { deleteWorker, queryWorkersList } from '../apis';
|
||||
import { WorkerStatusMapValue, status } from '../config';
|
||||
import { ModelFile as ListItem } from '../config/types';
|
||||
import { useEffect, useState } from 'react';
|
||||
import {
|
||||
MODEL_FILES_API,
|
||||
deleteModelFile,
|
||||
downloadModelFile,
|
||||
queryModelFilesList,
|
||||
queryWorkersList,
|
||||
retryDownloadModelFile
|
||||
} from '../apis';
|
||||
import {
|
||||
ModelfileState,
|
||||
ModelfileStateMap,
|
||||
ModelfileStateMapValue,
|
||||
WorkerStatusMap
|
||||
} from '../config';
|
||||
import {
|
||||
ModelFile as ListItem,
|
||||
ListItem as WorkerListItem
|
||||
} from '../config/types';
|
||||
|
||||
const getWorkerName = (
|
||||
id: number,
|
||||
workersList: Global.BaseOption<number>[]
|
||||
) => {
|
||||
const worker = workersList.find((item) => item.value === id);
|
||||
return worker?.label || '';
|
||||
};
|
||||
const InstanceStatusTag = (props: { data: ListItem }) => {
|
||||
const { data } = props;
|
||||
if (!data.state) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<StatusTag
|
||||
download={
|
||||
data.state === ModelfileStateMap.Downloading
|
||||
? { percent: data.download_progress }
|
||||
: undefined
|
||||
}
|
||||
statusValue={{
|
||||
status:
|
||||
data.state === ModelfileStateMap.Downloading &&
|
||||
data.download_progress === 100
|
||||
? ModelfileState[ModelfileStateMap.Ready]
|
||||
: ModelfileState[data.state],
|
||||
text: ModelfileStateMapValue[data.state],
|
||||
message:
|
||||
data.state === ModelfileStateMap.Downloading &&
|
||||
data.download_progress === 100
|
||||
? ''
|
||||
: data.state_message
|
||||
}}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const ModelFiles = () => {
|
||||
const {
|
||||
@@ -35,12 +89,18 @@ const ModelFiles = () => {
|
||||
handleSearch,
|
||||
handleNameChange
|
||||
} = useTableFetch<ListItem>({
|
||||
fetchAPI: queryWorkersList,
|
||||
deleteAPI: deleteWorker,
|
||||
contentForDelete: 'worker'
|
||||
fetchAPI: queryModelFilesList,
|
||||
deleteAPI: deleteModelFile,
|
||||
API: MODEL_FILES_API,
|
||||
watch: true,
|
||||
contentForDelete: 'resources.modelfiles.modelfile'
|
||||
});
|
||||
|
||||
const intl = useIntl();
|
||||
const { showSuccess } = useAppUtils();
|
||||
const [workersList, setWorkersList] = useState<Global.BaseOption<number>[]>(
|
||||
[]
|
||||
);
|
||||
const [downloadModalStatus, setDownlaodMoalStatus] = useState<{
|
||||
show: boolean;
|
||||
width: number | string;
|
||||
@@ -53,12 +113,46 @@ const ModelFiles = () => {
|
||||
gpuOptions: []
|
||||
});
|
||||
|
||||
const handleSelect = (val: any, record: ListItem) => {
|
||||
if (val === 'delete') {
|
||||
handleDelete({
|
||||
...record,
|
||||
name: record.local_path
|
||||
});
|
||||
useEffect(() => {
|
||||
const fetchWorkerList = async () => {
|
||||
try {
|
||||
const res = await queryWorkersList({
|
||||
page: 1,
|
||||
perPage: 100
|
||||
});
|
||||
|
||||
const list = res.items
|
||||
?.map((item: WorkerListItem) => {
|
||||
return {
|
||||
...item,
|
||||
value: item.id,
|
||||
label: item.name
|
||||
};
|
||||
})
|
||||
.filter(
|
||||
(item: WorkerListItem) => item.state === WorkerStatusMap.ready
|
||||
);
|
||||
setWorkersList(list);
|
||||
} catch (error) {
|
||||
// console.log('error', error);
|
||||
}
|
||||
};
|
||||
fetchWorkerList();
|
||||
}, []);
|
||||
|
||||
const handleSelect = async (val: any, record: ListItem) => {
|
||||
try {
|
||||
if (val === 'delete') {
|
||||
handleDelete({
|
||||
...record,
|
||||
name: record.local_path
|
||||
});
|
||||
} else if (val === 'retry') {
|
||||
await retryDownloadModelFile(record.id);
|
||||
showSuccess();
|
||||
}
|
||||
} catch (error) {
|
||||
// console.log('error', error);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -88,30 +182,47 @@ const ModelFiles = () => {
|
||||
});
|
||||
};
|
||||
|
||||
const handleDownload = (data: any) => {
|
||||
console.log('download:', data);
|
||||
const handleDownload = async (data: any) => {
|
||||
try {
|
||||
await downloadModelFile(data);
|
||||
setDownlaodMoalStatus({
|
||||
...downloadModalStatus,
|
||||
show: false
|
||||
});
|
||||
showSuccess();
|
||||
} catch (error) {
|
||||
// console.log('error', error);
|
||||
}
|
||||
};
|
||||
|
||||
const columns = [
|
||||
{
|
||||
title: 'Path',
|
||||
dataIndex: 'local_path',
|
||||
title: intl.formatMessage({ id: 'resources.modelfiles.form.path' }),
|
||||
dataIndex: 'resolved_paths',
|
||||
width: 240,
|
||||
render: (text: string, record: ListItem) => {
|
||||
return (
|
||||
<AutoTooltip ghost maxWidth={240}>
|
||||
<span>{record.local_path}</span>
|
||||
</AutoTooltip>
|
||||
record.resolved_paths?.length > 0 && (
|
||||
<span className="flex-center">
|
||||
<AutoTooltip ghost maxWidth={240}>
|
||||
<span>{record.resolved_paths?.[0]}</span>
|
||||
</AutoTooltip>
|
||||
<CopyButton
|
||||
text={record.resolved_paths?.[0]}
|
||||
type="link"
|
||||
></CopyButton>
|
||||
</span>
|
||||
)
|
||||
);
|
||||
}
|
||||
},
|
||||
{
|
||||
title: 'Size',
|
||||
title: intl.formatMessage({ id: 'resources.modelfiles.size' }),
|
||||
dataIndex: 'size',
|
||||
render: (text: string, record: ListItem) => {
|
||||
return (
|
||||
<AutoTooltip ghost maxWidth={100}>
|
||||
<span>{record.size}</span>
|
||||
<span>{convertFileSize(record.size, 1)}</span>
|
||||
</AutoTooltip>
|
||||
);
|
||||
}
|
||||
@@ -122,7 +233,7 @@ const ModelFiles = () => {
|
||||
render: (text: string, record: ListItem) => {
|
||||
return (
|
||||
<AutoTooltip ghost maxWidth={240}>
|
||||
<span>{record.worker_name}</span>
|
||||
<span>{getWorkerName(record.worker_id, workersList)}</span>
|
||||
</AutoTooltip>
|
||||
);
|
||||
}
|
||||
@@ -140,15 +251,7 @@ const ModelFiles = () => {
|
||||
title: intl.formatMessage({ id: 'common.table.status' }),
|
||||
dataIndex: 'state',
|
||||
render: (text: string, record: ListItem) => {
|
||||
return (
|
||||
<StatusTag
|
||||
statusValue={{
|
||||
status: status[record.state] as any,
|
||||
text: WorkerStatusMapValue[record.state],
|
||||
message: record.state_message
|
||||
}}
|
||||
></StatusTag>
|
||||
);
|
||||
return <InstanceStatusTag data={record} />;
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -209,7 +312,7 @@ const ModelFiles = () => {
|
||||
type="primary"
|
||||
iconPosition="end"
|
||||
>
|
||||
Download Model
|
||||
{intl.formatMessage({ id: 'resources.modelfiles.download' })}
|
||||
</Button>
|
||||
</DropDownActions>
|
||||
<Button
|
||||
@@ -250,11 +353,12 @@ const ModelFiles = () => {
|
||||
<DeleteModal ref={modalRef}></DeleteModal>
|
||||
<DownloadModal
|
||||
open={downloadModalStatus.show}
|
||||
title={intl.formatMessage({ id: 'models.button.deploy' })}
|
||||
title={intl.formatMessage({ id: 'resources.modelfiles.download' })}
|
||||
source={downloadModalStatus.source}
|
||||
width={downloadModalStatus.width}
|
||||
onCancel={handleDownloadCancel}
|
||||
onOk={handleDownload}
|
||||
workersList={workersList}
|
||||
></DownloadModal>
|
||||
</>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user