125 lines
3.1 KiB
JavaScript
125 lines
3.1 KiB
JavaScript
import { NextResponse } from 'next/server';
|
|
import { db } from '@/lib/db';
|
|
import { buildEvalQuestionWhere } from '@/lib/db/evalDatasets';
|
|
|
|
const SMALL_TOTAL_THRESHOLD = 5000;
|
|
const HARD_LIMIT = 50000;
|
|
|
|
function shuffleArray(arr) {
|
|
const result = [...arr];
|
|
for (let i = result.length - 1; i > 0; i -= 1) {
|
|
const j = Math.floor(Math.random() * (i + 1));
|
|
[result[i], result[j]] = [result[j], result[i]];
|
|
}
|
|
return result;
|
|
}
|
|
|
|
export async function POST(request, { params }) {
|
|
try {
|
|
const { projectId } = params;
|
|
const body = await request.json();
|
|
|
|
const {
|
|
questionType = '',
|
|
questionTypes = [],
|
|
keyword = '',
|
|
chunkId = '',
|
|
tags = [],
|
|
limit = 0,
|
|
strategy = 'random'
|
|
} = body || {};
|
|
|
|
const where = buildEvalQuestionWhere(projectId, {
|
|
questionType: questionType || undefined,
|
|
questionTypes: Array.isArray(questionTypes) && questionTypes.length > 0 ? questionTypes : undefined,
|
|
keyword: keyword || undefined,
|
|
chunkId: chunkId || undefined,
|
|
tags: Array.isArray(tags) && tags.length > 0 ? tags : undefined
|
|
});
|
|
|
|
const total = await db.evalDatasets.count({ where });
|
|
|
|
if (total === 0) {
|
|
return NextResponse.json(
|
|
{
|
|
code: 0,
|
|
data: {
|
|
total: 0,
|
|
selectedCount: 0,
|
|
ids: [],
|
|
strategyUsed: strategy
|
|
}
|
|
},
|
|
{ status: 200 }
|
|
);
|
|
}
|
|
|
|
let normalizedLimit = typeof limit === 'number' && limit > 0 ? Math.min(limit, HARD_LIMIT) : HARD_LIMIT;
|
|
|
|
if (normalizedLimit >= total) {
|
|
const items = await db.evalDatasets.findMany({
|
|
where,
|
|
select: { id: true },
|
|
orderBy: { createAt: 'desc' }
|
|
});
|
|
|
|
const ids = items.map(item => item.id);
|
|
|
|
return NextResponse.json(
|
|
{
|
|
code: 0,
|
|
data: {
|
|
total,
|
|
selectedCount: ids.length,
|
|
ids,
|
|
strategyUsed: total > HARD_LIMIT ? 'top' : strategy
|
|
}
|
|
},
|
|
{ status: 200 }
|
|
);
|
|
}
|
|
|
|
let ids = [];
|
|
let strategyUsed = strategy;
|
|
|
|
if (total <= SMALL_TOTAL_THRESHOLD) {
|
|
const items = await db.evalDatasets.findMany({
|
|
where,
|
|
select: { id: true },
|
|
orderBy: { createAt: 'desc' }
|
|
});
|
|
const shuffled = shuffleArray(items);
|
|
ids = shuffled.slice(0, normalizedLimit).map(item => item.id);
|
|
strategyUsed = 'random-small';
|
|
} else {
|
|
const items = await db.evalDatasets.findMany({
|
|
where,
|
|
select: { id: true },
|
|
orderBy: { createAt: 'desc' },
|
|
take: normalizedLimit
|
|
});
|
|
ids = items.map(item => item.id);
|
|
strategyUsed = 'top-latest';
|
|
}
|
|
|
|
return NextResponse.json(
|
|
{
|
|
code: 0,
|
|
data: {
|
|
total,
|
|
selectedCount: ids.length,
|
|
ids,
|
|
strategyUsed
|
|
}
|
|
},
|
|
{ status: 200 }
|
|
);
|
|
} catch (error) {
|
|
console.error('Failed to sample eval datasets:', error);
|
|
return NextResponse.json(
|
|
{ code: 500, error: 'Failed to sample eval datasets', message: error.message },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|