Spaces:
Runtime error
Runtime error
declare(strict_types=1); | |
use GuzzleHttp\Client; | |
use GuzzleHttp\Exception\RequestException; | |
use Psr\Log\LoggerInterface; | |
use Psr\Log\NullLogger; | |
/** | |
* Class OpenAI | |
*/ | |
class OpenAI { | |
/** | |
* @var string | |
*/ | |
private $api_key; | |
/** | |
* @var Client | |
*/ | |
private $client; | |
/** | |
* @var LoggerInterface | |
*/ | |
private $log; | |
/** | |
* OpenAI constructor. | |
* | |
* @param string $api_key | |
* @param Client|null $client | |
* @param LoggerInterface|null $log | |
*/ | |
public function __construct(string $api_key, Client $client = null, LoggerInterface $log = null) { | |
$this->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; | |
} | |
} | |
} | |