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