Files
crm.clientright.ru/aiassist/n8n/n8nembiding.php
Fedor ac7467f0b4 Major CRM updates: AI Assistant, Court Status API, S3 integration improvements, and extensive file storage system
- 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.
2025-10-16 11:17:21 +03:00

278 lines
9.6 KiB
PHP
Raw Permalink 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
// 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);
*/
?>