first-update
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
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 });
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user