first-update
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import { db } from '@/lib/db/index';
|
||||
import LLMClient from '@/lib/llm/core/index';
|
||||
import { getModelConfigById } from '@/lib/db/model-config';
|
||||
|
||||
/**
|
||||
* Stream answer for a specified model
|
||||
* Query param: model=A or model=B
|
||||
*/
|
||||
export async function GET(request, { params }) {
|
||||
const { projectId, taskId } = params;
|
||||
const { searchParams } = new URL(request.url);
|
||||
const modelType = searchParams.get('model'); // 'A' or 'B'
|
||||
|
||||
try {
|
||||
if (!projectId || !taskId) {
|
||||
return NextResponse.json({ error: 'Missing required parameters' }, { status: 400 });
|
||||
}
|
||||
|
||||
if (!modelType || !['A', 'B'].includes(modelType)) {
|
||||
return NextResponse.json({ error: 'Model type must be specified (A or B)' }, { status: 400 });
|
||||
}
|
||||
|
||||
// Fetch task
|
||||
const task = await db.task.findUnique({
|
||||
where: { id: taskId }
|
||||
});
|
||||
|
||||
if (!task || task.taskType !== 'blind-test') {
|
||||
return NextResponse.json({ error: 'Task not found' }, { status: 404 });
|
||||
}
|
||||
|
||||
// Parse task detail
|
||||
const detail = JSON.parse(task.detail || '{}');
|
||||
const modelInfo = JSON.parse(task.modelInfo || '{}');
|
||||
// Support both evalDatasetIds and questionIds
|
||||
const questionIds = detail.questionIds || detail.evalDatasetIds || [];
|
||||
const currentIndex = detail.currentIndex || 0;
|
||||
|
||||
// Check if task is completed
|
||||
if (questionIds.length === 0 || currentIndex >= questionIds.length) {
|
||||
return NextResponse.json({ completed: true });
|
||||
}
|
||||
|
||||
// Fetch current question
|
||||
const currentQuestionId = questionIds[currentIndex];
|
||||
const currentQuestion = await db.evalDatasets.findUnique({
|
||||
where: { id: currentQuestionId }
|
||||
});
|
||||
|
||||
if (!currentQuestion) {
|
||||
return NextResponse.json({ error: 'Question not found' }, { status: 404 });
|
||||
}
|
||||
|
||||
// Resolve model config based on modelType
|
||||
const modelConfigKey = modelType === 'A' ? 'modelA' : 'modelB';
|
||||
const modelConfig = await getModelConfigById(modelInfo[modelConfigKey].id);
|
||||
|
||||
if (!modelConfig) {
|
||||
return NextResponse.json({ error: 'Model configuration not found' }, { status: 400 });
|
||||
}
|
||||
|
||||
// Prepare messages
|
||||
const messages = [
|
||||
{
|
||||
role: 'system',
|
||||
content: "You are a helpful assistant. Provide detailed and accurate answers to the user's question."
|
||||
},
|
||||
{ role: 'user', content: currentQuestion.question }
|
||||
];
|
||||
|
||||
// Create LLM client
|
||||
const client = new LLMClient({
|
||||
projectId,
|
||||
...modelConfig
|
||||
});
|
||||
|
||||
// Call streaming API and return response directly
|
||||
const response = await client.chatStreamAPI(messages);
|
||||
|
||||
return new Response(response.body, {
|
||||
headers: {
|
||||
'Content-Type': 'text/plain; charset=utf-8',
|
||||
'Cache-Control': 'no-cache',
|
||||
Connection: 'keep-alive'
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(`Model ${modelType} streaming call failed:`, error);
|
||||
return NextResponse.json({ error: error.message }, { status: 500 });
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user