first-update
This commit is contained in:
@@ -0,0 +1,183 @@
|
||||
/**
|
||||
* 单个多轮对话数据集操作API
|
||||
*/
|
||||
|
||||
import { NextResponse } from 'next/server';
|
||||
import {
|
||||
getDatasetConversationById,
|
||||
updateDatasetConversation,
|
||||
deleteDatasetConversation,
|
||||
getConversationNavigationItems
|
||||
} from '@/lib/db/dataset-conversations';
|
||||
|
||||
/**
|
||||
* 获取单个多轮对话数据集详情
|
||||
*/
|
||||
export async function GET(request, { params }) {
|
||||
try {
|
||||
const { projectId, conversationId } = params;
|
||||
const { searchParams } = new URL(request.url);
|
||||
const operateType = searchParams.get('operateType');
|
||||
|
||||
// 如果是导航操作,返回导航项
|
||||
if (operateType !== null) {
|
||||
const data = await getConversationNavigationItems(projectId, conversationId, operateType);
|
||||
return NextResponse.json(data);
|
||||
}
|
||||
|
||||
const conversation = await getDatasetConversationById(conversationId);
|
||||
|
||||
if (!conversation) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: '对话数据集不存在'
|
||||
},
|
||||
{ status: 404 }
|
||||
);
|
||||
}
|
||||
|
||||
if (conversation.projectId !== projectId) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: '对话数据集不属于指定项目'
|
||||
},
|
||||
{ status: 403 }
|
||||
);
|
||||
}
|
||||
|
||||
return NextResponse.json(conversation);
|
||||
} catch (error) {
|
||||
console.error('获取多轮对话数据集详情失败:', error);
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: error.message
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新多轮对话数据集
|
||||
*/
|
||||
export async function PUT(request, { params }) {
|
||||
try {
|
||||
const { projectId, conversationId } = params;
|
||||
const body = await request.json();
|
||||
|
||||
// 验证对话数据集是否存在且属于项目
|
||||
const conversation = await getDatasetConversationById(conversationId);
|
||||
|
||||
if (!conversation) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: '对话数据集不存在'
|
||||
},
|
||||
{ status: 404 }
|
||||
);
|
||||
}
|
||||
|
||||
if (conversation.projectId !== projectId) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: '对话数据集不属于指定项目'
|
||||
},
|
||||
{ status: 403 }
|
||||
);
|
||||
}
|
||||
|
||||
// 只允许更新特定字段
|
||||
const allowedFields = ['score', 'tags', 'note', 'confirmed', 'aiEvaluation', 'messages'];
|
||||
const updateData = {};
|
||||
|
||||
allowedFields.forEach(field => {
|
||||
if (body.hasOwnProperty(field)) {
|
||||
if (field === 'messages') {
|
||||
// 将messages数组转换为rawMessages字符串存储
|
||||
updateData['rawMessages'] = JSON.stringify(body[field]);
|
||||
} else {
|
||||
updateData[field] = body[field];
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (Object.keys(updateData).length === 0) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: '没有有效的更新字段'
|
||||
},
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
const updatedConversation = await updateDatasetConversation(conversationId, updateData);
|
||||
|
||||
return NextResponse.json({
|
||||
success: true,
|
||||
data: updatedConversation
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('更新多轮对话数据集失败:', error);
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: error.message
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除多轮对话数据集
|
||||
*/
|
||||
export async function DELETE(request, { params }) {
|
||||
try {
|
||||
const { projectId, conversationId } = params;
|
||||
|
||||
// 验证对话数据集是否存在且属于项目
|
||||
const conversation = await getDatasetConversationById(conversationId);
|
||||
|
||||
if (!conversation) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: '对话数据集不存在'
|
||||
},
|
||||
{ status: 404 }
|
||||
);
|
||||
}
|
||||
|
||||
if (conversation.projectId !== projectId) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: '对话数据集不属于指定项目'
|
||||
},
|
||||
{ status: 403 }
|
||||
);
|
||||
}
|
||||
|
||||
await deleteDatasetConversation(conversationId);
|
||||
|
||||
return NextResponse.json({
|
||||
success: true,
|
||||
message: '删除成功'
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('删除多轮对话数据集失败:', error);
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: error.message
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
/**
|
||||
* 多轮对话数据集导出API
|
||||
* 直接导出原始的 ShareGPT 格式数据集
|
||||
*/
|
||||
|
||||
import { NextResponse } from 'next/server';
|
||||
import { getAllDatasetConversations } from '@/lib/db/dataset-conversations';
|
||||
|
||||
/**
|
||||
* 导出多轮对话数据集
|
||||
*/
|
||||
export async function GET(request, { params }) {
|
||||
try {
|
||||
const { projectId } = params;
|
||||
const { searchParams } = new URL(request.url);
|
||||
|
||||
// 筛选条件
|
||||
const filters = {
|
||||
confirmed: searchParams.get('confirmed')
|
||||
};
|
||||
|
||||
// 清除空值
|
||||
Object.keys(filters).forEach(key => {
|
||||
if (!filters[key]) delete filters[key];
|
||||
});
|
||||
|
||||
// 获取所有对话数据集
|
||||
const conversations = await getAllDatasetConversations(projectId, filters);
|
||||
|
||||
if (conversations.length === 0) {
|
||||
return NextResponse.json([]);
|
||||
}
|
||||
|
||||
// 转换为 ShareGPT 格式数组
|
||||
const shareGptData = [];
|
||||
|
||||
for (const conversation of conversations) {
|
||||
try {
|
||||
// 解析 rawMessages
|
||||
const messages = JSON.parse(conversation.rawMessages || '[]');
|
||||
|
||||
if (messages.length > 0) {
|
||||
// 构建 ShareGPT 格式对象
|
||||
const shareGptItem = {
|
||||
messages: messages
|
||||
};
|
||||
|
||||
shareGptData.push(shareGptItem);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`解析对话消息失败 ${conversation.id}:`, error);
|
||||
// 跳过解析失败的对话,继续处理其他对话
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return NextResponse.json(shareGptData);
|
||||
} catch (error) {
|
||||
console.error('导出多轮对话数据集失败:', error);
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: error.message
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
/**
|
||||
* 多轮对话数据集管理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 }
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import { getAllDatasetConversations } from '@/lib/db/dataset-conversations';
|
||||
|
||||
/**
|
||||
* 获取项目中多轮对话数据集的所有标签
|
||||
*/
|
||||
export async function GET(request, { params }) {
|
||||
try {
|
||||
const { projectId } = params;
|
||||
|
||||
if (!projectId) {
|
||||
return NextResponse.json({ error: '项目ID不能为空' }, { status: 400 });
|
||||
}
|
||||
|
||||
// 获取项目所有对话数据集
|
||||
const conversations = await getAllDatasetConversations(projectId);
|
||||
|
||||
// 提取所有标签
|
||||
const allTags = new Set();
|
||||
|
||||
conversations.forEach(conversation => {
|
||||
if (conversation.tags && typeof conversation.tags === 'string') {
|
||||
const tags = conversation.tags.split(/\s+/).filter(tag => tag.trim().length > 0);
|
||||
tags.forEach(tag => allTags.add(tag.trim()));
|
||||
}
|
||||
});
|
||||
|
||||
return NextResponse.json({
|
||||
success: true,
|
||||
tags: Array.from(allTags).sort()
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('获取对话标签失败:', error);
|
||||
return NextResponse.json(
|
||||
{
|
||||
success: false,
|
||||
message: error.message
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user