148 lines
5.8 KiB
PHP
148 lines
5.8 KiB
PHP
|
|
<?php
|
|||
|
|
require_once 'aiassist/config.php';
|
|||
|
|
require_once 'aiassist/logger.php';
|
|||
|
|
require_once 'aiassist/gptAssistant.php';
|
|||
|
|
require_once 'aiassist/vectorgpt.php';
|
|||
|
|
|
|||
|
|
// 🔹 Настройки
|
|||
|
|
const DOCUMENTS_FOLDER = __DIR__ . "/documents"; // Папка с документами
|
|||
|
|
const LOG_FILE = 'logs/document_upload.log'; // Лог-файл
|
|||
|
|
|
|||
|
|
function logMessage2($message) {
|
|||
|
|
$logDir = __DIR__ . '/logs';
|
|||
|
|
$logFile = $logDir . '/document_upload.log';
|
|||
|
|
|
|||
|
|
// Проверяем, существует ли папка логов, если нет — создаём её
|
|||
|
|
if (!is_dir($logDir)) {
|
|||
|
|
mkdir($logDir, 0777, true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Проверяем, доступен ли файл логов для записи
|
|||
|
|
if (!is_writable($logDir)) {
|
|||
|
|
die("❌ Ошибка: Нет прав на запись в папку logs!\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Записываем лог
|
|||
|
|
file_put_contents($logFile, date('Y-m-d H:i:s') . " - " . $message . "\n", FILE_APPEND | LOCK_EX);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 🔹 Прикрепляет файлы к `thread_id`
|
|||
|
|
*/
|
|||
|
|
function attachFilesToThread($threadId, $fileIds) {
|
|||
|
|
logMessage2("🔄 Начинаем запуск анализа документов в треде: $threadId");
|
|||
|
|
logMessage2("📂 Список файлов для анализа: " . json_encode($fileIds));
|
|||
|
|
|
|||
|
|
$payload = json_encode([
|
|||
|
|
"thread_id" => $threadId,
|
|||
|
|
"assistant_id" => ASSISTANT_ID,
|
|||
|
|
"tool_resources" => [
|
|||
|
|
"file_search" => [
|
|||
|
|
"file_ids" => $fileIds
|
|||
|
|
]
|
|||
|
|
]
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
logMessage2("📡 Отправляем запрос на запуск анализа в API: $payload");
|
|||
|
|
|
|||
|
|
$ch = curl_init();
|
|||
|
|
curl_setopt_array($ch, [
|
|||
|
|
CURLOPT_URL => "https://api.proxyapi.ru/openai/v1/threads/$threadId/runs", // Заменили v2 на v1
|
|||
|
|
CURLOPT_RETURNTRANSFER => true,
|
|||
|
|
CURLOPT_POST => true,
|
|||
|
|
CURLOPT_POSTFIELDS => $payload,
|
|||
|
|
CURLOPT_HTTPHEADER => [
|
|||
|
|
'Authorization: Bearer ' . OPENAI_API_KEY,
|
|||
|
|
'Content-Type: application/json'
|
|||
|
|
]
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
$response = curl_exec($ch);
|
|||
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|||
|
|
$curlError = curl_error($ch);
|
|||
|
|
curl_close($ch);
|
|||
|
|
|
|||
|
|
if ($curlError) {
|
|||
|
|
logMessage2("❌ Ошибка cURL при запуске анализа: $curlError");
|
|||
|
|
die("❌ Ошибка cURL при запуске анализа: $curlError\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
logMessage2("📡 Ответ API при запуске анализа (HTTP $httpCode): $response");
|
|||
|
|
|
|||
|
|
$decoded = json_decode($response, true);
|
|||
|
|
if ($httpCode !== 200 || !isset($decoded['id'])) {
|
|||
|
|
logMessage2("❌ Ошибка запуска анализа! API ответил: " . json_encode($decoded, JSON_UNESCAPED_UNICODE));
|
|||
|
|
die("❌ Ошибка запуска анализа! Ответ API: " . json_encode($decoded, JSON_UNESCAPED_UNICODE) . "\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
logMessage2("✅ Анализ документов успешно запущен! Run ID: " . $decoded['id']);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/* ===================== Основной скрипт ===================== */
|
|||
|
|
|
|||
|
|
// 🔹 1️⃣ Загружаем файлы в OpenAI
|
|||
|
|
logMessage2("🚀 Запуск скрипта загрузки файлов и создания треда...");
|
|||
|
|
|
|||
|
|
$fileIds = [];
|
|||
|
|
$supportedExtensions = ['txt', 'doc', 'docx', 'pdf'];
|
|||
|
|
|
|||
|
|
if (!is_dir(DOCUMENTS_FOLDER)) {
|
|||
|
|
die("❌ Ошибка: Папка " . DOCUMENTS_FOLDER . " не найдена!\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
foreach (scandir(DOCUMENTS_FOLDER) as $file) {
|
|||
|
|
if ($file[0] === '.') continue; // Пропускаем скрытые файлы
|
|||
|
|
|
|||
|
|
$filePath = DOCUMENTS_FOLDER . '/' . $file;
|
|||
|
|
$extension = pathinfo($file, PATHINFO_EXTENSION);
|
|||
|
|
|
|||
|
|
if (in_array(strtolower($extension), $supportedExtensions)) {
|
|||
|
|
echo "🔄 Загружаем: $file ...\n";
|
|||
|
|
logMessage2("🔄 Загружаем файл: $filePath");
|
|||
|
|
$fileId = uploadFileToOpenAI($filePath); // Используем функцию из vectorgpt.php
|
|||
|
|
if ($fileId) {
|
|||
|
|
echo "✅ Файл загружен! File ID: $fileId\n";
|
|||
|
|
logMessage2("✅ Файл загружен! File ID: $fileId");
|
|||
|
|
$fileIds[] = $fileId;
|
|||
|
|
} else {
|
|||
|
|
echo "❌ Ошибка загрузки файла: $file\n";
|
|||
|
|
logMessage2("❌ Ошибка загрузки файла: $filePath");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 🔹 2️⃣ Создаём новый `thread_id`
|
|||
|
|
logMessage2("🔄 Создаём новый `thread_id`...");
|
|||
|
|
$threadId = createNewThread();
|
|||
|
|
if (!$threadId) {
|
|||
|
|
logMessage2("❌ Ошибка создания треда!");
|
|||
|
|
die("❌ Ошибка создания треда!\n");
|
|||
|
|
}
|
|||
|
|
echo "✅ Создан новый `thread_id`: $threadId\n";
|
|||
|
|
logMessage2("✅ Создан новый `thread_id`: $threadId");
|
|||
|
|
|
|||
|
|
// 🔹 3️⃣ Прикрепляем файлы к `thread_id`
|
|||
|
|
if (!empty($fileIds)) {
|
|||
|
|
echo "🔄 Прикрепляем файлы к треду...\n";
|
|||
|
|
logMessage2("🔄 Прикрепляем файлы к `thread_id`: $threadId");
|
|||
|
|
if (attachFilesToThread($threadId, $fileIds)) {
|
|||
|
|
echo "✅ Файлы успешно прикреплены!\n";
|
|||
|
|
logMessage2("✅ Файлы успешно прикреплены к `thread_id`: $threadId");
|
|||
|
|
} else {
|
|||
|
|
logMessage2("❌ Ошибка прикрепления файлов к `thread_id`!");
|
|||
|
|
die("❌ Ошибка прикрепления файлов!\n");
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
echo "⚠️ Нет загруженных файлов для прикрепления.\n";
|
|||
|
|
logMessage2("⚠️ Нет загруженных файлов для прикрепления.");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 🔹 4️⃣ Выводим `thread_id`
|
|||
|
|
echo "🎯 Используйте этот `thread_id` в запросах: $threadId\n";
|
|||
|
|
logMessage2("🎯 Завершено! Используйте `thread_id`: $threadId");
|
|||
|
|
|
|||
|
|
?>
|