Skip to content

Commit 3065e0f

Browse files
committed
client-34 Allowing new/custom model names
Closes #34
1 parent 84741c6 commit 3065e0f

16 files changed

+188
-130
lines changed

README.md

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,11 @@ you need to allow `php-http/discovery` composer plugin or install a PSR-18 compa
5252

5353
```php
5454
use GeminiAPI\Client;
55+
use GeminiAPI\Resources\ModelName;
5556
use GeminiAPI\Resources\Parts\TextPart;
5657

5758
$client = new Client('GEMINI_API_KEY');
58-
$response = $client->geminiPro()->generateContent(
59+
$response = $client->generativeModel(ModelName::GEMINI_PRO)->generateContent(
5960
new TextPart('PHP in less than 100 chars'),
6061
);
6162

@@ -71,11 +72,12 @@ print $response->text();
7172
```php
7273
use GeminiAPI\Client;
7374
use GeminiAPI\Enums\MimeType;
75+
use GeminiAPI\Resources\ModelName;
7476
use GeminiAPI\Resources\Parts\ImagePart;
7577
use GeminiAPI\Resources\Parts\TextPart;
7678

7779
$client = new Client('GEMINI_API_KEY');
78-
$response = $client->geminiProVision()->generateContent(
80+
$response = $client->generativeModel(ModelName::GEMINI_PRO)->generateContent(
7981
new TextPart('Explain what is in the image'),
8082
new ImagePart(
8183
MimeType::IMAGE_JPEG,
@@ -94,10 +96,11 @@ print $response->text();
9496

9597
```php
9698
use GeminiAPI\Client;
99+
use GeminiAPI\Resources\ModelName;
97100
use GeminiAPI\Resources\Parts\TextPart;
98101

99102
$client = new Client('GEMINI_API_KEY');
100-
$chat = $client->geminiPro()->startChat();
103+
$chat = $client->generativeModel(ModelName::GEMINI_PRO)->startChat();
101104

102105
$response = $chat->sendMessage(new TextPart('Hello World in PHP'));
103106
print $response->text();
@@ -132,6 +135,7 @@ This code will print "Hello World!" to the standard output.
132135
use GeminiAPI\Client;
133136
use GeminiAPI\Enums\Role;
134137
use GeminiAPI\Resources\Content;
138+
use GeminiAPI\Resources\ModelName;
135139
use GeminiAPI\Resources\Parts\TextPart;
136140

137141
$history = [
@@ -149,7 +153,7 @@ $history = [
149153
];
150154

151155
$client = new Client('GEMINI_API_KEY');
152-
$chat = $client->geminiPro()
156+
$chat = $client->generativeModel(ModelName::GEMINI_PRO)
153157
->startChat()
154158
->withHistory($history);
155159

@@ -179,6 +183,7 @@ Long responses may be broken into separate responses, and you can start receivin
179183

180184
```php
181185
use GeminiAPI\Client;
186+
use GeminiAPI\Resources\ModelName;
182187
use GeminiAPI\Resources\Parts\TextPart;
183188
use GeminiAPI\Responses\GenerateContentResponse;
184189

@@ -191,7 +196,7 @@ $callback = function (GenerateContentResponse $response): void {
191196
};
192197

193198
$client = new Client('GEMINI_API_KEY');
194-
$client->geminiPro()->generateContentStream(
199+
$client->generativeModel(ModelName::GEMINI_PRO)->generateContentStream(
195200
$callback,
196201
[new TextPart('PHP in less than 100 chars')],
197202
);
@@ -209,6 +214,7 @@ $client->geminiPro()->generateContentStream(
209214
use GeminiAPI\Client;
210215
use GeminiAPI\Enums\Role;
211216
use GeminiAPI\Resources\Content;
217+
use GeminiAPI\Resources\ModelName;
212218
use GeminiAPI\Resources\Parts\TextPart;
213219
use GeminiAPI\Responses\GenerateContentResponse;
214220

@@ -235,7 +241,7 @@ $callback = function (GenerateContentResponse $response): void {
235241
};
236242

237243
$client = new Client('GEMINI_API_KEY');
238-
$chat = $client->geminiPro()
244+
$chat = $client->generativeModel(ModelName::GEMINI_PRO)
239245
->startChat()
240246
->withHistory($history);
241247

@@ -261,11 +267,11 @@ This code will print "Hello World!" to the standard output.
261267

262268
```php
263269
use GeminiAPI\Client;
264-
use GeminiAPI\Enums\ModelName;
270+
use GeminiAPI\Resources\ModelName;
265271
use GeminiAPI\Resources\Parts\TextPart;
266272

267273
$client = new Client('GEMINI_API_KEY');
268-
$response = $client->embeddingModel(ModelName::Embedding)
274+
$response = $client->embeddingModel(ModelName::EMBEDDING_001)
269275
->embedContent(
270276
new TextPart('PHP in less than 100 chars'),
271277
);
@@ -282,10 +288,11 @@ print_r($response->embedding->values);
282288

283289
```php
284290
use GeminiAPI\Client;
291+
use GeminiAPI\Resources\ModelName;
285292
use GeminiAPI\Resources\Parts\TextPart;
286293

287294
$client = new Client('GEMINI_API_KEY');
288-
$response = $client->geminiPro()->countTokens(
295+
$response = $client->generativeModel(ModelName::GEMINI_PRO)->countTokens(
289296
new TextPart('PHP in less than 100 chars'),
290297
);
291298

@@ -329,6 +336,7 @@ use GeminiAPI\Client;
329336
use GeminiAPI\Enums\HarmCategory;
330337
use GeminiAPI\Enums\HarmBlockThreshold;
331338
use GeminiAPI\GenerationConfig;
339+
use GeminiAPI\Resources\ModelName;
332340
use GeminiAPI\Resources\Parts\TextPart;
333341
use GeminiAPI\SafetySetting;
334342

@@ -345,7 +353,7 @@ $generationConfig = (new GenerationConfig())
345353
->withStopSequences(['STOP']);
346354

347355
$client = new Client('GEMINI_API_KEY');
348-
$response = $client->geminiPro()
356+
$response = $client->generativeModel(ModelName::GEMINI_PRO)
349357
->withAddedSafetySetting($safetySetting)
350358
->withGenerationConfig($generationConfig)
351359
->generateContent(
@@ -357,6 +365,7 @@ $response = $client->geminiPro()
357365

358366
```php
359367
use GeminiAPI\Client as GeminiClient;
368+
use GeminiAPI\Resources\ModelName;
360369
use GeminiAPI\Resources\Parts\TextPart;
361370
use GuzzleHttp\Client as GuzzleClient;
362371

@@ -365,7 +374,7 @@ $guzzle = new GuzzleClient([
365374
]);
366375

367376
$client = new GeminiClient('GEMINI_API_KEY', $guzzle);
368-
$response = $client->geminiPro()->generateContent(
377+
$response = $client->generativeModel(ModelName::GEMINI_PRO)->generateContent(
369378
new TextPart('PHP in less than 100 chars')
370379
);
371380
```
@@ -388,6 +397,7 @@ You can also pass the headers you want to be used in the requests.
388397

389398
```php
390399
use GeminiAPI\Client;
400+
use GeminiAPI\Resources\ModelName;
391401
use GeminiAPI\Resources\Parts\TextPart;
392402
use GeminiAPI\Responses\GenerateContentResponse;
393403

@@ -402,7 +412,7 @@ $client = new Client('GEMINI_API_KEY');
402412
$client->withRequestHeaders([
403413
'User-Agent' => 'My Gemini-backed app'
404414
])
405-
->geminiPro()
415+
->generativeModel(ModelName::GEMINI_PRO)
406416
->generateContentStream(
407417
$callback,
408418
[new TextPart('PHP in less than 100 chars')],

src/Client.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,15 @@ public function geminiProFlash1_5(): GenerativeModel
8787
}
8888

8989

90-
public function generativeModel(ModelName $modelName): GenerativeModel
90+
public function generativeModel(ModelName|string $modelName): GenerativeModel
9191
{
9292
return new GenerativeModel(
9393
$this,
9494
$modelName,
9595
);
9696
}
9797

98-
public function embeddingModel(ModelName $modelName): EmbeddingModel
98+
public function embeddingModel(ModelName|string $modelName): EmbeddingModel
9999
{
100100
return new EmbeddingModel(
101101
$this,

src/ClientInterface.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ interface ClientInterface
2525
public function countTokens(CountTokensRequest $request): CountTokensResponse;
2626
public function generateContent(GenerateContentRequest $request): GenerateContentResponse;
2727
public function embedContent(EmbedContentRequest $request): EmbedContentResponse;
28-
public function generativeModel(ModelName $modelName): GenerativeModel;
29-
public function embeddingModel(ModelName $modelName): EmbeddingModel;
28+
public function generativeModel(ModelName|string $modelName): GenerativeModel;
29+
public function embeddingModel(ModelName|string $modelName): EmbeddingModel;
3030
public function listModels(): ListModelsResponse;
3131
public function withBaseUrl(string $baseUrl): self;
3232

src/EmbeddingModel.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class EmbeddingModel
1919

2020
public function __construct(
2121
private readonly Client $client,
22-
public readonly ModelName $modelName,
22+
public readonly ModelName|string $modelName,
2323
) {
2424
}
2525

src/Enums/ModelName.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
namespace GeminiAPI\Enums;
66

7+
/**
8+
* @deprecated Use constants from GeminiAPI\Resources\ModelName instead
9+
*/
710
enum ModelName: string
811
{
912
case Default = 'models/text-bison-001';

src/GenerativeModel.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
namespace GeminiAPI;
66

7-
use BadMethodCallException;
87
use CurlHandle;
98
use GeminiAPI\Enums\ModelName;
109
use GeminiAPI\Enums\Role;
@@ -29,7 +28,7 @@ class GenerativeModel
2928

3029
public function __construct(
3130
private readonly Client $client,
32-
public readonly ModelName $modelName,
31+
public readonly ModelName|string $modelName,
3332
) {
3433
}
3534

src/Requests/CountTokensRequest.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,32 @@
55
namespace GeminiAPI\Requests;
66

77
use GeminiAPI\Enums\ModelName;
8-
use GeminiAPI\Traits\ArrayTypeValidator;
98
use GeminiAPI\Resources\Content;
9+
use GeminiAPI\Traits\ArrayTypeValidator;
10+
use GeminiAPI\Traits\ModelNameToString;
1011
use JsonSerializable;
1112

1213
use function json_encode;
1314

1415
class CountTokensRequest implements JsonSerializable, RequestInterface
1516
{
1617
use ArrayTypeValidator;
18+
use ModelNameToString;
1719

1820
/**
19-
* @param ModelName $modelName
21+
* @param ModelName|string $modelName
2022
* @param Content[] $contents
2123
*/
2224
public function __construct(
23-
public readonly ModelName $modelName,
25+
public readonly ModelName|string $modelName,
2426
public readonly array $contents,
2527
) {
2628
$this->ensureArrayOfType($this->contents, Content::class);
2729
}
2830

2931
public function getOperation(): string
3032
{
31-
return "{$this->modelName->value}:countTokens";
33+
return "{$this->modelNameToString($this->modelName)}:countTokens";
3234
}
3335

3436
public function getHttpMethod(): string
@@ -50,7 +52,7 @@ public function getHttpPayload(): string
5052
public function jsonSerialize(): array
5153
{
5254
return [
53-
'model' => $this->modelName->value,
55+
'model' => $this->modelNameToString($this->modelName),
5456
'contents' => $this->contents,
5557
];
5658
}

src/Requests/EmbedContentRequest.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,29 @@
88
use GeminiAPI\Enums\ModelName;
99
use GeminiAPI\Enums\TaskType;
1010
use GeminiAPI\Resources\Content;
11+
use GeminiAPI\Traits\ModelNameToString;
1112
use JsonSerializable;
1213

1314
use function json_encode;
1415

1516
class EmbedContentRequest implements JsonSerializable, RequestInterface
1617
{
18+
use ModelNameToString;
19+
1720
public function __construct(
18-
public readonly ModelName $modelName,
21+
public readonly ModelName|string $modelName,
1922
public readonly Content $content,
2023
public readonly ?TaskType $taskType = null,
2124
public readonly ?string $title = null,
2225
) {
23-
if (isset($this->taskType) && $this->modelName !== ModelName::Embedding) {
24-
throw new BadMethodCallException('TaskType can only be set when ModelName is Embedding');
25-
}
26-
2726
if (isset($this->title) && $this->taskType !== TaskType::RETRIEVAL_DOCUMENT) {
2827
throw new BadMethodCallException('Title is only applicable when TaskType is RETRIEVAL_DOCUMENT');
2928
}
3029
}
3130

3231
public function getOperation(): string
3332
{
34-
return "{$this->modelName->value}:embedContent";
33+
return "{$this->modelNameToString($this->modelName)}:embedContent";
3534
}
3635

3736
public function getHttpMethod(): string

src/Requests/GenerateContentRequest.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,27 @@
66

77
use GeminiAPI\Enums\ModelName;
88
use GeminiAPI\GenerationConfig;
9+
use GeminiAPI\Resources\Content;
910
use GeminiAPI\SafetySetting;
1011
use GeminiAPI\Traits\ArrayTypeValidator;
11-
use GeminiAPI\Resources\Content;
12+
use GeminiAPI\Traits\ModelNameToString;
1213
use JsonSerializable;
1314

1415
use function json_encode;
1516

1617
class GenerateContentRequest implements JsonSerializable, RequestInterface
1718
{
1819
use ArrayTypeValidator;
20+
use ModelNameToString;
1921

2022
/**
21-
* @param ModelName $modelName
23+
* @param ModelName|string $modelName
2224
* @param Content[] $contents
2325
* @param SafetySetting[] $safetySettings
2426
* @param GenerationConfig|null $generationConfig
2527
*/
2628
public function __construct(
27-
public readonly ModelName $modelName,
29+
public readonly ModelName|string $modelName,
2830
public readonly array $contents,
2931
public readonly array $safetySettings = [],
3032
public readonly ?GenerationConfig $generationConfig = null,
@@ -35,7 +37,7 @@ public function __construct(
3537

3638
public function getOperation(): string
3739
{
38-
return "{$this->modelName->value}:generateContent";
40+
return "{$this->modelNameToString($this->modelName)}:generateContent";
3941
}
4042

4143
public function getHttpMethod(): string
@@ -59,7 +61,7 @@ public function getHttpPayload(): string
5961
public function jsonSerialize(): array
6062
{
6163
$arr = [
62-
'model' => $this->modelName->value,
64+
'model' => $this->modelNameToString($this->modelName),
6365
'contents' => $this->contents,
6466
];
6567

0 commit comments

Comments
 (0)