- 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.
249 lines
12 KiB
PHP
249 lines
12 KiB
PHP
<?php
|
||
// aiassist/utils.php
|
||
require_once 'config.php';
|
||
require_once 'logger.php';
|
||
|
||
// ✅ Универсальный способ извлечь JSON из ответа GPT
|
||
function extractCleanJsonFromGPT($contentBlock) {
|
||
if (is_array($contentBlock) && isset($contentBlock[0]['text']['value'])) {
|
||
$rawText = $contentBlock[0]['text']['value'];
|
||
} elseif (is_string($contentBlock)) {
|
||
$rawText = $contentBlock;
|
||
} else {
|
||
return null;
|
||
}
|
||
|
||
$rawText = trim($rawText);
|
||
|
||
// 🧹 Удаляем обёртку ```json или просто ``` и возможные аннотации
|
||
if (preg_match('/^```(?:json)?\s*(.*?)\s*```$/s', $rawText, $matches)) {
|
||
$rawText = trim($matches[1]);
|
||
}
|
||
|
||
// Пробуем распарсить
|
||
$decoded = json_decode($rawText, true);
|
||
if (json_last_error() === JSON_ERROR_NONE) {
|
||
return $decoded;
|
||
}
|
||
|
||
// 💡 На случай если GPT прислал с лишними символами — пытаемся "почистить"
|
||
$rawText = preg_replace('/[^\x20-\x7Eа-яА-ЯёЁ{}\[\]":,.\'\n\r]+/u', '', $rawText);
|
||
$decoded = json_decode($rawText, true);
|
||
|
||
return (json_last_error() === JSON_ERROR_NONE) ? $decoded : null;
|
||
}
|
||
|
||
function buildReportPromptFromJson(array $json, string $vectorStoreId, string $loadedCasesText = ''): string {
|
||
|
||
$applicantName = $json['applicant_name'] ?? 'не указано';
|
||
$clientName = $json['document_client_name'] ?? 'не указано';
|
||
$region = $json['region'] ?? 'не указан';
|
||
$city = $json['city'] ?? 'не указан';
|
||
$category = $json['category'] ?? 'не указана';
|
||
$claimAmount = $json['claim_amount'] ?? 'не указана';
|
||
$claimType = $json['claim_type'] ?? 'не указано';
|
||
$claimReason = $json['claim_reason'] ?? 'не указано';
|
||
$factsShort = $json['facts_short'] ?? 'не указано';
|
||
$factsFull = $json['facts_full'] ?? 'не указано';
|
||
$articles = isset($json['articles']) && is_array($json['articles']) ? implode(", ", $json['articles']) : 'не указаны';
|
||
|
||
$evidence = "";
|
||
if (!empty($json['evidence_summary']) && is_array($json['evidence_summary'])) {
|
||
foreach ($json['evidence_summary'] as $item) {
|
||
$evidence .= "• {$item['name']}: {$item['content']}\n";
|
||
}
|
||
} else {
|
||
$evidence = "не указаны";
|
||
}
|
||
|
||
$pretensionSent = $json['is_pretension_sent'] ? 'да' : 'нет';
|
||
$hasContract = $json['has_contract'] ? 'да' : 'нет';
|
||
$hasPayment = $json['has_payment_proof'] ? 'да' : 'нет';
|
||
$hasAccess = $json['has_training_access'] ? 'да' : 'нет';
|
||
$nsfw = $json['nsfw_alert'] ? '⚠️ возможно NSFW-контент' : 'отсутствует';
|
||
|
||
return
|
||
"🔹 Финальный анализ обращения клиента
|
||
|
||
📌 Заявитель: $applicantName
|
||
📍 Регион: $region
|
||
🏙 Населённый пункт: $city
|
||
|
||
⚖️ Ответчик: $clientName
|
||
💼 Категория спора: $category
|
||
📜 Применимые нормы: $articles
|
||
|
||
💰 Сумма требований: $claimAmount руб.
|
||
📑 Тип требований: $claimType
|
||
📚 Основание требований: $claimReason
|
||
|
||
📖 Суть спора (кратко): $factsShort
|
||
📄 Развёрнуто: $factsFull
|
||
|
||
📂 Документы, представленные заявителем:
|
||
$evidence
|
||
|
||
📌 Претензионный порядок соблюдён: $pretensionSent
|
||
📄 Договор: $hasContract
|
||
💳 Подтверждение оплаты: $hasPayment
|
||
🎓 Доступ к обучению: $hasAccess
|
||
🔞 Контент: $nsfw
|
||
|
||
🔎 Используй материалы, загруженные в Vector Store ID: $vectorStoreId
|
||
$loadedCasesText
|
||
|
||
📋 Выполни следующее:
|
||
1️⃣ Укажи, где документы нечитабельны или требуют OCR. Если OCR не удаётся — опиши визуально.
|
||
2️⃣ Проанализируй доказательную базу. Укажи, какие документы критичны, а какие слабы.
|
||
3️⃣ Проанализируй судебные решения. Для каждого решения из списка сформируй краткое саммари (до 200 знаков):
|
||
Формат: `Дело №___, Суд: ___ — требования удовлетворены/отказано. Суть: ...`. Добавь ссылку из ElasticSearch, если доступна.
|
||
4️⃣ Укажи риски и слабые места позиции заявителя исходя из судебных решений.
|
||
5️⃣ Предложи рекомендации: какие доказательства собрать или усилить.
|
||
6️⃣ Дай прогноз по делу (в процентах) и краткий вывод.
|
||
**бщий тект не должен превышать 4500 знаков с пробелами.**
|
||
";
|
||
}
|
||
|
||
/* //old
|
||
function buildReportPromptFromJson(array $json, string $vectorStoreId, string $loadedCasesText): string {
|
||
$applicantName = $json['applicant_name'] ?? 'не указано';
|
||
$clientName = $json['document_client_name'] ?? 'не указано';
|
||
$region = $json['region'] ?? 'не указан';
|
||
$city = $json['city'] ?? 'не указан';
|
||
$category = $json['category'] ?? 'не указана';
|
||
$claimAmount = $json['claim_amount'] ?? 'не указана';
|
||
$claimType = $json['claim_type'] ?? 'не указано';
|
||
$claimReason = $json['claim_reason'] ?? 'не указано';
|
||
$factsShort = $json['facts_short'] ?? 'не указано';
|
||
$factsFull = $json['facts_full'] ?? 'не указано';
|
||
$articles = isset($json['articles']) && is_array($json['articles']) ? implode(", ", $json['articles']) : 'не указаны';
|
||
|
||
$evidence = "";
|
||
if (!empty($json['evidence_summary']) && is_array($json['evidence_summary'])) {
|
||
foreach ($json['evidence_summary'] as $item) {
|
||
$evidence .= "• {$item['name']}: {$item['content']}\n";
|
||
}
|
||
} else {
|
||
$evidence = "не указаны";
|
||
}
|
||
|
||
$pretensionSent = !empty($json['is_pretension_sent']) ? 'да' : 'нет';
|
||
$hasContract = !empty($json['has_contract']) ? 'да' : 'нет';
|
||
$hasPayment = !empty($json['has_payment_proof']) ? 'да' : 'нет';
|
||
$hasAccess = !empty($json['has_training_access']) ? 'да' : 'нет';
|
||
$nsfw = !empty($json['nsfw_alert']) ? '⚠️ возможно NSFW-контент' : 'отсутствует';
|
||
|
||
return
|
||
"🔹 Финальный анализ обращения клиента
|
||
|
||
📌 Заявитель: $applicantName
|
||
📍 Регион: $region
|
||
🏙 Населённый пункт: $city
|
||
|
||
⚖️ Ответчик: $clientName
|
||
💼 Категория спора: $category
|
||
📜 Применимые нормы: $articles
|
||
|
||
💰 Сумма требований: $claimAmount руб.
|
||
📑 Тип требований: $claimType
|
||
📚 Основание требований: $claimReason
|
||
|
||
📖 Суть спора (кратко): $factsShort
|
||
📄 Развёрнуто: $factsFull
|
||
|
||
📂 Документы, представленные заявителем:
|
||
$evidence
|
||
|
||
📌 Претензионный порядок соблюдён: $pretensionSent
|
||
📄 Договор: $hasContract
|
||
💳 Подтверждение оплаты: $hasPayment
|
||
🎓 Доступ к обучению: $hasAccess
|
||
🔞 Контент: $nsfw
|
||
|
||
🔎 Используй материалы, загруженные в Vector Store ID: $vectorStoreId
|
||
судебные решения: $loadedCasesText
|
||
|
||
📋 Выполни следующее:
|
||
1️⃣ Укажи, где документы нечитабельны или требуют OCR. Если OCR не удаётся — опиши визуально.
|
||
2️⃣ Проанализируй доказательную базу. Укажи, какие документы критичны, а какие слабы.
|
||
3️⃣ Проанализируй судебные решения.
|
||
4️⃣ Укажи риски и слабые места позиции заявителя исходя из судебных решений.
|
||
5️⃣ Предложи рекомендации: какие доказательства собрать или усилить.
|
||
6️⃣ Дай прогноз по делу (в процентах) и краткий вывод.
|
||
";
|
||
}
|
||
*/
|
||
|
||
|
||
/*function buildReportPromptFromJson(array $json, string $vectorStoreId): string {
|
||
|
||
$applicantName = $json['applicant_name'] ?? 'не указано';
|
||
$clientName = $json['document_client_name'] ?? 'не указано';
|
||
$region = $json['region'] ?? 'не указан';
|
||
$city = $json['city'] ?? 'не указан';
|
||
$category = $json['category'] ?? 'не указана';
|
||
$claimAmount = $json['claim_amount'] ?? 'не указана';
|
||
$claimType = $json['claim_type'] ?? 'не указано';
|
||
$claimReason = $json['claim_reason'] ?? 'не указано';
|
||
$factsShort = $json['facts_short'] ?? 'не указано';
|
||
$factsFull = $json['facts_full'] ?? 'не указано';
|
||
$articles = isset($json['articles']) && is_array($json['articles']) ? implode(", ", $json['articles']) : 'не указаны';
|
||
|
||
$evidence = "";
|
||
if (!empty($json['evidence_summary']) && is_array($json['evidence_summary'])) {
|
||
foreach ($json['evidence_summary'] as $item) {
|
||
$evidence .= "• {$item['name']}: {$item['content']}\n";
|
||
}
|
||
} else {
|
||
$evidence = "не указаны";
|
||
}
|
||
|
||
$pretensionSent = $json['is_pretension_sent'] ? 'да' : 'нет';
|
||
$hasContract = $json['has_contract'] ? 'да' : 'нет';
|
||
$hasPayment = $json['has_payment_proof'] ? 'да' : 'нет';
|
||
$hasAccess = $json['has_training_access'] ? 'да' : 'нет';
|
||
$nsfw = $json['nsfw_alert'] ? '⚠️ возможно NSFW-контент' : 'отсутствует';
|
||
|
||
logMessage("DEBUG: \$loadedCasesDescription = " . var_export($loadedCasesDescription, true));
|
||
|
||
return
|
||
"🔹 Финальный анализ обращения клиента
|
||
|
||
📌 Заявитель: $applicantName
|
||
📍 Регион: $region
|
||
🏙 Населённый пункт: $city
|
||
|
||
⚖️ Ответчик: $clientName
|
||
💼 Категория спора: $category
|
||
📜 Применимые нормы: $articles
|
||
|
||
💰 Сумма требований: $claimAmount руб.
|
||
📑 Тип требований: $claimType
|
||
📚 Основание требований: $claimReason
|
||
|
||
📖 Суть спора (кратко): $factsShort
|
||
📄 Развёрнуто: $factsFull
|
||
|
||
📂 Документы, представленные заявителем:
|
||
$evidence
|
||
|
||
📌 Претензионный порядок соблюдён: $pretensionSent
|
||
📄 Договор: $hasContract
|
||
💳 Подтверждение оплаты: $hasPayment
|
||
🎓 Доступ к обучению: $hasAccess
|
||
🔞 Контент: $nsfw
|
||
|
||
🔎 Используй материалы, загруженные в Vector Store ID: $vectorStoreId
|
||
судебные решения: $loadedCasesText.
|
||
|
||
|
||
📋 Выполни следующее:
|
||
1️⃣ Укажи, где документы нечитабельны или требуют OCR. Если OCR не удаётся — опиши визуально.
|
||
2️⃣ Проанализируй доказательную базу. Укажи, какие документы критичны, а какие слабы.
|
||
3️<EFBFBD><EFBFBD><EFBFBD> Проанализируй судебные решения.
|
||
4️⃣ Укажи риски и слабые места позиции заявителя исходя из судебных решений.
|
||
5️⃣ Предложи рекомендации: какие доказательства собрать или усилить.
|
||
6️⃣ Дай прогноз по делу (в процентах) и краткий вывод.
|
||
";
|
||
}
|
||
*/ |