191 lines
4.8 KiB
JavaScript
191 lines
4.8 KiB
JavaScript
import { NextResponse } from 'next/server';
|
|
import { db } from '@/lib/db/index';
|
|
|
|
/**
|
|
* Get blind-test task details
|
|
* Results are fetched from EvalResults table
|
|
*/
|
|
export async function GET(request, { params }) {
|
|
try {
|
|
const { projectId, taskId } = params;
|
|
|
|
const task = await db.task.findFirst({
|
|
where: {
|
|
id: taskId,
|
|
projectId,
|
|
taskType: 'blind-test'
|
|
}
|
|
});
|
|
|
|
if (!task) {
|
|
return NextResponse.json({ code: 404, error: 'Task not found' }, { status: 404 });
|
|
}
|
|
|
|
let detail = {};
|
|
let modelInfo = {};
|
|
try {
|
|
detail = task.detail ? JSON.parse(task.detail) : {};
|
|
modelInfo = task.modelInfo ? JSON.parse(task.modelInfo) : {};
|
|
} catch (e) {
|
|
console.error('Failed to parse task detail:', e);
|
|
}
|
|
|
|
// Fetch all related evaluation questions
|
|
const evalDatasetIds = detail.evalDatasetIds || [];
|
|
const evalDatasets = await db.evalDatasets.findMany({
|
|
where: {
|
|
id: { in: evalDatasetIds }
|
|
},
|
|
select: {
|
|
id: true,
|
|
question: true,
|
|
questionType: true,
|
|
correctAnswer: true,
|
|
tags: true
|
|
}
|
|
});
|
|
|
|
// Sort by evalDatasetIds order
|
|
const orderedDatasets = evalDatasetIds.map(id => evalDatasets.find(d => d.id === id)).filter(Boolean);
|
|
|
|
// Fetch results from EvalResults table
|
|
const evalResults = await db.evalResults.findMany({
|
|
where: { taskId },
|
|
orderBy: { createAt: 'asc' }
|
|
});
|
|
|
|
// Parse results into the format expected by frontend
|
|
const results = evalResults.map(r => {
|
|
let modelAnswer = {};
|
|
let judgeData = {};
|
|
try {
|
|
modelAnswer = JSON.parse(r.modelAnswer || '{}');
|
|
judgeData = JSON.parse(r.judgeResponse || '{}');
|
|
} catch (e) {
|
|
// Ignore parse errors
|
|
}
|
|
return {
|
|
questionId: r.evalDatasetId,
|
|
vote: judgeData.vote,
|
|
isSwapped: judgeData.isSwapped,
|
|
modelAScore: judgeData.modelAScore || 0,
|
|
modelBScore: judgeData.modelBScore || 0,
|
|
leftAnswer: modelAnswer.leftAnswer || '',
|
|
rightAnswer: modelAnswer.rightAnswer || '',
|
|
timestamp: r.createAt
|
|
};
|
|
});
|
|
|
|
return NextResponse.json({
|
|
code: 0,
|
|
data: {
|
|
...task,
|
|
detail: {
|
|
...detail,
|
|
results // Include results from EvalResults table
|
|
},
|
|
modelInfo,
|
|
evalDatasets: orderedDatasets
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.error('Failed to fetch blind-test task details:', error);
|
|
return NextResponse.json(
|
|
{ code: 500, error: 'Failed to fetch blind-test task details', message: error.message },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update blind-test task (interrupt/stop)
|
|
*/
|
|
export async function PUT(request, { params }) {
|
|
try {
|
|
const { projectId, taskId } = params;
|
|
const { action } = await request.json();
|
|
|
|
const task = await db.task.findFirst({
|
|
where: {
|
|
id: taskId,
|
|
projectId,
|
|
taskType: 'blind-test'
|
|
}
|
|
});
|
|
|
|
if (!task) {
|
|
return NextResponse.json({ code: 404, error: 'Task not found' }, { status: 404 });
|
|
}
|
|
|
|
if (action === 'interrupt') {
|
|
if (task.status !== 0) {
|
|
return NextResponse.json({ code: 400, error: 'Only running tasks can be interrupted' }, { status: 400 });
|
|
}
|
|
|
|
const updatedTask = await db.task.update({
|
|
where: { id: taskId },
|
|
data: {
|
|
status: 3, // Interrupted
|
|
endTime: new Date()
|
|
}
|
|
});
|
|
|
|
return NextResponse.json({
|
|
code: 0,
|
|
data: updatedTask,
|
|
message: 'Task interrupted'
|
|
});
|
|
}
|
|
|
|
return NextResponse.json({ code: 400, error: 'Unknown action' }, { status: 400 });
|
|
} catch (error) {
|
|
console.error('Failed to update blind-test task:', error);
|
|
return NextResponse.json(
|
|
{ code: 500, error: 'Failed to update blind-test task', message: error.message },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Delete blind-test task and its results
|
|
*/
|
|
export async function DELETE(request, { params }) {
|
|
try {
|
|
const { projectId, taskId } = params;
|
|
|
|
const task = await db.task.findFirst({
|
|
where: {
|
|
id: taskId,
|
|
projectId,
|
|
taskType: 'blind-test'
|
|
}
|
|
});
|
|
|
|
if (!task) {
|
|
return NextResponse.json({ code: 404, error: 'Task not found' }, { status: 404 });
|
|
}
|
|
|
|
// Delete related EvalResults first
|
|
await db.evalResults.deleteMany({
|
|
where: { taskId }
|
|
});
|
|
|
|
// Then delete the task
|
|
await db.task.delete({
|
|
where: { id: taskId }
|
|
});
|
|
|
|
return NextResponse.json({
|
|
code: 0,
|
|
message: 'Task deleted'
|
|
});
|
|
} catch (error) {
|
|
console.error('Failed to delete blind-test task:', error);
|
|
return NextResponse.json(
|
|
{ code: 500, error: 'Failed to delete blind-test task', message: error.message },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|