From c55280b61e41a9ab3027d64295620b8eefb94d3a Mon Sep 17 00:00:00 2001 From: Dallas98 <990259227@qq.com> Date: Mon, 8 Dec 2025 10:43:40 +0800 Subject: [PATCH 1/4] feat(synthesis): add evaluation task creation functionality and UI enhancements --- .../components/SynthesisTaskTab.tsx | 226 +++++++++++++++--- 1 file changed, 198 insertions(+), 28 deletions(-) diff --git a/frontend/src/pages/SynthesisTask/components/SynthesisTaskTab.tsx b/frontend/src/pages/SynthesisTask/components/SynthesisTaskTab.tsx index 8a43e3b3..15662c56 100644 --- a/frontend/src/pages/SynthesisTask/components/SynthesisTaskTab.tsx +++ b/frontend/src/pages/SynthesisTask/components/SynthesisTaskTab.tsx @@ -1,15 +1,12 @@ -import { useState, useEffect, ElementType } from "react"; -import { Card, Button, Badge, Table, Modal, message, Tooltip } from "antd"; +import { useState, useEffect } from "react"; +import { Card, Button, Table, Modal, message, Tooltip, Form, Input, Select } from "antd"; import { Plus, ArrowUp, ArrowDown, - Pause, - Play, - CheckCircle, Sparkles, } from "lucide-react"; -import { DeleteOutlined, EyeOutlined } from "@ant-design/icons"; +import { FolderOpenOutlined, DeleteOutlined, EyeOutlined, ExperimentOutlined } from "@ant-design/icons"; import { Link, useNavigate } from "react-router"; import { SearchControls } from "@/components/SearchControls"; import { formatDateTime } from "@/utils/unit"; @@ -19,6 +16,9 @@ import { archiveSynthesisTaskToDatasetUsingPost, } from "@/pages/SynthesisTask/synthesis-api"; import { createDatasetUsingPost } from "@/pages/DataManagement/dataset.api"; +import { createEvaluationTaskUsingPost } from "@/pages/DataEvaluation/evaluation.api"; +import { queryModelListUsingGet } from "@/pages/SettingsPage/settings.apis"; +import { ModelI } from "@/pages/SettingsPage/ModelAccess"; interface SynthesisTask { id: string; @@ -61,6 +61,13 @@ export default function SynthesisTaskTab() { const [pageSize, setPageSize] = useState(10); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); + const [evalModalVisible, setEvalModalVisible] = useState(false); + const [currentEvalTask, setCurrentEvalTask] = useState(null); + const [evalLoading, setEvalLoading] = useState(false); + const [models, setModels] = useState([]); + const [modelLoading, setModelLoading] = useState(false); + + const [evalForm] = Form.useForm(); // 获取任务列表 const loadTasks = async () => { @@ -94,18 +101,6 @@ export default function SynthesisTaskTab() { // eslint-disable-next-line }, [searchQuery, filterStatus, page, pageSize]); - // 状态徽章 - const getStatusBadge = (status: string) => { - const statusConfig: Record = { - pending: { label: "等待中", color: "#F59E0B", icon: Pause }, - running: { label: "运行中", color: "#3B82F6", icon: Play }, - completed: { label: "已完成", color: "#10B981", icon: CheckCircle }, - failed: { label: "失败", color: "#EF4444", icon: Pause }, - paused: { label: "已暂停", color: "#E5E7EB", icon: Pause }, - }; - return statusConfig[status] ?? statusConfig["pending"]; - }; - // 类型映射 const typeMap: Record = { QA: "问答对生成", @@ -176,19 +171,28 @@ export default function SynthesisTaskTab() { key: "actions", fixed: "right" as const, render: (_: unknown, task: SynthesisTask) => ( -
+
+ /> - - -
- }> - setSelectedDataIds(keys as string[]), - }} - columns={Object.keys(synthesisData[0] || {}).map((key) => ({ - title: key, - dataIndex: key, - key, - render: (_: unknown, record: SynthesisDataItem) => ( - handleUpdateField(record.id, key, e.target.value)} - placeholder={`请输入${key}`} - /> - ), - }))} - /> - - )} ); } diff --git a/runtime/datamate-python/app/module/generation/interface/generation_api.py b/runtime/datamate-python/app/module/generation/interface/generation_api.py index 7dd51658..b37c0974 100644 --- a/runtime/datamate-python/app/module/generation/interface/generation_api.py +++ b/runtime/datamate-python/app/module/generation/interface/generation_api.py @@ -120,7 +120,7 @@ async def list_synthesis_tasks( name: str | None = None, db: AsyncSession = Depends(get_db) ): - """分页列出所有数据合成任务""" + """分页列出所有数据合成任务,默认按创建时间倒序""" query = select(DataSynthesisInstance) if synthesis_type: query = query.filter(DataSynthesisInstance.synthesis_type == synthesis_type) @@ -129,6 +129,9 @@ async def list_synthesis_tasks( if name: query = query.filter(DataSynthesisInstance.name.like(f"%{name}%")) + # 默认按创建时间倒序排列 + query = query.order_by(DataSynthesisInstance.created_at.desc()) + count_q = select(func.count()).select_from(query.subquery()) total = (await db.execute(count_q)).scalar_one()