diff --git a/api.php b/api.php index 2797686..b1acb39 100644 --- a/api.php +++ b/api.php @@ -6,32 +6,32 @@ header('Content-Type: application/json'); function get_env($key, $default = null) { $path = __DIR__ . '/.env'; if (!file_exists($path)) { - return $default; + return $default; // Если .env не найден, возвращаем дефолтное значение } $lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach ($lines as $line) { if (strpos(trim($line), '#') === 0) { - continue; + continue; // Пропускаем строки с комментариями } list($name, $value) = explode('=', $line, 2); $name = trim($name); $value = trim($value); if ($name === $key) { - return $value; + return $value; // Нашли ключ в .env } } - return $default; + return $default; // Ключ не найден в .env, возвращаем дефолт } // --- Main Logic --- -// 1. Получение API ключа (с дефолтным значением, если .env не найден или пуст) +// 1. Получаем API-ключ (с дефолтным значением, если .env отсутствует или ключ не указан) $apiKey = get_env('GEMINI_API_KEY', 'sk-Hml0aR9tSiqYqQFtjDaqX6RsUm2Vz8'); -if (!$apiKey) { - echo json_encode(['reply' => 'Ошибка: API-ключ не найден. Пожалуйста, добавьте его в файл .env или проверьте дефолтное значение.']); +if (empty($apiKey)) { // Проверяем, что ключ не пустой + echo json_encode(['reply' => 'Ошибка: API-ключ не найден. Проверьте дефолтное значение в коде или добавьте ключ в .env.']); exit; } -// 2. Обработка входного POST запроса и проверка JSON +// 2. Получаем и валидируем JSON-запрос пользователя $input = json_decode(file_get_contents('php://input'), true); if (json_last_error() !== JSON_ERROR_NONE) { echo json_encode(['reply' => 'Ошибка: Некорректный формат JSON в запросе.']); @@ -44,31 +44,31 @@ if (empty($userMessage)) { exit; } -// 3. Загрузка базы знаний +// 3. Загружаем базу знаний $knowledgeBasePath = __DIR__ . '/db/knowledge_base.txt'; if (!file_exists($knowledgeBasePath)) { - echo json_encode(['reply' => 'Ошибка: База знаний не найдена.']); + echo json_encode(['reply' => 'Ошибка: База знаний не найдена. Создайте файл db/knowledge_base.txt.']); exit; } $knowledgeBase = file_get_contents($knowledgeBasePath); -// 4. Подготовка подсказки (prompt) для AI +// 4. Подготавливаем подсказку (prompt) для AI $prompt = "Ты — ИИ-ассистент, специалист по внутренней системе управления складом под названием HUB. Твоя задача — отвечать на вопросы пользователя, основываясь ИСКЛЮЧИТЕЛЬНО на предоставленной базе знаний. Не придумывай ничего от себя. Если ответа в базе знаний нет, вежливо сообщи, что ты можешь отвечать только на вопросы, связанные с системой HUB.\n\nВот база знаний:\n---\n" . $knowledgeBase . "\n---\n\nВопрос пользователя: \"" . $userMessage . "\""; -// 5. Вызов Gemini API с корректной структурой запроса +// 5. Вызываем Gemini API с корректной структурой запроса $url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=' . $apiKey; $data = [ - 'model' => 'gemini-pro', - 'prompt' => ['text' => $prompt], - 'temperature' => 0.7 // Можно настроить в диапазоне 0.0-1.0 для регулировки случайности ответа + 'model' => 'gemini-pro', // Указываем модель + 'prompt' => ['text' => $prompt], // Ключевой часть prompt + 'temperature' => 0.7 // Регулирует случайность ответа (0.0 — детерминированный, 1.0 — случайный) ]; $options = [ 'http' => [ - 'header' => "Content-type: application/json\r\n", + 'header' => "Content-Type: application/json\r\n", 'method' => 'POST', 'content' => json_encode($data), - 'ignore_errors' => true // Для captures ошибок API + 'ignore_errors' => true // Для извлечения ошибок API ] ]; @@ -76,46 +76,46 @@ $context = stream_context_create($options); $response = file_get_contents($url, false, $context); $http_response_header = $http_response_header ?? []; -// Извлечение HTTP статуса +// Извлекаем HTTP-статус из заголовков ответа $status_line = $http_response_header[0] ?? 'HTTP/1.1 500 Internal Server Error'; -preg_match('{HTTP/\S+\s(\d+)}', $status_line, $match); +preg_match('/HTTP\/\S+\s(\d+)/', $status_line, $match); $status = $match[1] ?? 500; -// Обработка ошибок подключения +// Обрабатываем ошибки подключения (например, отсутствие интернета) if ($response === FALSE) { - $error = 'Не удалось связаться с API. '; + $error_msg = 'Не удалось связаться с API. '; $last_error = error_get_last(); if ($last_error) { - $error .= $last_error['message']; + $error_msg .= $last_error['message']; } - error_log("Gemini API Error: Status $status, Error message: $error"); - echo json_encode(['reply' => "Ошибка подключения к сервису ИИ. Статус: $status. Подробности: $error. Проверьте настройки сервера."]); + error_log("Gemini API Error: Status $status, Error: $error_msg"); + echo json_encode(['reply' => "Ошибка подключения к ИИ-сервису. Статус: $status. Подробности: $error_msg. Проверьте настройки сервера."]); exit; } -// Распарсинг и обработка ответа API +// Распарсываем ответ API и проверяем на JSON-ошибки $result = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { error_log("Gemini API Error: Неверный JSON в ответе. Ответ: $response"); - echo json_encode(['reply' => 'Ошибка: Не удалось разобрать ответ сервиса ИИ как JSON.']); + echo json_encode(['reply' => 'Ошибка: Не удалось разобрать ответ ИИ-сервиса как JSON.']); exit; } -// Обработка ошибок API (например, неверный ключ) +// Обрабатываем ошибки API (например, некорректный ключ) if (isset($result['error'])) { - $errorCode = $result['error']['code'] ?? 'Неопределён'; - $errorMessage = $result['error']['message'] ?? 'Неизвестная ошибка'; - error_log("Gemini API Error: Код $errorCode, Сообщение: $errorMessage"); - echo json_encode(['reply' => "Ошибка API ИИ. Код: $errorCode. Сообщение: $errorMessage."]); + $error_code = $result['error']['code'] ?? 'Неопределен'; + $error_message = $result['error']['message'] ?? 'Неизвестная ошибка'; + error_log("Gemini API Error: Код $error_code, Сообщение: $error_message"); + echo json_encode(['reply' => "Ошибка ИИ-сервиса. Код: $error_code. Сообщение: $error_message."]); exit; } -// Извлечение ответа из структуры (проверка корректной структуры ответа) +// Извлекаем и выводим ответ AI if (isset($result['candidates'][0]['content']['text'])) { $reply = trim($result['candidates'][0]['content']['text']); echo json_encode(['reply' => $reply]); } else { - error_log("Gemini API - Непредвиденная структура ответа: " . print_r($result, true)); - echo json_encode(['reply' => 'Получен неожиданный ответ от сервиса ИИ. Проверьте API ключ и базу знаний.']); + error_log("Gemini API: Непредвиденная структура ответа. Ответ: " . print_r($result, true)); + echo json_encode(['reply' => 'ИИ-сервис вернул неожиданный ответ. Проверьте API-ключ и базу знаний.']); } ?> \ No newline at end of file