"Je n'ai pas bien compris. Pouvez-vous répéter ?"]); exit; } try { // 1. Fetch Knowledge Base (FAQs) $stmt = db()->query("SELECT keywords, answer FROM faqs"); $faqs = $stmt->fetchAll(PDO::FETCH_ASSOC); $knowledgeBase = "Voici la base de connaissances pour ce site Web :\n\n"; foreach ($faqs as $faq) { $knowledgeBase .= "Q: " . $faq['keywords'] . "\nA: " . $faq['answer'] . "\n---\n"; } // 2. Construct Prompt for AI $systemPrompt = "Vous êtes un assistant IA utile et amical pour ce site Web. " . "Utilisez la base de connaissances fournie pour répondre avec précision aux questions des utilisateurs. " . "Si la réponse se trouve dans la base de connaissances, reformulez-la naturellement. " . "If the answer is NOT in the Knowledge Base, use your general knowledge to help, " . "but politely mention that you don't have specific information about that if it seems like a site-specific question. " . "Gardez les réponses concises et professionnelles. RÉPONDEZ TOUJOURS EN FRANÇAIS.\n\n" . $knowledgeBase; // 3. Call AI API $response = LocalAIApi::createResponse([ 'model' => 'gpt-4o-mini', 'input' => [ ['role' => 'system', 'content' => $systemPrompt], ['role' => 'user', 'content' => $message], ] ]); if (!empty($response['success'])) { $aiReply = LocalAIApi::extractText($response); // 4. Save to Database try { $stmt = db()->prepare("INSERT INTO messages (user_message, ai_response) VALUES (?, ?)"); $stmt->execute([$message, $aiReply]); } catch (Exception $e) { error_log("DB Save Error: " . $e->getMessage()); // Continue even if save fails, so the user still gets a reply } echo json_encode(['reply' => $aiReply]); } else { // Fallback if AI fails error_log("AI Error: " . ($response['error'] ?? 'Unknown')); echo json_encode(['reply' => "J'ai du mal à me connecter à mon cerveau pour le moment. Veuillez réessayer plus tard."]); } } catch (Exception $e) { error_log("Chat Error: " . $e->getMessage()); echo json_encode(['reply' => "Une erreur interne est survenue."]); }