Edit api.php via Editor

This commit is contained in:
admin 2025-09-28 00:31:42 +00:00
parent 3e0da2dc32
commit 393e45ccb0

68
api.php
View File

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