2025-06-24 14:09:12 +08:00

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 配件',
'显示所有配件类型'
]
})
}