94 lines
3.0 KiB
PHP
94 lines
3.0 KiB
PHP
<?php
|
|
require_once __DIR__ . '/includes/init.php';
|
|
require_once __DIR__ . '/ai/LocalAIApi.php';
|
|
|
|
header('Content-Type: application/json');
|
|
|
|
// Get or create a session ID
|
|
if (isset($_SESSION['chat_session_id'])) {
|
|
$session_id = $_SESSION['chat_session_id'];
|
|
} else {
|
|
$user_id = $_SESSION['user']['id'] ?? null;
|
|
$client_id = $_SESSION['user']['client_id'] ?? null;
|
|
$stmt = db()->prepare("INSERT INTO chat_sessions (user_id, client_id) VALUES (?, ?)");
|
|
$stmt->execute([$user_id, $client_id]);
|
|
$session_id = db()->lastInsertId();
|
|
$_SESSION['chat_session_id'] = $session_id;
|
|
}
|
|
|
|
// Load conversation history
|
|
$stmt = db()->prepare("SELECT sender, message FROM chat_messages WHERE session_id = ? ORDER BY created_at ASC");
|
|
$stmt->execute([$session_id]);
|
|
$history = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
function search_kb($message) {
|
|
$terms = explode(' ', $message);
|
|
$sql = "SELECT * FROM kb_documents WHERE is_active = 1 AND (";
|
|
$conditions = [];
|
|
foreach ($terms as $term) {
|
|
$conditions[] = "title LIKE ? OR content LIKE ?";
|
|
}
|
|
$sql .= implode(' OR ', $conditions) . ") LIMIT 3";
|
|
|
|
$stmt = db()->prepare($sql);
|
|
$params = [];
|
|
foreach ($terms as $term) {
|
|
$params[] = '%' . $term . '%';
|
|
$params[] = '%' . $term . '%';
|
|
}
|
|
$stmt->execute($params);
|
|
return $stmt->fetchAll();
|
|
}
|
|
|
|
$input = json_decode(file_get_contents('php://input'), true);
|
|
$message = $input['message'] ?? '';
|
|
|
|
if (empty($message)) {
|
|
echo json_encode(['reply' => 'Please enter a message.']);
|
|
exit;
|
|
}
|
|
|
|
// Save user message
|
|
$stmt = db()->prepare("INSERT INTO chat_messages (session_id, sender, message) VALUES (?, 'user', ?)");
|
|
$stmt->execute([$session_id, $message]);
|
|
|
|
$kb_documents = search_kb($message);
|
|
|
|
$prompt = "You are a helpful assistant for Extrading, a company that sells construction materials. Please answer in ' . ($lang ?? 'en') . ' language. Answer the user\'s questions based on the provided context. If the answer is not in the context, say you don\'t know.\n\n";
|
|
|
|
if (!empty($kb_documents)) {
|
|
$prompt .= "Context from knowledge base:\n";
|
|
foreach ($kb_documents as $doc) {
|
|
$prompt .= "- Title: " . $doc['title'] . "\n";
|
|
$prompt .= " Content: " . $doc['content'] . "\n";
|
|
}
|
|
$prompt .= "\n";
|
|
}
|
|
|
|
$prompt .= "Conversation history:\n";
|
|
foreach ($history as $msg) {
|
|
$prompt .= $msg['sender'] . ": " . $msg['message'] . "\n";
|
|
}
|
|
|
|
$prompt .= "user: " . $message . "\n";
|
|
$prompt .= "assistant:";
|
|
|
|
$response = LocalAIApi::createResponse([
|
|
'input' => [
|
|
['role' => 'system', 'content' => $prompt]
|
|
]
|
|
]);
|
|
|
|
if (!empty($response['success'])) {
|
|
$reply = LocalAIApi::extractText($response);
|
|
} else {
|
|
$reply = 'Sorry, I am having trouble connecting to the AI service. Please try again later.';
|
|
error_log('AI API Error: ' . ($response['error'] ?? 'Unknown error'));
|
|
}
|
|
|
|
// Save assistant message
|
|
$stmt = db()->prepare("INSERT INTO chat_messages (session_id, sender, message) VALUES (?, 'assistant', ?)");
|
|
$stmt->execute([$session_id, $reply]);
|
|
|
|
echo json_encode(['reply' => $reply]);
|