$context, 'sessionId' => $sessionId, 'timestamp' => date('Y-m-d H:i:s'), 'source' => 'crm-history-request' ]; // Логирование исходящего запроса error_log("Chat History: Sending to n8n - URL: {$n8nHistoryUrl}, Payload: " . json_encode($payload)); // Отправка запроса к n8n $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $n8nHistoryUrl, CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'User-Agent: CRM-History-Request/1.0' ], CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, // Короткий таймаут для истории CURLOPT_SSL_VERIFYPEER => true, CURLOPT_FOLLOWLOCATION => true ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $error = curl_error($ch); curl_close($ch); if ($error) { throw new Exception("cURL error: {$error}"); } if ($httpCode !== 200) { // Если n8n недоступен, возвращаем пустую историю error_log("Chat History: n8n unavailable (HTTP {$httpCode}), returning empty history"); echo json_encode([ 'success' => true, 'history' => [], 'message' => 'История недоступна, начинаем новый диалог', 'source' => 'fallback' ]); exit(); } // Логирование сырого ответа для отладки error_log("Chat History: Raw response from n8n: " . substr($response, 0, 500) . (strlen($response) > 500 ? '...' : '')); // Парсинг ответа от n8n $responseData = json_decode($response, true); if (!$responseData) { error_log("Chat History: JSON decode failed. Response: " . $response); throw new Exception('Invalid JSON response from n8n. Response: ' . substr($response, 0, 200)); } // Логирование ответа error_log("Chat History: Received response - " . json_encode($responseData)); // Обработка истории $history = []; $rawHistory = []; // Проверяем разные форматы ответа от n8n if (isset($responseData['history']) && is_array($responseData['history'])) { $rawHistory = $responseData['history']; } elseif (isset($responseData[0]['data']) && is_array($responseData[0]['data'])) { $rawHistory = $responseData[0]['data']; } elseif (is_array($responseData)) { $rawHistory = $responseData; } // Преобразуем в формат для AI Drawer foreach ($rawHistory as $item) { // Проверяем что это валидное сообщение if (!isset($item['content']) || empty(trim($item['content']))) { continue; // Пропускаем пустые сообщения } // Формируем timestamp в ISO формате для JavaScript $timestamp = null; if (isset($item['created_at']) && !empty($item['created_at'])) { $createdAt = $item['created_at']; // Если created_at уже в ISO формате (содержит 'T'), используем как есть if (strpos($createdAt, 'T') !== false) { // Уже в ISO формате (например, "2025-11-14T06:21:55.207Z"), используем как есть $timestamp = $createdAt; } else { // Если в другом формате, преобразуем в ISO $parsedTime = strtotime($createdAt); if ($parsedTime !== false) { $timestamp = date('c', $parsedTime); // ISO 8601 формат } else { // Если не удалось распарсить, используем текущее время error_log("Chat History: Failed to parse created_at: {$createdAt}, using current time"); $timestamp = date('c'); } } } else { // Если нет created_at, используем текущее время в ISO формате $timestamp = date('c'); // ISO 8601 формат } $message = [ 'type' => isset($item['sender_type']) && $item['sender_type'] === 'user' ? 'user' : 'assistant', 'message' => $item['content'] ?? '', 'timestamp' => $timestamp, 'id' => $item['id'] ?? '', 'dialog_id' => $item['dialog_id'] ?? '' ]; $history[] = $message; } // Если история пустая, добавляем приветственное сообщение if (empty($history)) { $projectName = $context['projectName'] ?? 'проектом'; $history[] = [ 'type' => 'assistant', 'message' => "Привет! Я ваш AI ассистент. Работаем с '{$projectName}'. Чем могу помочь?", 'timestamp' => date('c'), // ISO 8601 формат 'id' => 'welcome-' . time(), 'dialog_id' => 'new-dialog' ]; } // Возврат истории echo json_encode([ 'success' => true, 'history' => $history, 'count' => count($history), 'sessionId' => $sessionId, 'context' => $context, 'timestamp' => date('Y-m-d H:i:s'), 'source' => 'n8n' ]); } catch (Exception $e) { error_log("Chat History Error: " . $e->getMessage()); // В случае ошибки возвращаем пустую историю echo json_encode([ 'success' => false, 'history' => [], 'error' => $e->getMessage(), 'fallback' => true ]); } ?>