-
-
Notifications
You must be signed in to change notification settings - Fork 270
Expand file tree
/
Copy pathImages.php
More file actions
81 lines (66 loc) · 2.47 KB
/
Images.php
File metadata and controls
81 lines (66 loc) · 2.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php
declare(strict_types=1);
namespace Prism\Prism\Providers\OpenAI\Handlers;
use Illuminate\Http\Client\PendingRequest;
use Illuminate\Http\Client\Response as ClientResponse;
use Prism\Prism\Exceptions\PrismException;
use Prism\Prism\Images\Request;
use Prism\Prism\Images\Response;
use Prism\Prism\Images\ResponseBuilder;
use Prism\Prism\Providers\OpenAI\Concerns\ProcessesRateLimits;
use Prism\Prism\Providers\OpenAI\Concerns\ValidatesResponse;
use Prism\Prism\Providers\OpenAI\Maps\ImageRequestMap;
use Prism\Prism\ValueObjects\GeneratedImage;
use Prism\Prism\ValueObjects\Meta;
use Prism\Prism\ValueObjects\Usage;
use Throwable;
class Images
{
use ProcessesRateLimits;
use ValidatesResponse;
public function __construct(protected PendingRequest $client) {}
public function handle(Request $request): Response
{
$response = $this->sendRequest($request);
$this->validateResponse($response);
$data = $response->json();
$images = $this->extractImages($data);
$responseBuilder = new ResponseBuilder(
usage: new Usage(
promptTokens: data_get($data, 'usage.input_tokens', data_get($data, 'usage.prompt_tokens', 0)),
completionTokens: data_get($data, 'usage.output_tokens', data_get($data, 'usage.completion_tokens', 0)),
),
meta: new Meta(
id: data_get($data, 'id', 'img_'.bin2hex(random_bytes(8))),
model: data_get($data, 'model', $request->model()),
rateLimits: $this->processRateLimits($response)
),
images: $images,
);
return $responseBuilder->toResponse();
}
protected function sendRequest(Request $request): ClientResponse
{
try {
return $this->client->post('images/generations', ImageRequestMap::map($request));
} catch (Throwable $e) {
throw PrismException::providerRequestError($request->model(), $e);
}
}
/**
* @param array<string, mixed> $data
* @return GeneratedImage[]
*/
protected function extractImages(array $data): array
{
$images = [];
foreach (data_get($data, 'data', []) as $imageData) {
$images[] = new GeneratedImage(
url: data_get($imageData, 'url'),
base64: data_get($imageData, 'b64_json'),
revisedPrompt: data_get($imageData, 'revised_prompt'),
);
}
return $images;
}
}