api_key = $api_key; $this->client = $client ?: new Client([ 'base_uri' => 'https://api.openai.com/v1/', 'headers' => [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $this->api_key ] ]); $this->log = $log ?: new NullLogger(); if (empty($api_key)) { throw new RuntimeException('No valid API key was provided.'); } } /** * Generate an image using DALL-E API and save it locally. * * @param string $prompt * @param string $localDirectory * @param string $size * @param int $n * @return array|null */ public function generateImage(string $prompt, string $localDirectory, string $size = '1024x1024', int $n = 4): ?array { $data = [ 'prompt' => $prompt, 'n' => $n, 'size' => $size ]; try { $response = $this->client->post('images/generations', ['json' => $data]); $json = json_decode((string) $response->getBody(), true); if (json_last_error() === JSON_ERROR_NONE) { $savedImages = []; foreach ($json['data'] as $imageData) { $imageUrl = $imageData['url']; $localFilePath = $this->saveImage($imageUrl, $localDirectory); $savedImages[] = $localFilePath; } return $savedImages; } else { $this->log->error('Failed to decode JSON response', ['json_error' => json_last_error_msg()]); return null; } } catch (RequestException $e) { $this->log->error('RequestException encountered', ['message' => $e->getMessage()]); return null; } } /** * Save an image from a URL to a local file path. * * @param string $imageUrl * @param string $localDirectory * @return string */ private function saveImage(string $imageUrl, string $localDirectory): string { $imageFileName = basename(parse_url($imageUrl, PHP_URL_PATH)); $localFilePath = $localDirectory . '/' . $imageFileName; $client = new Client(); $response = $client->get($imageUrl, ['sink' => $localFilePath]); if ($response->getStatusCode() == 200) { $this->log->info('Image saved successfully', ['path' => $localFilePath]); return $localFilePath; } else { $this->log->error('Failed to save the image', ['status_code' => $response->getStatusCode()]); throw new RuntimeException('Failed to save the image: ' . $response->getStatusCode()); } } /** * Generate a script using the OpenAI GPT-3.5 Turbo model. * * @param string $role * @param string $prompt * @param int $maxTokens * @param float $temperature * @return string|null */ public function generateScript(string $role, string $prompt, int $maxTokens = 3600, float $temperature = 1.0): ?string { $data = [ 'model' => 'gpt-3.5-turbo', 'messages' => [ ['role' => 'system', 'content' => $role], ['role' => 'user', 'content' => $prompt], ], 'max_tokens' => $maxTokens, 'temperature' => $temperature ]; try { $response = $this->client->post('chat/completions', ['json' => $data]); $json = json_decode((string) $response->getBody(), true); if (json_last_error() === JSON_ERROR_NONE) { $assistantResponse = $json['choices'][0]['message']['content']; return $assistantResponse; } else { $this->log->error('Failed to decode JSON response', ['json_error' => json_last_error_msg()]); return null; } } catch (RequestException $e) { $this->log->error('RequestException encountered', ['message' => $e->getMessage()]); return null; } } /** * Generate image variations using DALL-E API and save them locally. * * @param string $imagePath * @param string $localDirectory * @param int $n * @param string $size * @return array|null */ public function generateImageVariations(string $imagePath, string $localDirectory, int $n = 4, string $size = '1024x1024'): ?array { $data = [ 'n' => $n, 'size' => $size, 'image' => curl_file_create($imagePath) ]; try { $response = $this->client->post('images/variations', ['multipart' => $data]); $json = json_decode((string) $response->getBody(), true); if (json_last_error() === JSON_ERROR_NONE) { $savedImages = []; foreach ($json['data'] as $imageData) { $imageUrl = $imageData['url']; $localFilePath = $this->saveImage($imageUrl, $localDirectory); $savedImages[] = $localFilePath; } return $savedImages; } else { $this->log->error('Failed to decode JSON response', ['json_error' => json_last_error_msg()]); return null; } } catch (RequestException $e) { $this->log->error('RequestException encountered', ['message' => $e->getMessage()]); return null; } } }