Files
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

701 lines
28 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
/*********************************************************************************
* Набор методов для работы с Yandex GPT и ChatGPT через прокладку proxyapi.ru
* All Rights Reserved.
* Contributor(s): Илья Руденко itsaturn@yandex.ru
********************************************************************************/
require_once 'include/utils/utils.php';
function VerbTransfer($list) {
$body = '{
"modelUri": "gpt://b1gvol62rds4n2e5gnm3/yandexgpt-lite",
"completionOptions": {
"stream": false,
"temperature": 0.01,
"maxTokens": 1000
},
"messages": [
{
"role": "system",
"text": "Перепиши фразы, изменив глаголы во второе лицо множественное число, настоящее время"
},
{
"role": "user",
"text": "'.$list.'"
}
]
}';
$logstring = date('Y-m-d H:i:s').' Тело запроса:'.PHP_EOL.$body.PHP_EOL;
file_put_contents('logs/GPT.log', $logstring, FILE_APPEND);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://llm.api.cloud.yandex.net/foundationModels/v1/completion',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => array(
'Authorization: '.$apikey,
'x-folder-id: b1gvol62rds4n2e5gnm3',
'Content-Type: application/json'),
));
$response = curl_exec($curl);
$response = str_replace('\n', '', $response);
$logstring = date('Y-m-d H:i:s').' Ответ от нейросети:'.PHP_EOL.$response.PHP_EOL;
file_put_contents('logs/GPT.log', $logstring, FILE_APPEND);
curl_close($curl);
$response = json_decode($response, true);
$output = $response['result']['alternatives'][0]['message']['text'];
return $output;
}
function ChangeFlithy($text) {
$output = SendRequest('Замени в тексте матерные слова и выражения звездочками. От себя ничего не добавляний и никакой редактуры не делай - никакого креатива! Только замена мата на звездочки', $text);
return $output;
}
function CheckFlithy($text) {
$output = SendRequest('Проверь текст. Если найдешь в нем матерные слова и выражения - верни 1. Если нет - верни 0', $text);
return $output;
}
function SendRequest($task, $text) {
$text = str_replace(array("\r\n", "\n", "\r"), " ", $text);
$body = '{"model": "gpt-3.5-turbo","messages": [{"role": "system","content": "'.$task.'"},{"role": "user","content": "'.$text.'"}],"temperature": 0.01}';
$logstring = date('Y-m-d H:i:s').' Тело запроса:'.PHP_EOL.$body.PHP_EOL;
file_put_contents('logs/GPT.log', $logstring, FILE_APPEND);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.proxyapi.ru/openai/v1/chat/completions',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'Authorization: Bearer sk-GS24OxHQYfq8ErW5CRLoN5F1CfJPxNsY'
),
));
$response = curl_exec($curl);
$logstring = date('Y-m-d H:i:s').' Ответ от нейросети:'.PHP_EOL.$response.PHP_EOL;
file_put_contents('logs/GPT.log', $logstring, FILE_APPEND);
if ($response == 'Internal Server Error') {
sleep(10);
$response = curl_exec($curl);
$logstring = date('Y-m-d H:i:s').' Ответ от нейросети:'.PHP_EOL.$response.PHP_EOL;
file_put_contents('logs/GPT.log', $logstring, FILE_APPEND);
}
curl_close($curl);
$response = json_decode($response, true);
$output = $response['choices'][0]['message']['content'];
return $output;
}
//тестим новый код
function AskPDF($pdfFile) {
static $analysis = null;
if ($analysis === null) {
$analysis = [
'status' => true,
'files' => [],
'case_updated' => false,
'dispute_summary' => '',
'censorship_issues' => false,
'verdict' => 'Прошло модерацию',
'dispute_type' => '',
];
}
logMessage("Обрабатываем PDF: $pdfFile");
$text = ExtractTextFromPDF($pdfFile);
if (strpos($text, "Ошибка:") !== false) {
logMessage("Ошибка при обработке: $text");
return json_encode(["error" => $text]);
}
logMessage("Текст успешно извлечен, отправляем в GPT-4-Turbo.");
$gptAnalysis = AnalyzeTextWithGPT($text);
if (!$gptAnalysis) {
logMessage("Ошибка: GPT-4-Turbo не вернул ответ.");
return json_encode(["error" => "GPT-4-Turbo не вернул данные"]);
}
UpdateAnalysis($analysis, $gptAnalysis, $pdfFile);
// Если файлы продолжают поступать, возвращаем анализ + "waiting"
if (ReceivingFiles()) {
logMessage("Ожидание следующего файла...");
return json_encode(["status" => "waiting", "current_analysis" => $analysis], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
} else {
CheckFinalVerdict($analysis);
logMessage("Все файлы обработаны, завершаем.");
return json_encode(["status" => "complete", "final_analysis" => $analysis], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
}
function ExtractTextFromPDF($pdfFile) {
logMessage("Начинаем извлечение текста из PDF: $pdfFile");
if (!file_exists($pdfFile)) {
logMessage("Ошибка: Файл PDF не найден ($pdfFile)");
return "";
}
$text = shell_exec("pdftotext -layout $pdfFile -");
logMessage("Распознанных символов: " . mb_strlen($text));
logMessage("Первые 500 символов: " . mb_substr($text, 0, 500));
logMessage("Последние 500 символов: " . mb_substr($text, -500));
return trim($text);
}
function AnalyzeTextWithGPT($text) {
$task = "Анализируй следующий текстовый документ:
1. Определи тип документа (например, договор, претензия, ответ на претензию, подтверждение оплаты).
2. Проверь соответствие названия файла его содержимому.
3. Проверь наличие ненормативной лексики.
4. Определи ключевые моменты спора (если есть).
5. Вынеси итоговый вердикт.";
$body = json_encode([
"model" => "gpt-4-turbo",
"messages" => [
["role" => "system", "content" => $task],
["role" => "user", "content" => $text]
],
"max_tokens" => 4000
]);
logMessage("Отправка запроса в GPT-4-Turbo...");
logMessage("Запрос: " . substr($body, 0, 1000));
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.proxyapi.ru/openai/v1/chat/completions',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer sk-GS24OxHQYfq8ErW5CRLoN5F1CfJPxNsY'
]
]);
$response = curl_exec($curl);
curl_close($curl);
logMessage("Ответ от GPT-4-Turbo: " . substr($response, 0, 1000));
return json_decode($response, true);
}
function UpdateAnalysis(&$analysis, $gptAnalysis, $pdfFile) {
$responseContent = $gptAnalysis['choices'][0]['message']['content'] ?? '';
if (empty($responseContent)) {
logMessage("Ошибка: Нейросеть вернула пустой ответ.");
return;
}
$responseContent = mb_convert_encoding($responseContent, "UTF-8", "auto");
if (strpos($responseContent, "{") === false) {
logMessage("GPT-4-Turbo вернул текст, а не JSON. Пытаемся извлечь данные вручную.");
$fileAnalysis = [
'name' => basename($pdfFile),
'type' => ExtractValueFromGPTResponse($responseContent, "Тип документа"),
'content_match' => ExtractValueFromGPTResponse($responseContent, "Соответствие названия") === "да",
'censorship' => ExtractValueFromGPTResponse($responseContent, "Наличие ненормативной лексики") === "да",
'requires_manual_check' => false,
'violations' => [],
];
} else {
$parsedData = json_decode($responseContent, true);
if (!$parsedData) {
logMessage("Ошибка: JSON-ответ содержит ошибки. Декодируем вручную.");
return;
}
$fileAnalysis = [
'name' => basename($pdfFile),
'type' => $parsedData['Тип документа'] ?? '',
'content_match' => $parsedData['Соответствие названия'] ?? true,
'censorship' => $parsedData['Наличие ненормативной лексики'] ?? false,
'requires_manual_check' => false,
'violations' => [],
];
}
if (!empty($fileAnalysis['type'])) {
$analysis['case_updated'] = true;
$analysis['dispute_summary'] .= " | Добавлен документ: {$fileAnalysis['type']}";
$analysis['dispute_type'] = DetermineDisputeType($fileAnalysis['type']);
}
if ($fileAnalysis['censorship']) {
$analysis['censorship_issues'] = true;
$analysis['verdict'] = "Не прошло модерацию (требуется участие человека)";
}
$analysis['files'][] = $fileAnalysis;
}
function ExtractValueFromGPTResponse($response, $key) {
$lines = explode("\n", $response);
foreach ($lines as $line) {
if (stripos($line, $key) !== false) {
return trim(str_ireplace($key . ":", "", $line));
}
}
return null;
}
function CheckFinalVerdict(&$analysis) {
if ($analysis['censorship_issues']) {
logMessage("Обнаружены проблемы с цензурой. Обновляем вердикт.");
$analysis['verdict'] = "Не прошло модерацию (требуется участие человека)";
} elseif (empty($analysis['files'])) {
logMessage("Обнаружена ошибка: файлы обработаны, но не добавлены в список.");
$analysis['verdict'] = "Ошибка анализа (файл не записан)";
} else {
logMessage("Финальный вердикт: Прошло модерацию.");
$analysis['verdict'] = "Прошло модерацию";
}
}
function DetermineDisputeType($fileType) {
$types = [
"договор" => "некачественная услуга",
"претензия" => "не возвращают деньги",
"ответ на претензию" => "товар не привезли",
"подтверждение оплаты" => "финансовый спор"
];
return $types[$fileType] ?? "не определено";
}
function ReceivingFiles() {
$processingLock = "storage/processing.lock";
if (file_exists($processingLock)) {
logMessage("Есть сигнал о поступлении новых файлов. Ожидание...");
return true;
}
logMessage("Файлы больше не поступают. Завершаем обработку.");
return false;
}
function logMessage($message) {
$logFile = "logs/GPT.log";
if (!is_dir(dirname($logFile))) {
mkdir(dirname($logFile), 0777, true);
}
file_put_contents($logFile, date("Y-m-d H:i:s") . " - " . mb_convert_encoding($message, "UTF-8", "auto") . PHP_EOL, FILE_APPEND);
}
//старый код 3
/*
function logMessage($message) {
$logFile = "logs/GPT.log"; // Путь к файлу логов
$logDir = dirname($logFile);
// Если папка логов не существует, создаем
if (!is_dir($logDir)) {
mkdir($logDir, 0777, true);
}
// file_put_contents($logFile, date("Y-m-d H:i:s") . " - " . $message . "\n", FILE_APPEND);
file_put_contents($logFile, date("Y-m-d H:i:s") . " - " . utf8_encode($message) . "\n", FILE_APPEND);
}
function ExtractTextFromPDF($pdfFile) {
logMessage("Начинаем извлечение текста из PDF: $pdfFile");
// Проверяем существование файла
if (!file_exists($pdfFile)) {
logMessage("Ошибка: Файл PDF не найден ($pdfFile)");
return "Ошибка: Файл не найден.";
}
// Извлекаем текст из PDF
$text = shell_exec("pdftotext -layout $pdfFile -");
// Логируем количество символов
logMessage("Распознанных символов: " . mb_strlen($text));
// Логируем начало и конец текста
logMessage("Первые 500 символов: " . substr($text, 0, 500));
logMessage("Последние 500 символов: " . substr($text, -500));
// Если текст есть, возвращаем его, иначе переходим к OCR
if (!empty(trim($text))) {
return trim($text);
}
logMessage("Текст не найден, запускаем OCR...");
return OCRFromPDF($pdfFile);
}
function OCRFromPDF($pdfFile) {
logMessage("Запуск OCR для PDF: $pdfFile");
$outputFolder = "logs/pdf_images/";
if (!is_dir($outputFolder)) {
mkdir($outputFolder, 0777, true);
}
shell_exec("pdftoppm -jpeg $pdfFile $outputFolder/output");
logMessage("PDF конвертирован в изображения.");
$images = glob($outputFolder . "*.jpg");
if (empty($images)) {
logMessage("Ошибка: Не удалось конвертировать PDF в изображения.");
return "Ошибка: Не удалось конвертировать PDF в изображения.";
}
$recognizedText = "";
foreach ($images as $image) {
logMessage("Распознаем текст с изображения: $image");
$text = shell_exec("tesseract $image stdout -l rus+eng");
logMessage("Распознанный текст: " . substr($text, 0, 500));
$recognizedText .= "\n" . trim($text);
}
return empty(trim($recognizedText)) ? "Ошибка: Не удалось распознать текст." : trim($recognizedText);
}
function CheckPDF($pdfFile) {
logMessage("Обрабатываем PDF: $pdfFile");
$text = ExtractTextFromPDF($pdfFile);
if (strpos($text, "Ошибка:") !== false) {
logMessage("Ошибка при обработке: $text");
return ["error" => $text];
}
logMessage("Текст успешно извлечен, отправляем в GPT-4-Turbo.");
return AnalyzeTextWithGPT($text);
}
function AnalyzeTextWithGPT($text) {
logMessage("Отправка запроса в GPT-4-Turbo...");
$task = "Анализируй следующий текстовый документ:
1. Определи тип документа (например, договор, претензия, ответ на претензию, подтверждение оплаты).
2. Проверь соответствие названия файла его реальному содержимому.
3. Проанализируй документ на наличие ненормативной лексики.
4. Определи ключевые моменты спора, если они есть.
5. Вынеси итоговый вердикт (Прошло модерацию / Не прошло модерацию).";
$body = json_encode([
"model" => "gpt-4-turbo",
"messages" => [
["role" => "system", "content" => $task],
["role" => "user", "content" => $text]
],
"max_tokens" => 4000
]);
logMessage("Запрос к GPT-4-Turbo: " . substr($body, 0, 1000));
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.proxyapi.ru/openai/v1/chat/completions',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer sk-GS24OxHQYfq8ErW5CRLoN5F1CfJPxNsY'
]
]);
$response = curl_exec($curl);
logMessage("Ответ от GPT-4-Turbo: " . substr($response, 0, 1000));
curl_close($curl);
return json_decode($response, true);
}
//старый код 2
function CheckPDF($PDFFile) {
static $analysis = [
'status' => true,
'files' => [],
'case_updated' => false,
'dispute_summary' => '',
'censorship_issues' => false,
'verdict' => 'Прошло модерацию',
'dispute_type' => '',
];
// Разбираем PDF на изображения
$files = pdf2jpg($PDFFile);
$file_analysis = [
'name' => basename($PDFFile),
'type' => '',
'content_match' => true,
'censorship' => false,
'requires_manual_check' => false,
'violations' => [],
];
$page = 1;
foreach ($files as $jpg) {
$link = 'https://crm.clientright.ru/tmp/' . basename($jpg);
$found = AnalyzeImage('Задача: Анализируй каждый загружаемый документ, выполняя следующие шаги:
1. Обновление списка файлов
o Добавь новый файл в список уже загруженных документов.
o Определи его содержимое (например, "договор", "претензия", "ответ на претензию", "подтверждение оплаты" и т. д.).
o Проверь, соответствует ли название файла его реальному содержимому.
o Если обнаружено несоответствие, укажи, в чем проблема.
2. Обновление анализа спора
o Если ранее уже загружены связанные файлы, обнови анализ спора.
o Уточни истца (потребителя) и ответчика (компанию, на которую подана жалоба).
o Дополни суть спора с учетом новых данных.
o Если новый файл содержит важную информацию, измени или дополни аргументы сторон.
3. Проверка на цензуру
o Проанализируй новый документ на наличие ненормативной лексики и нецензурных изображений.
o Если это изображение, укажи, требуется ли его ручная проверка.
4. Обновление итогового вердикта
o Если после добавления нового файла вся информация корректна, оставь "Прошло модерацию".
o Если появились несоответствия или спорные моменты, измени статус на "Не прошло модерацию (требуется участие человека)", указав, что именно требует проверки.
5. Характер спора
o Если суть спора изменилась или уточнилась, обнови краткое описание (например, "некачественный товар", "товар не привезли", "не возвращают деньги", "некачественная услуга" и т. д.).
Важно:1.Если файл связан с уже загруженными данными, обнови анализ с учетом новой информации. 2. Если файл независимый, создай новый кейс анализа.
• Итоговый отчет должен оставаться актуальным, а не дублироваться при поступлении новых файлов.', $link);
if ($found) {
$file_analysis['censorship'] = true;
$file_analysis['violations'][] = $page;
$analysis['censorship_issues'] = true;
}
unlink($jpg);
$page++;
}
// Определение типа документа (эмуляция)
$file_analysis['type'] = IdentifyFileType($PDFFile);
$file_analysis['content_match'] = CheckFileNameMatchesContent($PDFFile, $file_analysis['type']);
// Обновление данных по спору
if ($file_analysis['type']) {
$analysis['case_updated'] = true;
$analysis['dispute_summary'] = UpdateDisputeSummary($file_analysis['type']);
$analysis['dispute_type'] = DetermineDisputeType($file_analysis['type']);
}
// Проверка на цензуру и финальный вердикт
if ($file_analysis['censorship'] || !$file_analysis['content_match']) {
$analysis['verdict'] = "Не прошло модерацию (требуется участие человека)";
}
// Добавляем файл в общий список
$analysis['files'][] = $file_analysis;
// Если файлы еще загружаются — возвращаем 0
if (ReceivingFiles()) {
return 0;
}
// Когда загрузка завершена, возвращаем итоговый анализ
return $analysis;
}
function AnalyzeImage($task, $image) {
$body = json_encode([
"model" => "gpt-4-turbo",
// "model" => "gpt-o1",
"messages" => [
["role" => "user", "content" => [
["type" => "text", "text" => $task],
["type" => "image_url", "image_url" => ["url" => $image]]
]]
],
"max_tokens" => 4000
]);
file_put_contents('logs/GPT.log', date('Y-m-d H:i:s') . " Тело запроса:\n" . $body . "\n", FILE_APPEND);
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.proxyapi.ru/openai/v1/chat/completions',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer sk-GS24OxHQYfq8ErW5CRLoN5F1CfJPxNsY'
]
]);
$response = curl_exec($curl);
file_put_contents('logs/GPT.log', date('Y-m-d H:i:s') . " Ответ от нейросети:\n" . $response . "\n", FILE_APPEND);
curl_close($curl);
$response = json_decode($response, true);
return isset($response['choices'][0]['message']['content']) && $response['choices'][0]['message']['content'] == '1';
}
function IdentifyFileType($file) {
// Заглушка: определение типа файла по содержимому (можно подключить AI)
$types = ["договор", "претензия", "ответ на претензию", "подтверждение оплаты"];
return $types[array_rand($types)];
}
function CheckFileNameMatchesContent($file, $detectedType) {
// Эмуляция проверки соответствия названия содержимому
return stripos($file, $detectedType) !== false;
}
function UpdateDisputeSummary($fileType) {
// Заглушка обновления информации по спору
return "Обновлен анализ спора на основе документа: $fileType";
}
function DetermineDisputeType($fileType) {
// Заглушка определения характера спора
$types = [
"договор" => "некачественная услуга",
"претензия" => "не возвращают деньги",
"ответ на претензию" => "товар не привезли",
"подтверждение оплаты" => "финансовый спор"
];
return $types[$fileType] ?? "не определено";
}
function ReceivingFiles() {
// Заглушка, возвращает true, если файлы продолжают поступать
return rand(0, 1) == 1;
}
*/
//старый код 2
function CheckPDF($PDFFile) {
$files = pdf2jpg($PDFFile); // Разобрали PDF на набор JPG-ов
$result = [];
$result['status'] = true;
$page = 1;
foreach ($files as $jpg) {
//echo $jpg.'<br>';
$link = 'https://crm.clientright.ru/tmp/'.basename($jpg);
$found = AnalyzeImage('Проанализируй содержимое и определи - есть в нем матерные слова и выражения в любых склонениях? Ответ представь одной цифрой без дополнительных комментариев - при наличии матерных слов верни 1, при отсутствии верни 0', $link);
if ($found) {
if ($result['status'] == true) { // нашли первое нарушение в файле
$result['pages'] = []; // создадим массив со списком страниц с нарушениями
$result['status'] = false;
}
$result['pages'][] = $page;
}
unlink($jpg); // Удаляем файл, он нам больше не нужен
$page++;
}
return $result;
}
function AnalyzeImage($task, $image) {
$body = '{"model": "gpt-4-turbo","messages": [{"role": "user","content": [{"type": "text","text": "'.$task.'"},{"type": "image_url","image_url": {"url": "'.$image.'"}}]}],"max_tokens": 300}';
$logstring = date('Y-m-d H:i:s').' Тело запроса:'.PHP_EOL.$body.PHP_EOL;
file_put_contents('logs/GPT.log', $logstring, FILE_APPEND);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.proxyapi.ru/openai/v1/chat/completions',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'Authorization: Bearer sk-GS24OxHQYfq8ErW5CRLoN5F1CfJPxNsY'
),
));
$response = curl_exec($curl);
$logstring = date('Y-m-d H:i:s').' Ответ от нейросети:'.PHP_EOL.$response.PHP_EOL;
file_put_contents('logs/GPT.log', $logstring, FILE_APPEND);
if ($response == 'Internal Server Error') {
sleep(10);
$response = curl_exec($curl);
$logstring = date('Y-m-d H:i:s').' Ответ от нейросети:'.PHP_EOL.$response.PHP_EOL;
file_put_contents('logs/GPT.log', $logstring, FILE_APPEND);
}
curl_close($curl);
$response = json_decode($response, true);
$result = $response['choices'][0]['message']['content'];
if ($result == '0') {
$output = false;
} else {
$output = true;
}
return $output;
}
?>