add operator create page (#38)

* feat: Update site name to DataMate and refine text for AI data processing

* feat: Refactor settings page and implement model access functionality

- Created a new ModelAccess component for managing model configurations.
- Removed the old Settings component and replaced it with a new SettingsPage component that integrates ModelAccess, SystemConfig, and WebhookConfig.
- Added SystemConfig component for managing system settings.
- Implemented WebhookConfig component for managing webhook configurations.
- Updated API functions for model management in settings.apis.ts.
- Adjusted routing to point to the new SettingsPage component.

* feat: Implement Data Collection Page with Task Management and Execution Log

- Created DataCollectionPage component to manage data collection tasks.
- Added TaskManagement and ExecutionLog components for task handling and logging.
- Integrated task operations including start, stop, edit, and delete functionalities.
- Implemented filtering and searching capabilities in task management.
- Introduced SimpleCronScheduler for scheduling tasks with cron expressions.
- Updated CreateTask component to utilize new scheduling and template features.
- Enhanced BasicInformation component to conditionally render fields based on visibility settings.
- Refactored ImportConfiguration component to remove NAS import section.

* feat: Update task creation API endpoint and enhance task creation form with new fields and validation

* Refactor file upload and operator management components

- Removed unnecessary console logs from file download and export functions.
- Added size property to TaskItem interface for better task management.
- Simplified TaskUpload component by utilizing useFileSliceUpload hook for file upload logic.
- Enhanced OperatorPluginCreate component to handle file uploads and parsing more efficiently.
- Updated ConfigureStep component to use Ant Design Form for better data handling and validation.
- Improved PreviewStep component to navigate back to the operator market.
- Added support for additional file types in UploadStep component.
- Implemented delete operator functionality in OperatorMarketPage with confirmation prompts.
- Cleaned up unused API functions in operator.api.ts to streamline the codebase.
- Fixed number formatting utility to handle zero values correctly.
This commit is contained in:
chenghh-9609
2025-10-30 16:30:01 +08:00
committed by GitHub
parent e0884ab048
commit 5612c7cd91
22 changed files with 640 additions and 979 deletions

View File

@@ -115,20 +115,15 @@ const MockAPI = {
batchEvaluationUsingPost: "/evaluation/batch-evaluate", // 批量评测
// 知识生成接口
queryKnowledgeBasesUsingPost: "/knowledge/bases", // 获取知识库列表
createKnowledgeBaseUsingPost: "/knowledge/bases/create", // 创建知识库
queryKnowledgeBaseByIdUsingGet: "/knowledge/bases/:baseId", // 根据ID获取知识库详情
updateKnowledgeBaseByIdUsingPut: "/knowledge/bases/:baseId", // 更新知识库
deleteKnowledgeBaseByIdUsingDelete: "/knowledge/bases/:baseId", // 删除知识库
queryKnowledgeGenerationTasksUsingPost: "/knowledge/tasks", // 获取知识生成任务列表
createKnowledgeGenerationTaskUsingPost: "/knowledge/tasks/create", // 创建知识生成任务
queryKnowledgeGenerationTaskByIdUsingGet: "/knowledge/tasks/:taskId", // 根据ID获取知识生成任务详情
updateKnowledgeGenerationTaskByIdUsingPut: "/knowledge/tasks/:taskId", // 更新知识生成任务
deleteKnowledgeGenerationTaskByIdUsingDelete: "/knowledge/tasks/:taskId", // 删除知识生成任务
executeKnowledgeGenerationTaskByIdUsingPost:
"/knowledge/tasks/:taskId/execute", // 执行知识生成任务
stopKnowledgeGenerationTaskByIdUsingPost: "/knowledge/tasks/:taskId/stop", // 停止知识生成任务
queryKnowledgeStatisticsUsingGet: "/knowledge/statistics", // 获取知识生成
queryKnowledgeBasesUsingPost: "/knowledge-base/list", // 获取知识库列表
createKnowledgeBaseUsingPost: "/knowledge-base/create", // 创建知识库
queryKnowledgeBaseByIdUsingGet: "/knowledge-base/:baseId", // 根据ID获取知识库详情
updateKnowledgeBaseByIdUsingPut: "/knowledge-base/:baseId", // 更新知识库
deleteKnowledgeBaseByIdUsingDelete: "/knowledge-base/:baseId", // 删除知识库
queryKnowledgeGenerationTasksUsingPost: "/knowledge-base/tasks", // 获取知识生成任务列表
addKnowledgeGenerationFilesUsingPost: "/knowledge-base/:baseId/files", // 添加文件到知识库
queryKnowledgeGenerationFilesByIdUsingGet: "/knowledge-base/:baseId/files/:fileId", // 根据ID获取知识生成文件详情
deleteKnowledgeGenerationTaskByIdUsingDelete: "/knowledge-base/:baseId/files", // 删除知识生成文件
// 算子市场
queryOperatorsUsingPost: "/operators/list", // 获取算子列表
@@ -137,6 +132,10 @@ const MockAPI = {
createOperatorUsingPost: "/operators/create", // 创建算子
updateOperatorByIdUsingPut: "/operators/:operatorId", // 更新算子
uploadOperatorUsingPost: "/operators/upload", // 上传算子
uploadFileChunkUsingPost: "/operators/upload/chunk", // 上传切片
preUploadOperatorUsingPost: "/operators/upload/pre-upload", // 预上传文件
cancelUploadOperatorUsingPut: "/operators/upload/cancel-upload", // 取消上传
createLabelUsingPost: "/operators/labels", // 创建算子标签
queryLabelsUsingGet: "/labels", // 获取算子标签列表
deleteLabelsUsingDelete: "/labels", // 删除算子标签
@@ -151,7 +150,6 @@ const MockAPI = {
createModelUsingPost: "/models/create", // 创建模型
updateModelUsingPut: "/models/:id", // 更新模型
deleteModelUsingDelete: "/models/:id", // 删除模型
};
module.exports = addMockPrefix("/api", MockAPI);

View File

@@ -0,0 +1,161 @@
const Mock = require("mockjs");
const API = require("../mock-apis.cjs");
// 知识库数据
function KnowledgeBaseItem() {
return {
id: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
name: Mock.Random.ctitle(5, 15),
description: Mock.Random.csentence(10, 30),
createdBy: Mock.Random.cname(),
updatedBy: Mock.Random.cname(),
embeddingModel: Mock.Random.pick([
"text-embedding-ada-002",
"text-embedding-3-small",
"text-embedding-3-large",
]),
chatModel: Mock.Random.pick(["gpt-3.5-turbo", "gpt-4", "gpt-4-32k"]),
createdAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss"),
updatedAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss"),
};
}
const knowledgeBaseList = new Array(50).fill(null).map(KnowledgeBaseItem);
module.exports = function (router) {
// 获取知识库列表
router.post(API.queryKnowledgeBasesUsingPost, (req, res) => {
const { page = 0, size, keyword } = req.body;
let filteredList = knowledgeBaseList;
if (keyword) {
filteredList = knowledgeBaseList.filter(
(kb) => kb.name.includes(keyword) || kb.description.includes(keyword)
);
}
const start = page * size;
const end = start + size;
const totalElements = filteredList.length;
const paginatedList = filteredList.slice(start, end);
res.send({
code: "0",
msg: "Success",
data: {
totalElements,
page,
size,
content: paginatedList,
},
});
});
// 创建知识库
router.post(API.createKnowledgeBaseUsingPost, (req, res) => {
const item = KnowledgeBaseItem();
knowledgeBaseList.unshift(item);
res.status(201).send(item);
});
// 获取知识库详情
router.get(
new RegExp(API.queryKnowledgeBaseByIdUsingGet.replace(":baseId", "(\\w+)")),
(req, res) => {
const id = req.params.baseId;
const item =
knowledgeBaseList.find((kb) => kb.id === id) || KnowledgeBaseItem();
res.send(item);
}
);
// 更新知识库
router.put(API.updateKnowledgeBaseByIdUsingPut, (req, res) => {
const id = req.params.baseId;
const idx = knowledgeBaseList.findIndex((kb) => kb.id === id);
if (idx >= 0) {
knowledgeBaseList[idx] = { ...knowledgeBaseList[idx], ...req.body };
res.status(201).send(knowledgeBaseList[idx]);
} else {
res.status(404).send({ message: "Not found" });
}
});
// 删除知识库
router.delete(API.deleteKnowledgeBaseByIdUsingDelete, (req, res) => {
const id = req.params.baseId;
const idx = knowledgeBaseList.findIndex((kb) => kb.id === id);
if (idx >= 0) {
knowledgeBaseList.splice(idx, 1);
res.status(201).send({ success: true });
} else {
res.status(404).send({ message: "Not found" });
}
});
// 获取知识生成任务列表
router.post(API.queryKnowledgeGenerationTasksUsingPost, (req, res) => {
const tasks = Mock.mock({
"data|10": [
{
id: "@guid",
name: "@ctitle(5,15)",
status: '@pick(["pending","running","success","failed"])',
createdAt: "@datetime",
updatedAt: "@datetime",
progress: "@integer(0,100)",
},
],
total: 10,
current: 1,
pageSize: 10,
});
res.send(tasks);
});
// 添加文件到知识库
router.post(
new RegExp(
API.addKnowledgeGenerationFilesUsingPost.replace(":baseId", "(\\w+)")
),
(req, res) => {
const file = Mock.mock({
id: "@guid",
name: "@ctitle(5,15)",
size: "@integer(1000,1000000)",
status: "uploaded",
createdAt: "@datetime",
});
res.status(201).send(file);
}
);
// 获取知识生成文件详情
router.get(
new RegExp(
API.queryKnowledgeGenerationFilesByIdUsingGet
.replace(":baseId", "(\\w+)")
.replace(":fileId", "(\\w+)")
),
(req, res) => {
const file = Mock.mock({
id: req.params.fileId,
name: "@ctitle(5,15)",
size: "@integer(1000,1000000)",
status: "uploaded",
createdAt: "@datetime",
});
res.send(file);
}
);
// 删除知识生成文件
router.delete(
new RegExp(
API.deleteKnowledgeGenerationTaskByIdUsingDelete.replace(
":baseId",
"(\\w+)"
)
),
(req, res) => {
res.send({ success: true });
}
);
};

View File

@@ -34,6 +34,32 @@ function labelItem() {
const labelList = new Array(50).fill(null).map(labelItem);
module.exports = function (router) {
router.post(API.preUploadOperatorUsingPost, (req, res) => {
res.status(201).send(Mock.Random.guid());
});
// 上传切片
router.post(API.uploadFileChunkUsingPost, (req, res) => {
// res.status(500).send({ message: "Simulated upload failure" });
res.status(201).send({ data: "success" });
});
// 取消上传
router.put(API.cancelUploadOperatorUsingPut, (req, res) => {
res.status(201).send({ data: "success" });
});
router.post(API.uploadOperatorUsingPost, (req, res) => {
res.status(201).send({
code: "0",
msg: "Upload successful",
data: {
operatorId: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
// 其他返回数据
},
});
});
// 获取算子标签列表
router.get(API.queryLabelsUsingGet, (req, res) => {
const { page = 0, size = 20, keyword = "" } = req.query;

View File

@@ -1,196 +0,0 @@
export const mockOperators: Operator[] = [
{
id: 1,
name: "图像预处理算子",
version: "1.2.0",
description:
"支持图像缩放、裁剪、旋转、颜色空间转换等常用预处理操作,优化了内存使用和处理速度",
author: "张三",
category: "图像处理",
modality: ["image"],
type: "preprocessing",
tags: ["图像处理", "预处理", "缩放", "裁剪", "旋转"],
createdAt: "2024-01-15",
lastModified: "2024-01-23",
status: "active",
isFavorited: true,
downloads: 1247,
usage: 856,
framework: "PyTorch",
language: "Python",
size: "2.3MB",
dependencies: ["opencv-python", "pillow", "numpy"],
inputFormat: ["jpg", "png", "bmp", "tiff"],
outputFormat: ["jpg", "png", "tensor"],
performance: {
accuracy: 99.5,
speed: "50ms/image",
memory: "128MB",
},
},
{
id: 2,
name: "文本分词算子",
version: "2.1.3",
description:
"基于深度学习的中文分词算子,支持自定义词典,在医学文本上表现优异",
author: "李四",
category: "自然语言处理",
modality: ["text"],
type: "preprocessing",
tags: ["文本处理", "分词", "中文", "NLP", "医学"],
createdAt: "2024-01-10",
lastModified: "2024-01-20",
status: "active",
isFavorited: false,
downloads: 892,
usage: 634,
framework: "TensorFlow",
language: "Python",
size: "15.6MB",
dependencies: ["tensorflow", "jieba", "transformers"],
inputFormat: ["txt", "json", "csv"],
outputFormat: ["json", "txt"],
performance: {
accuracy: 96.8,
speed: "10ms/sentence",
memory: "256MB",
},
},
{
id: 3,
name: "音频特征提取",
version: "1.0.5",
description: "提取音频的MFCC、梅尔频谱、色度等特征,支持多种音频格式",
author: "王五",
category: "音频处理",
modality: ["audio"],
type: "preprocessing",
tags: ["音频处理", "特征提取", "MFCC", "频谱分析"],
createdAt: "2024-01-08",
lastModified: "2024-01-18",
status: "active",
isFavorited: true,
downloads: 456,
usage: 312,
framework: "PyTorch",
language: "Python",
size: "8.9MB",
dependencies: ["librosa", "scipy", "numpy"],
inputFormat: ["wav", "mp3", "flac", "m4a"],
outputFormat: ["npy", "json", "csv"],
performance: {
speed: "2x实时",
memory: "64MB",
},
},
{
id: 4,
name: "视频帧提取算子",
version: "1.3.2",
description: "高效的视频帧提取算子,支持关键帧检测和均匀采样",
author: "赵六",
category: "视频处理",
modality: ["video"],
type: "preprocessing",
tags: ["视频处理", "帧提取", "关键帧", "采样"],
createdAt: "2024-01-05",
lastModified: "2024-01-22",
status: "active",
isFavorited: false,
downloads: 723,
usage: 445,
framework: "OpenCV",
language: "Python",
size: "12.4MB",
dependencies: ["opencv-python", "ffmpeg-python"],
inputFormat: ["mp4", "avi", "mov", "mkv"],
outputFormat: ["jpg", "png", "npy"],
performance: {
speed: "30fps处理",
memory: "512MB",
},
},
{
id: 5,
name: "多模态融合算子",
version: "2.0.1",
description: "支持文本、图像、音频多模态数据融合的深度学习算子",
author: "孙七",
category: "多模态处理",
modality: ["text", "image", "audio"],
type: "training",
tags: ["多模态", "融合", "深度学习", "注意力机制"],
createdAt: "2024-01-12",
lastModified: "2024-01-21",
status: "beta",
isFavorited: false,
downloads: 234,
usage: 156,
framework: "PyTorch",
language: "Python",
size: "45.2MB",
dependencies: ["torch", "transformers", "torchvision", "torchaudio"],
inputFormat: ["json", "jpg", "wav"],
outputFormat: ["tensor", "json"],
performance: {
accuracy: 94.2,
speed: "100ms/sample",
memory: "2GB",
},
},
{
id: 6,
name: "模型推理加速",
version: "1.1.0",
description: "基于TensorRT的模型推理加速算子,支持多种深度学习框架",
author: "周八",
category: "模型优化",
modality: ["image", "text"],
type: "inference",
tags: ["推理加速", "TensorRT", "优化", "GPU"],
createdAt: "2024-01-03",
lastModified: "2024-01-19",
status: "active",
isFavorited: true,
downloads: 567,
usage: 389,
framework: "TensorRT",
language: "Python",
size: "23.7MB",
dependencies: ["tensorrt", "pycuda", "numpy"],
inputFormat: ["onnx", "pb", "pth"],
outputFormat: ["tensor", "json"],
performance: {
speed: "5x加速",
memory: "减少40%",
},
},
{
id: 7,
name: "数据增强算子",
version: "1.4.1",
description: "丰富的数据增强策略,包括几何变换、颜色变换、噪声添加等",
author: "吴九",
category: "数据增强",
modality: ["image"],
type: "preprocessing",
tags: ["数据增强", "几何变换", "颜色变换", "噪声"],
createdAt: "2024-01-01",
lastModified: "2024-01-17",
status: "active",
isFavorited: false,
downloads: 934,
usage: 678,
framework: "Albumentations",
language: "Python",
size: "6.8MB",
dependencies: ["albumentations", "opencv-python", "numpy"],
inputFormat: ["jpg", "png", "bmp"],
outputFormat: ["jpg", "png", "npy"],
performance: {
speed: "20ms/image",
memory: "32MB",
},
},
];