- 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.
234 lines
10 KiB
PHP
234 lines
10 KiB
PHP
<?php
|
||
// iacode14.php
|
||
require_once 'aiassist/config.php';
|
||
require_once 'aiassist/logger.php';
|
||
require_once 'aiassist/database.php';
|
||
require_once 'aiassist/crmHandler.php';
|
||
require_once 'aiassist/elastic.php';
|
||
require_once 'aiassist/fileHandler.php';
|
||
require_once 'aiassist/vectorgpt.php';
|
||
require_once 'aiassist/gptAssistant.php';
|
||
require_once 'aiassist/search.php';
|
||
//require_once 'aiassist/search_context.php';
|
||
|
||
|
||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||
$id = $_POST['id'] ?? null;
|
||
if (!$id) {
|
||
$input = json_decode(file_get_contents('php://input'), true);
|
||
$id = $input['id'] ?? null;
|
||
}
|
||
if (!$id || !is_numeric($id)) {
|
||
logMessage("Ошибка: Некорректный ID.");
|
||
die(json_encode(["status" => "error", "message" => "Некорректный ID."], JSON_UNESCAPED_UNICODE));
|
||
}
|
||
$GLOBALS['caseId'] = $id;
|
||
|
||
// 1️⃣ Получаем данные из базы
|
||
$pdo = getDbConnection();
|
||
$documents = fetchDocumentData($pdo, $id);
|
||
if (empty($documents)) {
|
||
logMessage("Документы не найдены для ID: $id");
|
||
die("Документы не найдены для ID: $id");
|
||
}
|
||
logMessage("✅ Документы получены: " . json_encode($documents, JSON_UNESCAPED_UNICODE));
|
||
|
||
// 2️⃣ Извлекаем текст из документов
|
||
$combinedContent = "";
|
||
foreach ($documents as $doc) {
|
||
if (empty($doc['filepath'])) continue;
|
||
$text = extractText($doc['filepath']);
|
||
if (!empty($text)) {
|
||
$combinedContent .= $text . "\n";
|
||
}
|
||
}
|
||
logMessage("📄 Собранный контент:\n" . $combinedContent);
|
||
|
||
if (empty($combinedContent)) {
|
||
logMessage("❌ Ошибка: анализ документов не дал результатов.");
|
||
die("Ошибка: анализ документов не вернул результатов.");
|
||
}
|
||
|
||
// 3️⃣ Первый запрос в GPT (извлекаем ключевые параметры дела)
|
||
$threadId = createNewThread();
|
||
if (!$threadId) {
|
||
logMessage("❌ Ошибка создания треда GPT");
|
||
die("Ошибка создания треда");
|
||
}
|
||
|
||
logMessage("📤 Отправляем в GPT-4 на предварительный анализ...");
|
||
|
||
$parsedResponse = extractCaseDetailsWithGPT($threadId, ASSISTANT_ID, "", $combinedContent);
|
||
if (!$parsedResponse) {
|
||
logMessage("❌ Ошибка анализа обращения через GPT-4.");
|
||
die("Ошибка анализа обращения через GPT-4");
|
||
}
|
||
|
||
logMessage("✅ Ответ GPT-4 (ключевые параметры): " . json_encode($parsedResponse, JSON_UNESCAPED_UNICODE));
|
||
|
||
// 4️⃣ Генерируем эмбеддинг по `facts`
|
||
$embedding = getTextEmbedding($parsedResponse['facts']);
|
||
logMessage("🔍 Полученный эмбеддинг (первые 10 значений): " . json_encode(array_slice($embedding["embedding_1024"], 0, 10)));
|
||
|
||
// 5️⃣ Ищем судебные решения в ElasticSearch
|
||
logMessage("🔍 Выполняем поиск судебных решений...");
|
||
$searchResults = searchSimilarCases([
|
||
'category' => $parsedResponse['category'],
|
||
'article' => implode(" ", $parsedResponse['articles']),
|
||
'amount' => $parsedResponse['claim_amount'],
|
||
'facts' => $parsedResponse['facts'],
|
||
'embedding' => $embedding
|
||
]);
|
||
|
||
logMessage("✅ Найденные судебные решения: " . json_encode($searchResults, JSON_UNESCAPED_UNICODE));
|
||
|
||
// 6️⃣ Формируем итоговый промпт
|
||
$embedding = getTextEmbedding($combinedContent);
|
||
logMessage("🔍 Полученный эмбеддинг (первые 10 значений): " . json_encode(array_slice($embedding, 0, 10)));
|
||
|
||
// Выполняем поиск судебных решений
|
||
$searchResults = searchSimilarCases([
|
||
'category' => $parsedResponse['category'],
|
||
'article' => implode(" ", $parsedResponse['articles']),
|
||
'amount' => $parsedResponse['claim_amount'],
|
||
'facts' => $parsedResponse['facts'],
|
||
'embedding' => $embedding
|
||
]);
|
||
logMessage("✅ Найденные судебные решения: " . json_encode($searchResults, JSON_UNESCAPED_UNICODE));
|
||
|
||
// Формируем `finalPrompt`
|
||
$finalPrompt = "Новый спор:\n" . $combinedContent . "\n\n" .
|
||
"Контекст поиска судебных решений:\n\n";
|
||
foreach ($searchResults as $case) {
|
||
$finalPrompt .= "- " . ($case['court_decision'] ?? "Нет данных") . "\n";
|
||
}
|
||
|
||
|
||
// 7️⃣ Второй запрос в GPT (финальный анализ)
|
||
logMessage("📤 Отправляем в GPT-4 финальный анализ...");
|
||
$analysis = analyzeDocumentWithAssistantStream($threadId, ASSISTANT_ID, "", $finalPrompt, $searchResults);
|
||
|
||
if (!$analysis) {
|
||
logMessage("❌ Ошибка анализа совокупного запроса");
|
||
die("Ошибка анализа совокупного запроса");
|
||
}
|
||
|
||
logMessage("✅ Итоговый анализ от GPT-4:\n" . $analysis);
|
||
|
||
// 8️⃣ Завершаем обработку
|
||
logMessage("✅ Обработка всех документов завершена.");
|
||
exit;
|
||
}
|
||
|
||
|
||
/*
|
||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||
$id = $_POST['id'] ?? null;
|
||
if (!$id) {
|
||
$input = json_decode(file_get_contents('php://input'), true);
|
||
$id = $input['id'] ?? null;
|
||
}
|
||
if (!$id || !is_numeric($id)) {
|
||
logMessage("Ошибка: Некорректный ID.");
|
||
die(json_encode(["status" => "error", "message" => "Некорректный ID."], JSON_UNESCAPED_UNICODE));
|
||
}
|
||
$GLOBALS['caseId'] = $id;
|
||
|
||
$pdo = getDbConnection();
|
||
$documents = fetchDocumentData($pdo, $id);
|
||
if (empty($documents)) {
|
||
logMessage("Документы не найдены для ID: $id");
|
||
die("Документы не найдены для ID: $id");
|
||
}
|
||
logMessage("Документы получены из БД: " . json_encode($documents, JSON_UNESCAPED_UNICODE));
|
||
|
||
$filePathList = array_map(function($doc) {
|
||
return $doc['filepath'];
|
||
}, $documents);
|
||
|
||
$previousAnalysis = checkPreviousAnalysis($id, $filePathList);
|
||
logMessage("DEBUG: Значение предыдущего анализа: " . print_r($previousAnalysis, true));
|
||
if ($previousAnalysis) {
|
||
logMessage("Найден сохранённый анализ, отправляем его в CRM.");
|
||
exit;
|
||
} else {
|
||
logMessage("Сохранённый анализ не найден, продолжаем обработку.");
|
||
}
|
||
|
||
// Создание Vector Store и загрузка файлов
|
||
$vectorStoreId = createVectorStore();
|
||
$uploadedFileIds = [];
|
||
foreach ($filePathList as $filePath) {
|
||
if (!file_exists($filePath)) {
|
||
logMessage("Ошибка: Файл не существует: $filePath");
|
||
continue;
|
||
}
|
||
$fileId = uploadFileToOpenAI($filePath);
|
||
if (!$fileId) {
|
||
logMessage("Ошибка загрузки файла: $filePath");
|
||
continue;
|
||
}
|
||
if (!addFileToVectorStore($vectorStoreId, $fileId)) {
|
||
logMessage("Ошибка добавления файла в Vector Store: $filePath");
|
||
} else {
|
||
logMessage("Файл успешно добавлен в Vector Store: $filePath");
|
||
$uploadedFileIds[$filePath] = $fileId;
|
||
}
|
||
}
|
||
|
||
if (!updateAssistantWithVectorStore($vectorStoreId)) {
|
||
logMessage("Ошибка обновления ассистента с Vector Store");
|
||
die("Ошибка обновления ассистента");
|
||
}
|
||
|
||
// Извлечение текста из документов и формирование объединённого контента
|
||
$combinedContent = "";
|
||
foreach ($documents as $doc) {
|
||
if (empty($doc['filepath'])) continue;
|
||
$text = extractText($doc['filepath']);
|
||
if (!empty($text)) {
|
||
$combinedContent .= $text . "\n";
|
||
}
|
||
}
|
||
logMessage("Собранный контент для анализа:\n" . $combinedContent);
|
||
if (empty($combinedContent)) {
|
||
logMessage("Ошибка: анализ документов не вернул результатов");
|
||
die("Ошибка: анализ документов не вернул результатов");
|
||
}
|
||
|
||
$fileIdCombined = implode(',', array_values($uploadedFileIds));
|
||
logMessage("Объединённый список идентификаторов файлов: " . $fileIdCombined);
|
||
|
||
// Получаем итоговый prompt для GPT через search_context.php
|
||
$finalPrompt = include 'aiassist/search_context.php';
|
||
logMessage("Итоговый prompt для GPT:\n" . $finalPrompt);
|
||
|
||
$threadId = createNewThread();
|
||
if (!$threadId) {
|
||
logMessage("Ошибка создания треда");
|
||
die("Ошибка создания треда");
|
||
}
|
||
|
||
// Пример вызова анализа через GPT-4
|
||
$analysis = analyzeDocumentWithAssistantStream($threadId, ASSISTANT_ID, $fileIdCombined, $finalPrompt, []);
|
||
if (!$analysis) {
|
||
logMessage("❌ Ошибка анализа совокупного запроса");
|
||
die("Ошибка анализа совокупного запроса");
|
||
}
|
||
|
||
// Получение эмбеддинга для полного текста обращения
|
||
$embedding = getTextEmbedding($combinedContent);
|
||
logMessage("Полученный эмбеддинг (первые 10 значений): " . json_encode(array_slice($embedding["embedding_1024"], 0, 10)));
|
||
|
||
// Далее можно продолжить обработку: анализ обращения, поиск судебных решений, сохранение результата и т.д.
|
||
|
||
logMessage("Обработка всех документов завершена.");
|
||
exit;
|
||
|
||
*/
|
||
else {
|
||
logMessage("Ошибка: запрос должен быть POST");
|
||
die("Ошибка: запрос должен быть POST");
|
||
}
|
||
?>
|