You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

config.tsx 7.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. import datasetImg from '@/assets/img/modal-select-dataset.png';
  2. import mirrorImg from '@/assets/img/modal-select-mirror.png';
  3. import modelImg from '@/assets/img/modal-select-model.png';
  4. import { AvailableRange, CommonTabKeys, MirrorVersionStatus } from '@/enums';
  5. import { ResourceData, ResourceVersionData } from '@/pages/Dataset/config';
  6. import { MirrorVersionData } from '@/pages/Mirror/Info';
  7. import { MirrorData } from '@/pages/Mirror/List';
  8. import {
  9. getDatasetInfo,
  10. getDatasetList,
  11. getDatasetVersionList,
  12. getModelInfo,
  13. getModelList,
  14. getModelVersionList,
  15. } from '@/services/dataset/index.js';
  16. import { getMirrorListReq, getMirrorVersionListReq } from '@/services/mirror';
  17. import type { TabsProps, TreeDataNode } from 'antd';
  18. import { pick } from 'lodash';
  19. export enum ResourceSelectorType {
  20. Model = 'Model', // 模型
  21. Dataset = 'Dataset', // 数据集
  22. Mirror = 'Mirror', //镜像
  23. }
  24. // 数据集、模型列表转为树形结构
  25. const convertDatasetToTreeData = (list: ResourceData[]): TreeDataNode[] => {
  26. return list.map((v) => ({
  27. ...v,
  28. key: `${v.id}`,
  29. title: v.name,
  30. isLeaf: false,
  31. checkable: false,
  32. }));
  33. };
  34. // 镜像列表转为树形结构
  35. const convertMirrorToTreeData = (list: MirrorData[]): TreeDataNode[] => {
  36. return list.map((v) => ({
  37. key: `${v.id}`,
  38. title: v.name,
  39. isLeaf: false,
  40. checkable: false,
  41. }));
  42. };
  43. // 数据集、模型版本列表转为树形结构
  44. const convertResourceVersionToTreeData = (
  45. parentId: string,
  46. info: ResourceData,
  47. list: ResourceVersionData[],
  48. ): TreeDataNode[] => {
  49. return list.map((item: ResourceVersionData) => ({
  50. ...pick(info, ['id', 'name', 'owner', 'identifier', 'is_public']),
  51. version: item.name,
  52. title: item.name,
  53. key: `${parentId}-${item.name}`,
  54. isLeaf: true,
  55. checkable: true,
  56. }));
  57. };
  58. // 镜像版本列表转为树形结构
  59. const convertMirrorVersionToTreeData = (
  60. parentId: string,
  61. list: MirrorVersionData[],
  62. ): TreeDataNode[] => {
  63. return list.map((item: MirrorVersionData) => ({
  64. url: item.url,
  65. title: item.tag_name,
  66. key: `${parentId}-${item.id}`,
  67. isLeaf: true,
  68. checkable: true,
  69. }));
  70. };
  71. interface SelectorTypeInfo {
  72. getList: (isPublic: boolean) => Promise<any>; // 获取资源列表
  73. getVersions: (parentKey: string, parentNode: any) => Promise<any>; // 获取资源版本列表
  74. getFiles: (parentKey: string, parentNode: any) => Promise<any>; // 获取资源文件列表
  75. readonly modalIcon: string; // modal icon
  76. readonly buttonIcon: string; // button icon
  77. readonly name: string; // 名称
  78. readonly tabItems: TabsProps['items']; // tab 列表
  79. readonly buttontTitle: string; // 按钮 title
  80. }
  81. // 数据集选择
  82. export class DatasetSelector implements SelectorTypeInfo {
  83. readonly name = '数据集';
  84. readonly modalIcon = datasetImg;
  85. readonly buttonIcon = 'icon-xuanzeshujuji';
  86. readonly tabItems = [
  87. {
  88. key: CommonTabKeys.Private,
  89. label: '我的数据集',
  90. },
  91. {
  92. key: CommonTabKeys.Public,
  93. label: '公开数据集',
  94. },
  95. ];
  96. readonly buttontTitle = '选择数据集';
  97. async getList(isPublic: boolean) {
  98. const res = await getDatasetList({ is_public: isPublic, page: 0, size: 2000 });
  99. if (res && res.data) {
  100. const list = res.data.content || [];
  101. return convertDatasetToTreeData(list);
  102. } else {
  103. return Promise.reject('获取数据集列表失败');
  104. }
  105. }
  106. async getVersions(parentKey: string, parentNode: ResourceData) {
  107. const res = await getDatasetVersionList(pick(parentNode, ['owner', 'identifier']));
  108. if (res && res.data) {
  109. const list = res.data;
  110. return convertResourceVersionToTreeData(parentKey, parentNode, list);
  111. } else {
  112. return Promise.reject('获取数据集版本列表失败');
  113. }
  114. }
  115. async getFiles(_parentKey: string, parentNode: ResourceData & ResourceVersionData) {
  116. const params = pick(parentNode, ['owner', 'identifier', 'id', 'name', 'version', 'is_public']);
  117. const res = await getDatasetInfo(params);
  118. if (res && res.data) {
  119. const path = res.data.relative_paths || '';
  120. const list = res.data.dataset_version_vos || [];
  121. return {
  122. path,
  123. content: list,
  124. };
  125. } else {
  126. return Promise.reject('获取数据集文件列表失败');
  127. }
  128. }
  129. }
  130. // 模型选择
  131. export class ModelSelector implements SelectorTypeInfo {
  132. readonly name = '模型';
  133. readonly modalIcon = modelImg;
  134. readonly buttonIcon = 'icon-xuanzemoxing';
  135. readonly tabItems = [
  136. {
  137. key: CommonTabKeys.Private,
  138. label: '我的模型',
  139. },
  140. {
  141. key: CommonTabKeys.Public,
  142. label: '公开模型',
  143. },
  144. ];
  145. readonly buttontTitle = '选择模型';
  146. async getList(isPublic: boolean) {
  147. const res = await getModelList({ is_public: isPublic, page: 0, size: 2000 });
  148. if (res && res.data) {
  149. const list = res.data.content || [];
  150. return convertDatasetToTreeData(list);
  151. } else {
  152. return Promise.reject('获取模型列表失败');
  153. }
  154. }
  155. async getVersions(key: string, parentNode: ResourceData) {
  156. const res = await getModelVersionList(pick(parentNode, ['owner', 'identifier']));
  157. if (res && res.data) {
  158. const list = res.data;
  159. return convertResourceVersionToTreeData(key, parentNode, list);
  160. } else {
  161. return Promise.reject('获取模型版本列表失败');
  162. }
  163. }
  164. async getFiles(_parentKey: string, parentNode: ResourceData & ResourceVersionData) {
  165. const params = pick(parentNode, ['owner', 'identifier', 'id', 'name', 'version', 'is_public']);
  166. const res = await getModelInfo(params);
  167. if (res && res.data) {
  168. const path = res.data.relative_paths || '';
  169. const list = res.data.model_version_vos || [];
  170. return {
  171. path,
  172. content: list,
  173. };
  174. } else {
  175. return Promise.reject('获取模型文件列表失败');
  176. }
  177. }
  178. }
  179. // 镜像选择
  180. export class MirrorSelector implements SelectorTypeInfo {
  181. readonly name = '镜像';
  182. readonly modalIcon = mirrorImg;
  183. readonly buttonIcon = 'icon-xuanzejingxiang';
  184. readonly tabItems = [
  185. {
  186. key: CommonTabKeys.Private,
  187. label: '我的镜像',
  188. },
  189. {
  190. key: CommonTabKeys.Public,
  191. label: '公开镜像',
  192. },
  193. ];
  194. readonly buttontTitle = '选择镜像';
  195. async getList(isPublic: boolean) {
  196. const res = await getMirrorListReq({
  197. image_type: isPublic ? AvailableRange.Public : AvailableRange.Private,
  198. page: 0,
  199. size: 2000,
  200. });
  201. if (res && res.data) {
  202. const list = res.data.content || [];
  203. return convertMirrorToTreeData(list);
  204. } else {
  205. return Promise.reject('获取镜像列表失败');
  206. }
  207. }
  208. async getVersions(parentKey: string) {
  209. const res = await getMirrorVersionListReq({
  210. image_id: parentKey,
  211. page: 0,
  212. size: 2000,
  213. status: MirrorVersionStatus.Available,
  214. });
  215. if (res && res.data) {
  216. const list = res.data.content || [];
  217. return convertMirrorVersionToTreeData(parentKey, list);
  218. } else {
  219. return Promise.reject('获取镜像版本列表失败');
  220. }
  221. }
  222. async getFiles(_parentKey: string, parentNode: MirrorVersionData) {
  223. const { url } = parentNode;
  224. return {
  225. path: url,
  226. content: [
  227. {
  228. url: url,
  229. file_name: `${url}`,
  230. },
  231. ],
  232. };
  233. }
  234. }
  235. export const selectorTypeConfig: Record<ResourceSelectorType, SelectorTypeInfo> = {
  236. [ResourceSelectorType.Model]: new ModelSelector(),
  237. [ResourceSelectorType.Dataset]: new DatasetSelector(),
  238. [ResourceSelectorType.Mirror]: new MirrorSelector(),
  239. };