34441-vm/api.php
2025-09-28 00:27:43 +00:00

121 lines
5.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// api.php
header('Content-Type: application/json');
// --- Helper function to get environment variables ---
function get_env($key, $default = null) {
$path = __DIR__ . '/.env';
if (!file_exists($path)) {
return $default;
}
$lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (strpos(trim($line), '#') === 0) {
continue;
}
list($name, $value) = explode('=', $line, 2);
$name = trim($name);
$value = trim($value);
if ($name === $key) {
return $value;
}
}
return $default;
}
// --- Main Logic ---
// 1. Получение API ключа (с дефолтным значением, если .env не найден или пуст)
$apiKey = get_env('GEMINI_API_KEY', 'sk-Hml0aR9tSiqYqQFtjDaqX6RsUm2Vz8');
if (!$apiKey) {
echo json_encode(['reply' => 'Ошибка: API-ключ не найден. Пожалуйста, добавьте его в файл .env или проверьте дефолтное значение.']);
exit;
}
// 2. Обработка входного POST запроса и проверка JSON
$input = json_decode(file_get_contents('php://input'), true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo json_encode(['reply' => 'Ошибка: Некорректный формат JSON в запросе.']);
exit;
}
$userMessage = trim($input['message'] ?? '');
if (empty($userMessage)) {
echo json_encode(['reply' => 'Пожалуйста, введите сообщение.']);
exit;
}
// 3. Загрузка базы знаний
$knowledgeBasePath = __DIR__ . '/db/knowledge_base.txt';
if (!file_exists($knowledgeBasePath)) {
echo json_encode(['reply' => 'Ошибка: База знаний не найдена.']);
exit;
}
$knowledgeBase = file_get_contents($knowledgeBasePath);
// 4. Подготовка подсказки (prompt) для AI
$prompt = "Ты — ИИ-ассистент, специалист по внутренней системе управления складом под названием HUB. Твоя задача — отвечать на вопросы пользователя, основываясь ИСКЛЮЧИТЕЛЬНО на предоставленной базе знаний. Не придумывай ничего от себя. Если ответа в базе знаний нет, вежливо сообщи, что ты можешь отвечать только на вопросы, связанные с системой HUB.\n\nВот база знаний:\n---\n" . $knowledgeBase . "\n---\n\nВопрос пользователя: \"" . $userMessage . "\"";
// 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 для регулировки случайности ответа
];
$options = [
'http' => [
'header' => "Content-type: application/json\r\n",
'method' => 'POST',
'content' => json_encode($data),
'ignore_errors' => true // Для captures ошибок API
]
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$http_response_header = $http_response_header ?? [];
// Извлечение HTTP статуса
$status_line = $http_response_header[0] ?? 'HTTP/1.1 500 Internal Server Error';
preg_match('{HTTP/\S+\s(\d+)}', $status_line, $match);
$status = $match[1] ?? 500;
// Обработка ошибок подключения
if ($response === FALSE) {
$error = 'Не удалось связаться с API. ';
$last_error = error_get_last();
if ($last_error) {
$error .= $last_error['message'];
}
error_log("Gemini API Error: Status $status, Error message: $error");
echo json_encode(['reply' => "Ошибка подключения к сервису ИИ. Статус: $status. Подробности: $error. Проверьте настройки сервера."]);
exit;
}
// Распарсинг и обработка ответа API
$result = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log("Gemini API Error: Неверный JSON в ответе. Ответ: $response");
echo json_encode(['reply' => 'Ошибка: Не удалось разобрать ответ сервиса ИИ как JSON.']);
exit;
}
// Обработка ошибок 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."]);
exit;
}
// Извлечение ответа из структуры (проверка корректной структуры ответа)
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 ключ и базу знаний.']);
}
?>