136 lines
3.3 KiB
JavaScript
136 lines
3.3 KiB
JavaScript
|
|
/**
|
|||
|
|
* 多轮对话数据集管理API
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
import { NextResponse } from 'next/server';
|
|||
|
|
import {
|
|||
|
|
getDatasetConversationsByPagination,
|
|||
|
|
getAllDatasetConversationIds,
|
|||
|
|
createDatasetConversation
|
|||
|
|
} from '@/lib/db/dataset-conversations';
|
|||
|
|
import { generateMultiTurnConversation } from '@/lib/services/multi-turn/index';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取多轮对话数据集列表(支持分页和筛选)
|
|||
|
|
*/
|
|||
|
|
export async function GET(request, { params }) {
|
|||
|
|
try {
|
|||
|
|
const { projectId } = params;
|
|||
|
|
const { searchParams } = new URL(request.url);
|
|||
|
|
|
|||
|
|
const getAllIds = searchParams.get('getAllIds') === 'true'; // 新增:获取所有对话ID的标志
|
|||
|
|
|
|||
|
|
// 筛选条件
|
|||
|
|
const filters = {
|
|||
|
|
keyword: searchParams.get('keyword'),
|
|||
|
|
roleA: searchParams.get('roleA'),
|
|||
|
|
roleB: searchParams.get('roleB'),
|
|||
|
|
scenario: searchParams.get('scenario'),
|
|||
|
|
scoreMin: searchParams.get('scoreMin'),
|
|||
|
|
scoreMax: searchParams.get('scoreMax'),
|
|||
|
|
confirmed: searchParams.get('confirmed')
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 清除空值
|
|||
|
|
Object.keys(filters).forEach(key => {
|
|||
|
|
if (!filters[key]) delete filters[key];
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 如果请求获取所有ID
|
|||
|
|
if (getAllIds) {
|
|||
|
|
const allConversationIds = await getAllDatasetConversationIds(projectId, filters);
|
|||
|
|
return NextResponse.json({ allConversationIds });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 正常分页查询
|
|||
|
|
const page = parseInt(searchParams.get('page') || '1');
|
|||
|
|
const pageSize = parseInt(searchParams.get('pageSize') || '20');
|
|||
|
|
|
|||
|
|
const result = await getDatasetConversationsByPagination(projectId, page, pageSize, filters);
|
|||
|
|
|
|||
|
|
return NextResponse.json({
|
|||
|
|
success: true,
|
|||
|
|
...result
|
|||
|
|
});
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('获取多轮对话数据集失败:', error);
|
|||
|
|
return NextResponse.json(
|
|||
|
|
{
|
|||
|
|
success: false,
|
|||
|
|
message: error.message
|
|||
|
|
},
|
|||
|
|
{ status: 500 }
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 创建多轮对话数据集
|
|||
|
|
*/
|
|||
|
|
export async function POST(request, { params }) {
|
|||
|
|
try {
|
|||
|
|
const { projectId } = params;
|
|||
|
|
const body = await request.json();
|
|||
|
|
|
|||
|
|
const { questionId, systemPrompt, scenario, rounds, roleA, roleB, model, language = '中文' } = body;
|
|||
|
|
|
|||
|
|
if (!questionId) {
|
|||
|
|
return NextResponse.json(
|
|||
|
|
{
|
|||
|
|
success: false,
|
|||
|
|
message: '问题ID不能为空'
|
|||
|
|
},
|
|||
|
|
{ status: 400 }
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!model || !model.modelId) {
|
|||
|
|
return NextResponse.json(
|
|||
|
|
{
|
|||
|
|
success: false,
|
|||
|
|
message: '模型配置不能为空'
|
|||
|
|
},
|
|||
|
|
{ status: 400 }
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 构建配置
|
|||
|
|
const config = {
|
|||
|
|
systemPrompt: systemPrompt || '',
|
|||
|
|
scenario: scenario || '',
|
|||
|
|
rounds: rounds || 3,
|
|||
|
|
roleA: roleA || '用户',
|
|||
|
|
roleB: roleB || '助手',
|
|||
|
|
model,
|
|||
|
|
language
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 生成多轮对话
|
|||
|
|
const result = await generateMultiTurnConversation(projectId, questionId, config);
|
|||
|
|
|
|||
|
|
if (!result.success) {
|
|||
|
|
return NextResponse.json(
|
|||
|
|
{
|
|||
|
|
success: false,
|
|||
|
|
message: result.error
|
|||
|
|
},
|
|||
|
|
{ status: 500 }
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return NextResponse.json({
|
|||
|
|
success: true,
|
|||
|
|
data: result.data
|
|||
|
|
});
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('创建多轮对话数据集失败:', error);
|
|||
|
|
return NextResponse.json(
|
|||
|
|
{
|
|||
|
|
success: false,
|
|||
|
|
message: error.message
|
|||
|
|
},
|
|||
|
|
{ status: 500 }
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|