110 lines
3.4 KiB
JavaScript
110 lines
3.4 KiB
JavaScript
import { NextResponse } from 'next/server';
|
|
import { createDataset } from '@/lib/db/datasets';
|
|
import { nanoid } from 'nanoid';
|
|
|
|
export async function POST(request, { params }) {
|
|
try {
|
|
const { projectId } = params;
|
|
const { datasets, sourceInfo } = await request.json();
|
|
|
|
if (!datasets || !Array.isArray(datasets)) {
|
|
return NextResponse.json({ error: 'Invalid datasets data' }, { status: 400 });
|
|
}
|
|
|
|
const results = [];
|
|
const errors = [];
|
|
let successCount = 0;
|
|
let skippedCount = 0;
|
|
|
|
for (let i = 0; i < datasets.length; i++) {
|
|
try {
|
|
const dataset = datasets[i];
|
|
|
|
// 安全获取与清洗字段
|
|
const q = typeof dataset?.question === 'string' ? dataset.question.trim() : '';
|
|
const a = typeof dataset?.answer === 'string' ? dataset.answer.trim() : '';
|
|
|
|
// 验证必填字段:缺失则跳过
|
|
if (!q || !a) {
|
|
errors.push(`第 ${i + 1} 条记录缺少必填字段(question/answer),已跳过`);
|
|
skippedCount++;
|
|
continue;
|
|
}
|
|
|
|
// 规范化可选字段
|
|
const chunkName = dataset?.chunkName || 'Imported Data';
|
|
const chunkContent = dataset?.chunkContent || 'Imported from external source';
|
|
const model = dataset?.model || 'imported';
|
|
const questionLabel = dataset?.questionLabel || '';
|
|
const cot = typeof dataset?.cot === 'string' ? dataset.cot : '';
|
|
const confirmed = typeof dataset?.confirmed === 'boolean' ? dataset.confirmed : false;
|
|
const score = typeof dataset?.score === 'number' ? dataset.score : 0;
|
|
// tags: 支持数组/字符串/对象
|
|
let tags = '[]';
|
|
if (Array.isArray(dataset?.tags)) {
|
|
try {
|
|
tags = JSON.stringify(dataset.tags);
|
|
} catch {
|
|
tags = '[]';
|
|
}
|
|
} else if (typeof dataset?.tags === 'string') {
|
|
tags = dataset.tags;
|
|
} else if (dataset?.tags && typeof dataset.tags === 'object') {
|
|
try {
|
|
tags = JSON.stringify(dataset.tags);
|
|
} catch {
|
|
tags = '[]';
|
|
}
|
|
}
|
|
// other: 对象或字符串
|
|
let other = '{}';
|
|
if (typeof dataset?.other === 'string') {
|
|
other = dataset.other;
|
|
} else if (dataset?.other && typeof dataset.other === 'object') {
|
|
try {
|
|
other = JSON.stringify(dataset.other);
|
|
} catch {
|
|
other = '{}';
|
|
}
|
|
}
|
|
const note = typeof dataset?.note === 'string' ? dataset.note : '';
|
|
|
|
// 创建数据集记录
|
|
const newDataset = await createDataset({
|
|
projectId,
|
|
questionId: nanoid(), // 生成唯一的问题ID
|
|
question: q,
|
|
answer: a,
|
|
chunkName,
|
|
chunkContent,
|
|
model,
|
|
questionLabel,
|
|
cot,
|
|
confirmed,
|
|
score,
|
|
tags,
|
|
note,
|
|
other
|
|
});
|
|
|
|
results.push(newDataset);
|
|
successCount++;
|
|
} catch (error) {
|
|
errors.push(`第 ${i + 1} 条记录: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
return NextResponse.json({
|
|
success: successCount,
|
|
total: datasets.length,
|
|
failed: errors.length,
|
|
skipped: skippedCount,
|
|
errors,
|
|
sourceInfo
|
|
});
|
|
} catch (error) {
|
|
console.error('Import datasets error:', error);
|
|
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
}
|
|
}
|