Your IP : 216.73.217.77


Current Path : /home/users/unlimited/www/ultimate-ai.codeskitter.site/app/Services/Ai/OpenAI/
Upload File :
Current File : /home/users/unlimited/www/ultimate-ai.codeskitter.site/app/Services/Ai/OpenAI/FileSearchService.php

<?php

namespace App\Services\Ai\OpenAI;

use App\Helpers\Classes\ApiHelper;
use App\Models\SettingTwo;
use App\Models\UserOpenaiChat;
use Exception;
use Illuminate\Support\Facades\Http;
use OpenAI\Laravel\Facades\OpenAI;
use OpenAI\Responses\VectorStores\VectorStoreResponse;
use RuntimeException;

class FileSearchService
{
    protected string $apiKey;

    protected SettingTwo $settings_two;

    protected string $apiUrl = 'https://api.openai.com/v1/responses';

    public function __construct()
    {
        $this->apiKey = ApiHelper::setOpenAiKey();
        $this->settings_two = SettingTwo::getCache();
        set_time_limit(500);
    }

    /**
     * Upload a file to OpenAI's API.
     */
    public function uploadFile(string $filePath, string $purpose = 'user_data'): ?string
    {
        try {
            $response = OpenAI::files()->upload([
                'file'    => fopen($filePath, 'rb'),
                'purpose' => $purpose,
            ]);

            if ($response->status === 'processed') {
                return $response->id;
            }

            throw new RuntimeException("File upload failed with status: {$response->status}");
        } catch (Exception $e) {
            return null;
        }
    }

    /**
     * Create a vector store using OpenAI's API.
     */
    public function createVectorStore(string $name, string $fileIds): ?VectorStoreResponse
    {
        try {
            return OpenAI::vectorStores()->create([
                'name'     => $name,
                'file_ids' => [$fileIds],
            ]);
        } catch (Exception $e) {
            return null;
        }
    }

    /**
     * Check a vector store's status using OpenAI's API.
     */
    public function checkVectorStoreStatus(string $vectorStoreId): ?VectorStoreResponse
    {
        try {
            return OpenAI::vectorStores()->retrieve($vectorStoreId);
        } catch (Exception $e) {
            return null;
        }
    }

    /**
     * Perform a file search using OpenAI's API.
     */
    public function searchInFile(array $options, ?UserOpenaiChat $chat): ?string
    {
        $history = $options['messages'];
        $lastPrompt = end($history)['content'] ?? '';

        $payload = [
            'model' => $options['model'],
            'tools' => [
                [
                    'type'             => 'file_search',
                    'vector_store_ids' => [$chat?->openai_vector_id],
                ],
            ],
            'input' => $lastPrompt,
        ];

        $response = Http::withHeaders([
            'Content-Type'  => 'application/json',
            'Authorization' => 'Bearer ' . $this->apiKey,
        ])->post($this->apiUrl, $payload);

        if ($response->successful()) {
            $responseData = $response->json();

            $outputText = null;
            if (isset($responseData['output']) && is_array($responseData['output'])) {
                foreach ($responseData['output'] as $item) {
                    if ($item['type'] === 'message' && isset($item['content']) && is_array($item['content'])) {
                        foreach ($item['content'] as $content) {
                            if ($content['type'] === 'output_text' && isset($content['text'])) {
                                $outputText = $content['text'];

                                break 2;
                            }
                        }
                    }
                }
            }

            return $outputText;
        }

        return '';
    }
}