diff --git a/admin.php b/admin.php index 70bd43b..4c4acce 100644 --- a/admin.php +++ b/admin.php @@ -16,12 +16,24 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $stmt = db()->prepare("DELETE FROM faqs WHERE id = ?"); $stmt->execute([$id]); } + } elseif (isset($_POST['action']) && $_POST['action'] === 'update_settings') { + $token = $_POST['telegram_token'] ?? ''; + $stmt = db()->prepare("INSERT INTO settings (setting_key, setting_value) VALUES ('telegram_token', ?) ON DUPLICATE KEY UPDATE setting_value = ?"); + $stmt->execute([$token, $token]); } header("Location: admin.php"); exit; } $faqs = db()->query("SELECT * FROM faqs ORDER BY created_at DESC")->fetchAll(); +$messages = db()->query("SELECT * FROM messages ORDER BY created_at DESC LIMIT 50")->fetchAll(); + +$telegramToken = ''; +$stmt = db()->query("SELECT setting_value FROM settings WHERE setting_key = 'telegram_token'"); +$row = $stmt->fetch(); +if ($row) { + $telegramToken = $row['setting_value']; +} ?> @@ -64,6 +76,21 @@ $faqs = db()->query("SELECT * FROM faqs ORDER BY created_at DESC")->fetchAll(); Back to Chat +
+

Telegram Bot Settings

+
+ +
+ + +
+

+ Webhook URL: https:///api/telegram_webhook.php +

+ +
+
+

Add New FAQ

@@ -105,6 +132,34 @@ $faqs = db()->query("SELECT * FROM faqs ORDER BY created_at DESC")->fetchAll(); + +

Recent Chat History (Last 50)

+
+ + + + + + + + + + + + + + + + + + + + + + + +
TimeUser MessageAI Response
No messages yet.
+
diff --git a/api/chat.php b/api/chat.php index c3bc6ba..dbe026c 100644 --- a/api/chat.php +++ b/api/chat.php @@ -1,6 +1,7 @@ query("SELECT keywords, answer FROM faqs")->fetchAll(); +try { + // 1. Fetch Knowledge Base (FAQs) + $stmt = db()->query("SELECT keywords, answer FROM faqs"); + $faqs = $stmt->fetchAll(PDO::FETCH_ASSOC); -$bestMatch = null; -$maxOverlap = 0; - -$userWords = preg_split('/\W+/', strtolower($message), -1, PREG_SPLIT_NO_EMPTY); - -foreach ($faqs as $faq) { - $keywords = preg_split('/[\s,]+/', strtolower($faq['keywords']), -1, PREG_SPLIT_NO_EMPTY); - $overlap = count(array_intersect($userWords, $keywords)); - - if ($overlap > $maxOverlap) { - $maxOverlap = $overlap; - $bestMatch = $faq['answer']; + $knowledgeBase = "Here is the knowledge base for this website:\n\n"; + foreach ($faqs as $faq) { + $knowledgeBase .= "Q: " . $faq['keywords'] . "\nA: " . $faq['answer'] . "\n---\n"; } -} -if ($bestMatch) { - echo json_encode(['reply' => $bestMatch]); -} else { - // Default fallback - echo json_encode(['reply' => "I'm sorry, I don't have an answer for that yet. You can try asking about 'pricing' or 'support'."]); + // 2. Construct Prompt for AI + $systemPrompt = "You are a helpful, friendly AI assistant for this website. " . + "Use the provided Knowledge Base to answer user questions accurately. " . + "If the answer is found in the Knowledge Base, rephrase it naturally. " . + "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. " . + "Keep answers concise and professional.\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' => "I'm having trouble connecting to my brain right now. Please try again later."]); + } + +} catch (Exception $e) { + error_log("Chat Error: " . $e->getMessage()); + echo json_encode(['reply' => "An internal error occurred."]); } diff --git a/api/telegram_webhook.php b/api/telegram_webhook.php new file mode 100644 index 0000000..fa4899c --- /dev/null +++ b/api/telegram_webhook.php @@ -0,0 +1,91 @@ +query("SELECT setting_value FROM settings WHERE setting_key = 'telegram_token'"); +$token = $stmt->fetchColumn(); + +if (!$token) { + error_log("Telegram Error: No bot token found in settings."); + exit; +} + +function sendTelegramMessage($chatId, $text, $token) { + $url = "https://api.telegram.org/bot$token/sendMessage"; + $data = [ + 'chat_id' => $chatId, + 'text' => $text, + 'parse_mode' => 'Markdown' + ]; + + $options = [ + 'http' => [ + 'header' => "Content-type: application/x-www-form-urlencoded\r\n", + 'method' => 'POST', + 'content' => http_build_query($data), + ], + ]; + $context = stream_context_create($options); + return file_get_contents($url, false, $context); +} + +// Process with AI (Similar logic to api/chat.php) +try { + // 1. Fetch Knowledge Base + $stmt = db()->query("SELECT keywords, answer FROM faqs"); + $faqs = $stmt->fetchAll(PDO::FETCH_ASSOC); + + $knowledgeBase = "Here is the knowledge base for this website:\n\n"; + foreach ($faqs as $faq) { + $knowledgeBase .= "Q: " . $faq['keywords'] . "\nA: " . $faq['answer'] . "\n---\n"; + } + + $systemPrompt = "You are a helpful AI assistant integrated with Telegram. " . + "Use the provided Knowledge Base to answer user questions. " . + "Keep answers concise for mobile reading. Use Markdown for formatting.\n\n" . + $knowledgeBase; + + // 2. Call AI + $response = LocalAIApi::createResponse([ + 'model' => 'gpt-4o-mini', + 'input' => [ + ['role' => 'system', 'content' => $systemPrompt], + ['role' => 'user', 'content' => $text], + ] + ]); + + if (!empty($response['success'])) { + $aiReply = LocalAIApi::extractText($response); + + // 3. Save History + try { + $stmt = db()->prepare("INSERT INTO messages (user_message, ai_response) VALUES (?, ?)"); + $stmt->execute(["[Telegram] " . $text, $aiReply]); + } catch (Exception $e) {} + + // 4. Send back to Telegram + sendTelegramMessage($chatId, $aiReply, $token); + } else { + sendTelegramMessage($chatId, "I'm sorry, I encountered an error processing your request.", $token); + } + +} catch (Exception $e) { + error_log("Telegram Webhook Error: " . $e->getMessage()); +}