89 lines
2.8 KiB
JavaScript
89 lines
2.8 KiB
JavaScript
|
|
import { NextResponse } from 'next/server';
|
||
|
|
import { splitProjectFile, getProjectChunks } from '@/lib/file/text-splitter';
|
||
|
|
import { getProject, updateProject } from '@/lib/db/projects';
|
||
|
|
import { getTags } from '@/lib/db/tags';
|
||
|
|
import { handleDomainTree } from '@/lib/util/domain-tree';
|
||
|
|
|
||
|
|
// 处理文本分割请求
|
||
|
|
export async function POST(request, { params }) {
|
||
|
|
try {
|
||
|
|
const { projectId } = params;
|
||
|
|
|
||
|
|
// 获取请求体
|
||
|
|
const { fileNames, model, language, domainTreeAction = 'rebuild' } = await request.json();
|
||
|
|
|
||
|
|
if (!model) {
|
||
|
|
return NextResponse.json({ error: 'Please Select Model' }, { status: 400 });
|
||
|
|
}
|
||
|
|
|
||
|
|
const project = await getProject(projectId);
|
||
|
|
|
||
|
|
let result = {
|
||
|
|
totalChunks: 0,
|
||
|
|
chunks: [],
|
||
|
|
toc: ''
|
||
|
|
};
|
||
|
|
for (let i = 0; i < fileNames.length; i++) {
|
||
|
|
const fileName = fileNames[i];
|
||
|
|
// 分割文本
|
||
|
|
const { toc, chunks, totalChunks } = await splitProjectFile(projectId, fileName);
|
||
|
|
result.toc += toc;
|
||
|
|
result.chunks.push(...chunks);
|
||
|
|
result.totalChunks += totalChunks;
|
||
|
|
console.log(projectId, fileName, `Text split completed, ${domainTreeAction} domain tree`);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 调用领域树处理模块
|
||
|
|
const tags = await handleDomainTree({
|
||
|
|
projectId,
|
||
|
|
action: domainTreeAction,
|
||
|
|
newToc: result.toc,
|
||
|
|
model,
|
||
|
|
language,
|
||
|
|
fileNames,
|
||
|
|
project
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!tags && domainTreeAction !== 'keep') {
|
||
|
|
await updateProject(projectId, { ...project });
|
||
|
|
return NextResponse.json(
|
||
|
|
{ error: 'AI analysis failed, please check model configuration, delete file and retry!' },
|
||
|
|
{ status: 400 }
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
return NextResponse.json({ ...result, tags });
|
||
|
|
} catch (error) {
|
||
|
|
console.error('Text split error:', String(error));
|
||
|
|
return NextResponse.json({ error: error.message || 'Text split failed' }, { status: 500 });
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 获取项目中的所有文本块
|
||
|
|
export async function GET(request, { params }) {
|
||
|
|
try {
|
||
|
|
const { projectId } = params;
|
||
|
|
const { searchParams } = new URL(request.url);
|
||
|
|
const filter = searchParams.get('filter');
|
||
|
|
// 验证项目ID
|
||
|
|
if (!projectId) {
|
||
|
|
return NextResponse.json({ error: 'The project ID cannot be empty' }, { status: 400 });
|
||
|
|
}
|
||
|
|
|
||
|
|
// 获取文本块详细信息
|
||
|
|
const result = await getProjectChunks(projectId, filter);
|
||
|
|
|
||
|
|
const tags = await getTags(projectId);
|
||
|
|
|
||
|
|
// 返回详细的文本块信息和文件结果(单个文件)
|
||
|
|
return NextResponse.json({
|
||
|
|
chunks: result.chunks,
|
||
|
|
...result.fileResult, // 单个文件结果,而不是数组
|
||
|
|
tags
|
||
|
|
});
|
||
|
|
} catch (error) {
|
||
|
|
console.error('Failed to get text chunks:', String(error));
|
||
|
|
return NextResponse.json({ error: error.message || 'Failed to get text chunks' }, { status: 500 });
|
||
|
|
}
|
||
|
|
}
|