36782-vm/chat_send.php
2025-12-28 19:43:55 +00:00

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]);