- Add pgvector support with bible_passages table for vector search - Create Python ingestion script for Azure OpenAI embed-3 embeddings - Implement hybrid search combining vector similarity and full-text search - Update AI chat to use vector search with Azure OpenAI gpt-4o - Add floating chat component with Material UI design - Import complete Romanian Bible (FIDELA) with 30K+ verses - Add vector search library for semantic Bible search - Create multi-language implementation plan for future expansion 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
130 lines
3.9 KiB
TypeScript
130 lines
3.9 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import { z } from 'zod'
|
|
import { searchBibleHybrid, BibleVerse } from '@/lib/vector-search'
|
|
|
|
const chatRequestSchema = z.object({
|
|
message: z.string().min(1),
|
|
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, history } = chatRequestSchema.parse(body)
|
|
|
|
// For now, return a mock response
|
|
// TODO: Integrate with Azure OpenAI when ready
|
|
const response = await generateBiblicalResponse(message, 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, history: any[]): Promise<string> {
|
|
try {
|
|
// Search for relevant Bible verses using vector search
|
|
const relevantVerses = await searchBibleHybrid(message, 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')
|
|
|
|
// Construct prompt for Azure OpenAI
|
|
const systemPrompt = `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}`
|
|
|
|
// 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)
|
|
|
|
// Fallback to simple response if AI fails
|
|
return `Î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).`
|
|
}
|
|
} |