81 lines
2.4 KiB
TypeScript
81 lines
2.4 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import { AIClient } from '@/lib/ai-assistant'
|
|
import { getUser } from '@/lib/auth'
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
// 验证用户身份
|
|
const user = await getUser(request)
|
|
if (!user) {
|
|
return NextResponse.json(
|
|
{ message: '请先登录' },
|
|
{ status: 401 }
|
|
)
|
|
}
|
|
|
|
const body = await request.json()
|
|
const { prompt, conversationId } = body
|
|
|
|
if (!prompt || !prompt.trim()) {
|
|
return NextResponse.json(
|
|
{ message: '请输入您的问题' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
|
|
let client = new AIClient() // 创建流式响应
|
|
const encoder = new TextEncoder()
|
|
let newConversationId: string | null = null
|
|
const stream = new ReadableStream({
|
|
async start(controller) {
|
|
try {
|
|
for await (const segment of client.processQuery(prompt, user.id, conversationId)) {
|
|
// 检查是否是新对话ID
|
|
if (segment.startsWith('conversation_id:')) {
|
|
newConversationId = segment.substring('conversation_id:'.length)
|
|
controller.enqueue(encoder.encode(`data: ${JSON.stringify({ conversationId: newConversationId })}\n\n`))
|
|
continue
|
|
}
|
|
controller.enqueue(encoder.encode(`data: ${JSON.stringify({ content: segment })}\n\n`))
|
|
}
|
|
controller.enqueue(encoder.encode('data: [DONE]\n\n'))
|
|
controller.close()
|
|
} catch (error) {
|
|
console.error('AI 处理错误:', error)
|
|
controller.enqueue(encoder.encode(`data: ${JSON.stringify({
|
|
error: error instanceof Error ? error.message : '处理请求时发生错误'
|
|
})}\n\n`))
|
|
controller.close()
|
|
}
|
|
}
|
|
})
|
|
|
|
return new Response(stream, {
|
|
headers: {
|
|
'Content-Type': 'text/event-stream',
|
|
'Cache-Control': 'no-cache',
|
|
'Connection': 'keep-alive',
|
|
},
|
|
})
|
|
|
|
} catch (error) {
|
|
console.error('AI 查询错误:', error)
|
|
return NextResponse.json(
|
|
{ message: 'AI 服务暂时不可用,请稍后再试' },
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|
|
|
|
export async function GET() {
|
|
return NextResponse.json({
|
|
message: '欢迎使用 PC DIY 商店 AI 助手!',
|
|
examples: [
|
|
'推荐一些价格在 1000-2000 元的显卡',
|
|
'查找华硕品牌的主板',
|
|
'什么是最新的 CPU 配件',
|
|
'显示所有配件类型'
|
|
]
|
|
})
|
|
}
|