Files

165 lines
5.7 KiB
JavaScript

import { NextResponse } from 'next/server';
import { getEvalQuestionsWithPagination, getEvalQuestionsStats, deleteEvalQuestion } from '@/lib/db/evalDatasets';
/**
* Get project's evaluation dataset list (paginated)
*/
export async function GET(request, { params }) {
try {
const { projectId } = params;
const { searchParams } = new URL(request.url);
// Parse query params
const page = parseInt(searchParams.get('page') || '1', 10);
const pageSize = parseInt(searchParams.get('pageSize') || '20', 10);
const questionType = searchParams.get('questionType') || '';
const questionTypes = searchParams.getAll('questionTypes');
const keyword = searchParams.get('keyword') || '';
const chunkId = searchParams.get('chunkId') || '';
// Support multiple tags params or comma-separated tag
const tags =
searchParams.getAll('tags').length > 0
? searchParams.getAll('tags')
: searchParams.get('tag')
? searchParams.get('tag').split(',')
: [];
const includeStats = searchParams.get('includeStats') === 'true';
const queryOptions = {
page,
pageSize,
questionType: questionType || undefined,
questionTypes: questionTypes.length > 0 ? questionTypes : undefined,
keyword: keyword || undefined,
chunkId: chunkId || undefined,
tags: tags.length > 0 ? tags : undefined
};
if (includeStats) {
const [result, stats] = await Promise.all([
getEvalQuestionsWithPagination(projectId, queryOptions),
getEvalQuestionsStats(projectId)
]);
result.stats = stats;
return NextResponse.json(result);
}
const result = await getEvalQuestionsWithPagination(projectId, queryOptions);
return NextResponse.json(result);
} catch (error) {
console.error('Failed to get eval datasets:', error);
return NextResponse.json({ error: error.message || 'Failed to get eval datasets' }, { status: 500 });
}
}
/**
* Batch delete evaluation datasets
*/
export async function DELETE(request, { params }) {
try {
const { ids } = await request.json();
if (!ids || !Array.isArray(ids) || ids.length === 0) {
return NextResponse.json({ error: 'Invalid request: ids array is required' }, { status: 400 });
}
const results = await Promise.all(ids.map(id => deleteEvalQuestion(id).catch(err => ({ error: err.message, id }))));
const deleted = results.filter(r => !r.error).length;
const failed = results.filter(r => r.error).length;
return NextResponse.json({
success: true,
deleted,
failed,
message: `Successfully deleted ${deleted} items${failed > 0 ? `, ${failed} failed` : ''}`
});
} catch (error) {
console.error('Failed to delete eval datasets:', error);
return NextResponse.json({ error: error.message || 'Failed to delete eval datasets' }, { status: 500 });
}
}
/**
* Create a new evaluation dataset (or batch create)
*/
export async function POST(request, { params }) {
try {
const { projectId } = params;
const body = await request.json();
const { createEvalQuestion, createManyEvalQuestions } = require('@/lib/db/evalDatasets');
// Handle batch creation
if (Array.isArray(body) || (body.items && Array.isArray(body.items))) {
const items = Array.isArray(body) ? body : body.items;
if (items.length === 0) {
return NextResponse.json({ success: true, count: 0 });
}
// Validate items
const validItems = items
.map(item => {
// 确保标签格式正确: 数组转为逗号分隔字符串
let tagsStr = item.tags || '';
if (Array.isArray(tagsStr)) {
tagsStr = tagsStr.join(',');
}
return {
projectId,
question: item.question,
questionType: item.questionType || 'open_ended',
correctAnswer:
typeof item.correctAnswer === 'object' ? JSON.stringify(item.correctAnswer) : item.correctAnswer,
tags: tagsStr,
note: item.note || '',
chunkId: item.chunkId || null,
options: item.options
? typeof item.options === 'object'
? JSON.stringify(item.options)
: item.options
: ''
};
})
.filter(item => item.question && item.correctAnswer);
if (validItems.length === 0) {
return NextResponse.json({ error: 'No valid items to create' }, { status: 400 });
}
const result = await createManyEvalQuestions(validItems);
return NextResponse.json({ success: true, count: result.count });
}
// Handle single creation
const { question, correctAnswer, questionType = 'open_ended', tags, note, chunkId, options } = body;
if (!question || !correctAnswer) {
return NextResponse.json({ error: 'Question and Correct Answer are required' }, { status: 400 });
}
// 确保标签格式正确: 数组转为逗号分隔字符串
let tagsStr = tags || '';
if (Array.isArray(tagsStr)) {
tagsStr = tagsStr.join(',');
}
const evalDataset = await createEvalQuestion({
projectId,
question,
questionType,
correctAnswer: typeof correctAnswer === 'object' ? JSON.stringify(correctAnswer) : correctAnswer,
tags: tagsStr,
note: note || '',
chunkId: chunkId || null,
options: options ? (typeof options === 'object' ? JSON.stringify(options) : options) : ''
});
return NextResponse.json({ success: true, evalDataset });
} catch (error) {
console.error('Failed to create eval dataset:', error);
return NextResponse.json({ error: error.message || 'Failed to create eval dataset' }, { status: 500 });
}
}