ci4sManagement-cloud/react-ui/src/pages/Dataset/components/ResourceIntro/index.tsx

332 lines
8.3 KiB
TypeScript

import BasicTableInfo, { BasicInfoData } from '@/components/BasicTableInfo';
import KFMdEditor from '@/components/KFMdEditor';
import SubAreaTitle from '@/components/SubAreaTitle';
import {
bigDataMarkStatusOptions,
bigDataPatternOptions_learning,
bigDataPatternOptions_pretraining,
bigDataPatternOptions_rewardmodel,
bigDataPatternOptions_sft,
bigDataPremarkOptions,
bigDataTypeOptions,
bigMarkToolOptions,
bigQuestionTypeOptions,
} from '@/enums';
import {
BigDatasetVersionInfo,
DatasetData,
ModelData,
ResourceType,
resourceConfig,
} from '@/pages/Dataset/config';
import { getBigDatasetMarkListReq } from '@/services/bigModel';
import {
EnumOptions,
formatCodeConfig,
formatDatasets,
formatEnum,
formatSource,
formatTrainTask,
} from '@/utils/format';
import { to } from '@/utils/promise';
import classNames from 'classnames';
import { useEffect, useMemo, useState } from 'react';
import styles from './index.less';
type ResourceIntroProps = {
resourceType: ResourceType;
info: DatasetData | ModelData;
gitId: number;
identifier: string;
name: string;
description?: string;
isBigModel: boolean;
isMine: boolean;
version?: string;
onEditIntro?: (id: number, identifier: string, description: string) => void;
};
const getDatasetDatas = (
isBigModel: boolean,
data: DatasetData,
markSevices: EnumOptions[],
): BasicInfoData[] => {
const arr: BasicInfoData[] = [
// {
// label: '数据集名称',
// value: name,
// },
{
label: '数据集版本',
value: data.version,
},
{
label: '创建人',
value: data.create_by,
},
{
label: '更新时间',
value: data.update_time,
},
{
label: '数据来源',
value: data.dataset_source,
format: formatSource,
},
];
if (isBigModel) {
const bigData = data as any as BigDatasetVersionInfo;
arr.push(
{
label: '数据用途',
value: bigData.dataType,
format: formatEnum(bigDataTypeOptions),
},
{
label: '数据样式',
value: bigData.pattern,
format: formatEnum([
...bigDataPatternOptions_sft,
...bigDataPatternOptions_rewardmodel,
...bigDataPatternOptions_learning,
...bigDataPatternOptions_pretraining,
]),
},
{
label: '题型',
value: bigData.questionType,
format: formatEnum(bigQuestionTypeOptions),
},
{
label: '标注工具',
value: bigData.markToolId,
format: formatEnum(bigMarkToolOptions),
},
{
label: '是否启用预标',
value: bigData.premarkStatus,
format: formatEnum(bigDataPremarkOptions),
},
{
label: '预标服务',
value: bigData.serviceId,
format: formatEnum(markSevices),
},
{
label: '标注状态',
value: bigData.markStatus,
format: formatEnum(bigDataMarkStatusOptions),
},
{
label: '提示',
value: bigData.prompt,
},
);
} else {
arr.push(
{
label: '训练任务',
value: data.train_task,
format: formatTrainTask,
},
{
label: '处理代码',
value: data.processing_code,
format: formatCodeConfig,
},
);
}
arr.push({
label: '版本描述',
value: data.version_desc,
});
return arr;
};
const getModelDatas = (isBigModel: boolean, data: ModelData): BasicInfoData[] => {
const arr: BasicInfoData[] = [
// {
// label: '模型名称',
// value: name,
// ellipsis: true,
// },
{
label: '模型版本',
value: data.version,
ellipsis: true,
},
{
label: '创建人',
value: data.create_by,
ellipsis: true,
},
{
label: '更新时间',
value: data.update_time,
ellipsis: true,
},
{
label: '模型来源',
value: data.model_source,
format: formatSource,
ellipsis: true,
},
];
if (!isBigModel) {
arr.push(
{
label: '训练镜像',
value: data.image,
ellipsis: true,
},
{
label: '训练代码',
value: data.project_depency,
format: formatCodeConfig,
ellipsis: true,
},
{
label: '训练数据集',
value: data.train_datasets,
format: formatDatasets,
ellipsis: true,
},
{
label: '测试数据集',
value: data.test_datasets,
format: formatDatasets,
ellipsis: true,
},
{
label: '训练任务',
value: data.train_task,
format: formatTrainTask,
ellipsis: true,
},
);
}
// if (isBigModel) {
// const bigData = data as any as BigModelVersionInfo;
// arr.push(
// {
// label: '虚拟任务名称',
// value: bigData.taskType,
// },
// {
// label: '训练类型',
// value: bigData.modelType,
// },
// {
// label: '基础模型',
// value: bigData.baseModel,
// },
// {
// label: 'cpu架构',
// value: bigData.systemStructure,
// },
// {
// label: '加速卡',
// value: bigData.acceleratorCard,
// },
// );
// }
arr.push({
label: '版本描述',
value: data.version_desc,
});
return arr;
};
function ResourceIntro({
resourceType,
info,
gitId,
identifier,
// name,
description,
isBigModel,
isMine,
version,
onEditIntro,
}: ResourceIntroProps) {
const [markSevices, setMarkServices] = useState([]);
const config = resourceConfig[resourceType];
const basicDatas: BasicInfoData[] = useMemo(() => {
return resourceType === ResourceType.Dataset
? getDatasetDatas(isBigModel, info as DatasetData, markSevices)
: getModelDatas(isBigModel, info as ModelData);
}, [resourceType, isBigModel, info, markSevices]);
useEffect(() => {
const getBigDatasetMarkList = async () => {
const [res] = await to(getBigDatasetMarkListReq());
if (res && res.data && Array.isArray(res.data)) {
setMarkServices(
res.data.map((v: any) => ({
label: v.name,
value: v.id,
})),
);
}
};
if (isBigModel && resourceType === ResourceType.Dataset) {
getBigDatasetMarkList();
}
}, [isBigModel, resourceType]);
return (
<div
className={classNames(styles['resource-intro'], {
[styles['resource-intro--no-version']]: !version,
})}
>
{version && (
<div style={{ flex: 'none' }}>
<SubAreaTitle
title="版本信息"
image={require('@/assets/img/dataset-basic.png')}
style={{ marginBottom: '20px' }}
></SubAreaTitle>
<div>
<BasicTableInfo datas={basicDatas} labelWidth={135}></BasicTableInfo>
</div>
{/* <div className={styles['resource-intro__title']}>{`${config.name}描述`}</div>
<div className={styles['resource-intro__desc']}>{description ?? '暂无描述'}</div>
<div className={styles['resource-intro__title']}>版本描述</div>
<div className={styles['resource-intro__desc']}>{info.version_desc ?? '暂无描述'}</div>
<SubAreaTitle
title="实例用法"
image={require('@/assets/img/usage-icon.png')}
style={{ margin: '25px 0 15px' }}
></SubAreaTitle>
<div
dangerouslySetInnerHTML={{ __html: info.usage ?? '暂无实例用法' }}
></div> */}
<SubAreaTitle
title={`${config.name}介绍`}
image={require('@/assets/img/dataset-intro.png')}
style={{ marginBottom: '20px', marginTop: '30px' }}
></SubAreaTitle>
</div>
)}
{isBigModel ? (
<div className={styles['resource-intro__desc']}>{description ?? '暂无介绍'}</div>
) : (
<KFMdEditor
className={styles['resource-intro__editor']}
canEdit={isMine}
defaultValue={description}
noDataTitle={isMine ? `请编辑${config.name}介绍` : `暂无${config.name}介绍`}
placeholder="请输入"
editBtnTitle="编辑简介"
onChange={(value) => onEditIntro?.(gitId, identifier, value)}
></KFMdEditor>
)}
</div>
);
}
export default ResourceIntro;