- Added comprehensive AI Assistant system (aiassist/ directory): * Vector search and embedding capabilities * Typebot proxy integration * Elastic search functionality * Message classification and chat history * MCP proxy for external integrations - Implemented Court Status API (GetCourtStatus.php): * Real-time court document status checking * Integration with external court systems * Comprehensive error handling and logging - Enhanced S3 integration: * Improved file backup system with metadata * Batch processing capabilities * Enhanced error logging and recovery * Copy operations with URL fixing - Added Telegram contact creation API - Improved error logging across all modules - Enhanced callback system for AI responses - Extensive backup file storage with timestamps - Updated documentation and README files - File storage improvements: * Thousands of backup files with proper metadata * Fix operations for broken file references * Project-specific backup and recovery systems * Comprehensive file integrity checking Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
278 lines
9.6 KiB
PHP
278 lines
9.6 KiB
PHP
<?php
|
||
|
||
// aiassist/n8n/n8nembiding.php
|
||
|
||
require_once __DIR__ . '/../config.php';
|
||
require_once __DIR__ . '/../logger.php';
|
||
require_once __DIR__ . '/../vectorgpt.php';
|
||
require_once __DIR__ . '/../search.php';
|
||
require_once __DIR__ . '/../utils.php';
|
||
|
||
header('Content-Type: application/json; charset=utf-8');
|
||
|
||
logMessage("=== Получен запрос от n8n ===");
|
||
|
||
// 1. Сырое тело запроса
|
||
$rawInput = file_get_contents('php://input');
|
||
logMessage("Raw input: $rawInput");
|
||
|
||
// 2. Декодируем JSON
|
||
$data = json_decode($rawInput, true);
|
||
if (json_last_error() !== JSON_ERROR_NONE || !isset($data['message'])) {
|
||
http_response_code(400);
|
||
echo json_encode(['error' => 'Невалидный JSON или отсутствует поле message'], JSON_UNESCAPED_UNICODE);
|
||
logMessage("❌ Ошибка: невалидный JSON или нет message");
|
||
exit;
|
||
}
|
||
|
||
$message = $data['message'];
|
||
logMessage("📩 message (возможно вложенный JSON): $message");
|
||
|
||
// 3. Извлекаем вложенный JSON из строки
|
||
$decoded = extractCleanJsonFromGPT($message);
|
||
if (!is_array($decoded)) {
|
||
http_response_code(400);
|
||
echo json_encode(['error' => 'Поле message не содержит валидный JSON'], JSON_UNESCAPED_UNICODE);
|
||
logMessage("❌ Ошибка: вложенный JSON в message некорректен");
|
||
exit;
|
||
}
|
||
|
||
logMessage("✅ Распарсено из message: " . json_encode($decoded, JSON_UNESCAPED_UNICODE));
|
||
|
||
// 4. Проверка ключевых полей
|
||
if (
|
||
empty($decoded['category']) ||
|
||
empty($decoded['facts_short']) ||
|
||
empty($decoded['facts_full'])
|
||
) {
|
||
http_response_code(400);
|
||
echo json_encode(['error' => 'Недостаточно данных: нужны category, facts_short и facts_full'], JSON_UNESCAPED_UNICODE);
|
||
logMessage("❌ Ошибка: не хватает обязательных полей для поиска");
|
||
exit;
|
||
}
|
||
|
||
// 5. Векторизация facts_full
|
||
$embedding = getTextEmbedding($decoded['facts_full']);
|
||
logMessage("📡 Векторизация:\n" . json_encode($embedding, JSON_UNESCAPED_UNICODE));
|
||
|
||
// 6. Нормализация
|
||
function normalizeEmbeddingCompat($vector) {
|
||
if (!is_array($vector) || empty($vector)) return null;
|
||
|
||
$sum = 0;
|
||
foreach ($vector as $v) {
|
||
if (!is_numeric($v)) return null;
|
||
$sum += $v * $v;
|
||
}
|
||
|
||
$magnitude = sqrt($sum);
|
||
if ($magnitude == 0) return null;
|
||
|
||
$normalized = [];
|
||
foreach ($vector as $v) {
|
||
$normalized[] = $v / $magnitude;
|
||
}
|
||
|
||
return $normalized;
|
||
}
|
||
|
||
$embedding1024 = normalizeEmbeddingCompat(isset($embedding['embedding_1024']) ? $embedding['embedding_1024'] : []);
|
||
$embedding2048 = normalizeEmbeddingCompat(isset($embedding['embedding_2048']) ? $embedding['embedding_2048'] : []);
|
||
|
||
// 7. Поиск похожих дел
|
||
$rawResults = searchCases($decoded['facts_short'], [
|
||
'embedding_1024' => $embedding1024,
|
||
'embedding_2048' => $embedding2048
|
||
]);
|
||
|
||
logMessage("🔍 Результаты поиска (полные): " . json_encode($rawResults, JSON_UNESCAPED_UNICODE));
|
||
|
||
// 7.1. Удаляем embedding-и
|
||
$cleanedResults = array();
|
||
if (isset($rawResults['hits']['hits'])) {
|
||
foreach ($rawResults['hits']['hits'] as $hit) {
|
||
if (isset($hit['_source'])) {
|
||
unset($hit['_source']['embedding_1024']);
|
||
unset($hit['_source']['embedding_2048']);
|
||
}
|
||
$cleanedResults[] = $hit['_source'];
|
||
}
|
||
}
|
||
|
||
logMessage("🔎 Очищенные результаты поиска: " . json_encode($cleanedResults, JSON_UNESCAPED_UNICODE));
|
||
|
||
// 8. Ответ в n8n
|
||
$response = array(
|
||
'status' => 'ok',
|
||
'input' => $decoded,
|
||
'search_results' => $cleanedResults
|
||
);
|
||
|
||
|
||
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||
logMessage("✅ Ответ отправлен в n8n. === Конец обработки ===");
|
||
|
||
|
||
|
||
/*
|
||
|
||
// aiassist/n8n/n8nembiding.php
|
||
|
||
include_once $_SERVER['DOCUMENT_ROOT'] . '/../config.php';
|
||
include_once $_SERVER['DOCUMENT_ROOT'] . '/../logger.php';
|
||
include_once $_SERVER['DOCUMENT_ROOT'] . '/../vectorgpt.php';
|
||
include_once $_SERVER['DOCUMENT_ROOT'] . '/../search.php';
|
||
include_once $_SERVER['DOCUMENT_ROOT'] . '/../utils.php';
|
||
|
||
header('Content-Type: application/json; charset=utf-8');
|
||
|
||
logMessage("=== Получен запрос из n8n ===");
|
||
|
||
// 1. Считываем тело запроса
|
||
$rawInput = file_get_contents('php://input');
|
||
logMessage("Raw input: $rawInput");
|
||
|
||
// 2. Пробуем декодировать как JSON
|
||
$data = json_decode($rawInput, true);
|
||
if (json_last_error() !== JSON_ERROR_NONE || !isset($data['message'])) {
|
||
http_response_code(400);
|
||
echo json_encode(['error' => 'Невалидный JSON или отсутствует поле message'], JSON_UNESCAPED_UNICODE);
|
||
logMessage("❌ Ошибка: невалидный JSON или отсутствует поле message");
|
||
exit;
|
||
}
|
||
|
||
$message = $data['message'];
|
||
logMessage("📩 Получено поле message: $message");
|
||
|
||
// 3. Используем extractCleanJsonFromGPT, чтобы достать вложенный JSON из message
|
||
$decodedMessage = extractCleanJsonFromGPT($message);
|
||
if ($decodedMessage === null) {
|
||
http_response_code(400);
|
||
echo json_encode(['error' => 'Поле message не содержит валидный JSON'], JSON_UNESCAPED_UNICODE);
|
||
logMessage("❌ Ошибка: message не содержит валидный JSON");
|
||
exit;
|
||
}
|
||
|
||
logMessage("✅ Распарсенный JSON из message: " . json_encode($decodedMessage, JSON_UNESCAPED_UNICODE));
|
||
|
||
// 4. Проверка ключевых полей
|
||
if (empty($decodedMessage['facts_full']) || empty($decodedMessage['facts_short']) || empty($decodedMessage['category'])) {
|
||
http_response_code(400);
|
||
echo json_encode(['error' => 'Недостаточно данных для поиска'], JSON_UNESCAPED_UNICODE);
|
||
logMessage("❌ Ошибка: отсутствуют ключевые поля для поиска");
|
||
exit;
|
||
}
|
||
|
||
// 5. Генерация эмбеддингов
|
||
$embedding = getTextEmbedding($decodedMessage['facts_full']);
|
||
logMessage("📡 Векторизация завершена:\n" . json_encode($embedding, JSON_UNESCAPED_UNICODE));
|
||
|
||
// 6. Нормализация
|
||
function normalizeEmbedding(array $vector) {
|
||
if (empty($vector)) return null;
|
||
|
||
$sumSquares = 0;
|
||
foreach ($vector as $v) {
|
||
$sumSquares += $v * $v;
|
||
}
|
||
|
||
$magnitude = sqrt($sumSquares);
|
||
if ($magnitude == 0) return null;
|
||
|
||
$normalized = [];
|
||
foreach ($vector as $v) {
|
||
$normalized[] = $v / $magnitude;
|
||
}
|
||
return $normalized;
|
||
}
|
||
|
||
|
||
// 7. Поиск похожих дел
|
||
$searchResults = searchCases($decodedMessage['facts_short'], [
|
||
'embedding_1024' => $embedding1024,
|
||
'embedding_2048' => $embedding2048
|
||
]);
|
||
|
||
logMessage("🔍 Результаты поиска: " . json_encode($searchResults, JSON_UNESCAPED_UNICODE));
|
||
|
||
// 8. Ответ в n8n
|
||
$response = [
|
||
'status' => 'ok',
|
||
'input' => $decodedMessage,
|
||
'search_results' => $searchResults
|
||
];
|
||
|
||
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||
logMessage("✅ Ответ отправлен в n8n. === Конец обработки ===");
|
||
|
||
|
||
|
||
|
||
/*
|
||
|
||
<?php
|
||
// n8nembiding.php
|
||
|
||
// Путь к вашему лог-файлу
|
||
$logFile = __DIR__ . '/debug_n8n.log';
|
||
|
||
// Вспомогательная функция для записи логов
|
||
function n8nLog($message, $logFile) {
|
||
file_put_contents($logFile, date('[Y-m-d H:i:s] ') . $message . "\n", FILE_APPEND);
|
||
}
|
||
|
||
// Логируем все заголовки запроса
|
||
n8nLog("=== New Request ===", $logFile);
|
||
foreach (getallheaders() as $name => $value) {
|
||
n8nLog("Header: $name => $value", $logFile);
|
||
}
|
||
|
||
// Считываем «сырые» данные из тела запроса
|
||
$input = file_get_contents('php://input');
|
||
n8nLog("Raw input: $input", $logFile);
|
||
|
||
// Пытаемся декодировать как JSON
|
||
$data = json_decode($input, true);
|
||
$jsonError = json_last_error();
|
||
if ($jsonError !== JSON_ERROR_NONE) {
|
||
// Если JSON невалидный, пишем код ошибки
|
||
n8nLog("json_decode error code: $jsonError", $logFile);
|
||
// Можем также дополнительно попробовать parse_str
|
||
// или просто сообщаем, что JSON невалиден
|
||
http_response_code(400);
|
||
echo json_encode(['error' => 'Невалидный JSON']);
|
||
exit;
|
||
}
|
||
|
||
// Логируем результат
|
||
n8nLog("Decoded array: " . print_r($data, true), $logFile);
|
||
|
||
// Проверяем поле message
|
||
if (!isset($data['message'])) {
|
||
// Для отладки логируем, что message не найден
|
||
n8nLog("No 'message' field found in decoded data", $logFile);
|
||
http_response_code(400);
|
||
echo json_encode(['error' => 'Не передано поле message']);
|
||
exit;
|
||
}
|
||
|
||
// Подключаем ваш скрипт векторизации (если нужно)
|
||
|
||
// Подключаем файл с функцией векторизации
|
||
include_once $_SERVER['DOCUMENT_ROOT'] . '/aiassist/vectorgpt.php'; // в этом файле должна быть ваша функция
|
||
|
||
// Логируем полученное поле message
|
||
n8nLog("Message from request: " . $data['message'], $logFile);
|
||
|
||
// Вызываем функцию векторизации
|
||
$result = getTextEmbedding($data['message']);
|
||
|
||
// Логируем результат
|
||
n8nLog("Vectorization result: " . print_r($result, true), $logFile);
|
||
|
||
// Отдаем результат в формате JSON
|
||
header('Content-Type: application/json');
|
||
echo json_encode($result);
|
||
|
||
*/
|
||
?>
|