164 lines
5.2 KiB
TypeScript
164 lines
5.2 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import { z } from 'zod'
|
|
import { searchBibleHybrid, BibleVerse } from '@/lib/vector-search'
|
|
|
|
export const runtime = 'nodejs'
|
|
|
|
const chatRequestSchema = z.object({
|
|
message: z.string().min(1),
|
|
locale: z.string().optional().default('ro'),
|
|
history: z.array(z.object({
|
|
id: z.string(),
|
|
role: z.enum(['user', 'assistant']),
|
|
content: z.string(),
|
|
timestamp: z.string()
|
|
})).optional().default([])
|
|
})
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json()
|
|
const { message, locale, history } = chatRequestSchema.parse(body)
|
|
|
|
// Generate response using Azure OpenAI with vector search
|
|
const response = await generateBiblicalResponse(message, locale, history)
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
response
|
|
})
|
|
} catch (error) {
|
|
console.error('Error in chat API:', error)
|
|
|
|
if (error instanceof z.ZodError) {
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: 'Invalid request format',
|
|
details: error.errors
|
|
},
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: 'Failed to process chat message'
|
|
},
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|
|
|
|
async function generateBiblicalResponse(message: string, locale: string, history: any[]): Promise<string> {
|
|
try {
|
|
// Search for relevant Bible verses using vector search with language filtering
|
|
const relevantVerses = await searchBibleHybrid(message, locale, 5)
|
|
|
|
// Create context from relevant verses
|
|
const versesContext = relevantVerses
|
|
.map(verse => `${verse.ref}: "${verse.text_raw}"`)
|
|
.join('\n\n')
|
|
|
|
// Create conversation history for context
|
|
const conversationHistory = history
|
|
.slice(-3) // Last 3 messages for context
|
|
.map(msg => `${msg.role}: ${msg.content}`)
|
|
.join('\n')
|
|
|
|
// Create language-specific system prompts
|
|
const systemPrompts = {
|
|
ro: `Ești un asistent AI pentru întrebări biblice în limba română. Răspunde pe baza Scripturii, fiind respectuos și înțelept.
|
|
|
|
Instrucțiuni:
|
|
- Folosește versurile biblice relevante pentru a răspunde la întrebare
|
|
- Citează întotdeauna referințele biblice (ex: Ioan 3:16)
|
|
- Răspunde în română
|
|
- Fii empatic și încurajator
|
|
- Dacă nu ești sigur, încurajează studiul personal și rugăciunea
|
|
|
|
Versuri relevante pentru această întrebare:
|
|
${versesContext}
|
|
|
|
Conversația anterioară:
|
|
${conversationHistory}
|
|
|
|
Întrebarea curentă: ${message}`,
|
|
|
|
en: `You are an AI assistant for biblical questions in English. Answer based on Scripture, being respectful and wise.
|
|
|
|
Instructions:
|
|
- Use the relevant Bible verses to answer the question
|
|
- Always cite biblical references (e.g., John 3:16)
|
|
- Respond in English
|
|
- Be empathetic and encouraging
|
|
- If unsure, encourage personal study and prayer
|
|
|
|
Relevant verses for this question:
|
|
${versesContext}
|
|
|
|
Previous conversation:
|
|
${conversationHistory}
|
|
|
|
Current question: ${message}`
|
|
}
|
|
|
|
const systemPrompt = systemPrompts[locale as keyof typeof systemPrompts] || systemPrompts.en
|
|
|
|
// Call Azure OpenAI
|
|
const response = await fetch(
|
|
`${process.env.AZURE_OPENAI_ENDPOINT}/openai/deployments/${process.env.AZURE_OPENAI_DEPLOYMENT}/chat/completions?api-version=${process.env.AZURE_OPENAI_API_VERSION}`,
|
|
{
|
|
method: 'POST',
|
|
headers: {
|
|
'api-key': process.env.AZURE_OPENAI_KEY!,
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
messages: [
|
|
{
|
|
role: 'system',
|
|
content: systemPrompt
|
|
},
|
|
{
|
|
role: 'user',
|
|
content: message
|
|
}
|
|
],
|
|
max_tokens: 800,
|
|
temperature: 0.7,
|
|
top_p: 0.9
|
|
}),
|
|
}
|
|
)
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`Azure OpenAI API error: ${response.status}`)
|
|
}
|
|
|
|
const data = await response.json()
|
|
return data.choices[0].message.content
|
|
|
|
} catch (error) {
|
|
console.error('Error calling Azure OpenAI:', error)
|
|
|
|
// Language-specific fallback responses
|
|
const fallbackResponses = {
|
|
ro: `Îmi pare rău, dar întâmpin o problemă tehnică în acest moment. Te încurajez să cercetezi acest subiect în Scripturi și să te rogi pentru înțelegere.
|
|
|
|
"Cercetați Scripturile, pentru că socotiți că în ele aveți viața veșnică, și tocmai ele mărturisesc despre Mine" (Ioan 5:39).
|
|
|
|
"Dacă vreunul dintre voi duce lipsă de înțelepciune, să ceară de la Dumnezeu, care dă tuturor cu dărnicie și fără mustrare, și i se va da" (Iacov 1:5).`,
|
|
|
|
en: `Sorry, I'm experiencing a technical issue at the moment. I encourage you to research this topic in Scripture and pray for understanding.
|
|
|
|
"You study the Scriptures diligently because you think that in them you have eternal life. These are the very Scriptures that testify about me" (John 5:39).
|
|
|
|
"If any of you lacks wisdom, you should ask God, who gives generously to all without finding fault, and it will be given to you" (James 1:5).`
|
|
}
|
|
|
|
return fallbackResponses[locale as keyof typeof fallbackResponses] || fallbackResponses.en
|
|
}
|
|
}
|