diff --git a/src/Helpers/FileHelper.php b/src/Helpers/FileHelper.php new file mode 100644 index 0000000..8e6cdf5 --- /dev/null +++ b/src/Helpers/FileHelper.php @@ -0,0 +1,69 @@ +isBase64($data) ) { + $data = base64_decode($data); + } elseif ($this->isUrl($data)) { + $data = file_get_contents($data); + } else { + if (!$this->isBinary($data)) { + throw new \Exception("Cannot create file. Invalid data passed."); + } + } + + // Determine the extension + $ext = $this->getExtensionFromMimeType($mimeType); + + // Generate a unique filename + $filename = uniqid() . '.' . $ext; + $filePath = public_path('uploads/' . $filename); + + // Ensure the uploads directory exists + if (!file_exists(public_path('uploads'))) { + mkdir(public_path('uploads'), 0777, true); + } + + // Store the file + file_put_contents($filePath, $data); + + // Return the local path of the stored file + return $filePath; + } + + private function isBase64($data) + { + // Check if the data is base64 encoded + return base64_encode(base64_decode($data, true)) === $data; + } + + private function isBinary($data) + { + // Check if the data is binary + return preg_match('~[^\x20-\x7E\t\r\n]~', $data) > 0; + } + + private function isUrl($data) + { + // Check if the data is a valid URL + return filter_var($data, FILTER_VALIDATE_URL) !== false; + } + + private function getExtensionFromMimeType($mimeType) + { + // Map MIME types to file extensions + $mimeTypes = [ + 'image/jpeg' => 'jpg', + 'image/png' => 'png', + 'image/gif' => 'gif', + 'audio/mpeg' => 'mp3' + ]; + + return $mimeTypes[$mimeType] ?? throw new \Exception("Mime-type $mimeType is not supported"); + } +} diff --git a/stubs/default/routes/web.sidekick.php b/stubs/default/routes/web.sidekick.php index 463d913..876bb2a 100644 --- a/stubs/default/routes/web.sidekick.php +++ b/stubs/default/routes/web.sidekick.php @@ -1,6 +1,7 @@ complete()->sendMessage( @@ -99,7 +100,7 @@ Route::post('/sidekick/playground/audio', function (Request $request) { // Loads a new instance of Sidekick with OpenAI - $sidekick = create(new OpenAi()); + $sidekick = Sidekick::create(new OpenAi()); // Send text to be converted by Sidekick to audio $audio = $sidekick->audio()->fromText( @@ -107,12 +108,14 @@ text: $request->get('text_to_convert') ); + $savedFile = (new FileHelper())->store($audio, 'audio/mpeg'); + // Return the base64 encoded audio file to the front end - return view('Pages.audio', ['audio' => base64_encode($audio)]); + return view('Pages.audio', ['audio' => base64_encode($audio), 'savedFile' => $savedFile]); }); Route::post('/sidekick/playground/image', function (Request $request) { - $sidekick = create(new OpenAi()); + $sidekick = Sidekick::create(new OpenAi()); $image = $sidekick->image()->make( model:'dall-e-3', prompt: $request->get('text_to_convert'), @@ -120,11 +123,13 @@ height:'1024' ); - return view('Pages.image', ['image' => $image['data'][0]['url']]); + $savedFile = (new FileHelper())->store($image['data'][0]['url'], 'image/png'); + + return view('Pages.image', ['image' => $image['data'][0]['url'], 'savedFile' => $savedFile]); }); Route::post('/sidekick/playground/transcribe', function (Request $request) { - $sidekick = create(new OpenAi()); + $sidekick = Sidekick::create(new OpenAi()); $response = $sidekick->transcribe()->audioFile( model:'whisper-1', filePath:$request->get('audio') @@ -133,7 +138,7 @@ }); Route::post('/sidekick/playground/embedding', function (Request $request) { - $sidekick = create(new OpenAi()); + $sidekick = Sidekick::create(new OpenAi()); $response = $sidekick->embedding()->make( model:'text-embedding-3-large', input: $request->get('text'), @@ -146,7 +151,7 @@ }); Route::post('/sidekick/playground/moderate', function (Request $request) { - $sidekick = create(new OpenAi()); + $sidekick = Sidekick::create(new OpenAi()); $response = $sidekick->moderate()->text( model:'text-moderation-latest', content: $request->get('text')