Skip to content

Commit a36f93a

Browse files
committed
feat: adds provider DTOs
1 parent 2811597 commit a36f93a

File tree

7 files changed

+1622
-0
lines changed

7 files changed

+1622
-0
lines changed
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WordPress\AiClient\Providers\DTO;
6+
7+
use WordPress\AiClient\Common\AbstractDataValueObject;
8+
use WordPress\AiClient\Providers\Enums\ProviderTypeEnum;
9+
10+
/**
11+
* Represents metadata about an AI provider.
12+
*
13+
* This class contains information about an AI provider, including its
14+
* unique identifier, display name, and type (cloud, server, or client).
15+
*
16+
* @since n.e.x.t
17+
*
18+
* @phpstan-type ProviderMetadataArrayShape array{
19+
* id: string,
20+
* name: string,
21+
* type: string
22+
* }
23+
*
24+
* @extends AbstractDataValueObject<ProviderMetadataArrayShape>
25+
*/
26+
final class ProviderMetadata extends AbstractDataValueObject
27+
{
28+
/**
29+
* @var string The provider's unique identifier.
30+
*/
31+
protected string $id;
32+
33+
/**
34+
* @var string The provider's display name.
35+
*/
36+
protected string $name;
37+
38+
/**
39+
* @var ProviderTypeEnum The provider type.
40+
*/
41+
protected ProviderTypeEnum $type;
42+
43+
/**
44+
* Constructor.
45+
*
46+
* @since n.e.x.t
47+
*
48+
* @param string $id The provider's unique identifier.
49+
* @param string $name The provider's display name.
50+
* @param ProviderTypeEnum $type The provider type.
51+
*/
52+
public function __construct(string $id, string $name, ProviderTypeEnum $type)
53+
{
54+
$this->id = $id;
55+
$this->name = $name;
56+
$this->type = $type;
57+
}
58+
59+
/**
60+
* Gets the provider's unique identifier.
61+
*
62+
* @since n.e.x.t
63+
*
64+
* @return string The provider ID.
65+
*/
66+
public function getId(): string
67+
{
68+
return $this->id;
69+
}
70+
71+
/**
72+
* Gets the provider's display name.
73+
*
74+
* @since n.e.x.t
75+
*
76+
* @return string The provider name.
77+
*/
78+
public function getName(): string
79+
{
80+
return $this->name;
81+
}
82+
83+
/**
84+
* Gets the provider type.
85+
*
86+
* @since n.e.x.t
87+
*
88+
* @return ProviderTypeEnum The provider type.
89+
*/
90+
public function getType(): ProviderTypeEnum
91+
{
92+
return $this->type;
93+
}
94+
95+
/**
96+
* {@inheritDoc}
97+
*
98+
* @since n.e.x.t
99+
*/
100+
public static function getJsonSchema(): array
101+
{
102+
return [
103+
'type' => 'object',
104+
'properties' => [
105+
'id' => [
106+
'type' => 'string',
107+
'description' => 'The provider\'s unique identifier.',
108+
],
109+
'name' => [
110+
'type' => 'string',
111+
'description' => 'The provider\'s display name.',
112+
],
113+
'type' => [
114+
'type' => 'string',
115+
'enum' => ProviderTypeEnum::getValues(),
116+
'description' => 'The provider type (cloud, server, or client).',
117+
],
118+
],
119+
'required' => ['id', 'name', 'type'],
120+
];
121+
}
122+
123+
/**
124+
* {@inheritDoc}
125+
*
126+
* @since n.e.x.t
127+
*
128+
* @return ProviderMetadataArrayShape
129+
*/
130+
public function toArray(): array
131+
{
132+
return [
133+
'id' => $this->id,
134+
'name' => $this->name,
135+
'type' => $this->type->value,
136+
];
137+
}
138+
139+
/**
140+
* {@inheritDoc}
141+
*
142+
* @since n.e.x.t
143+
*/
144+
public static function fromArray(array $array): self
145+
{
146+
return new self(
147+
$array['id'],
148+
$array['name'],
149+
ProviderTypeEnum::from($array['type'])
150+
);
151+
}
152+
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WordPress\AiClient\Providers\DTO;
6+
7+
use WordPress\AiClient\Common\AbstractDataValueObject;
8+
use WordPress\AiClient\Providers\Models\DTO\ModelMetadata;
9+
10+
/**
11+
* Represents metadata about a provider and its available models.
12+
*
13+
* This class combines provider information with the models that
14+
* the provider offers, facilitating model discovery and selection.
15+
*
16+
* @since n.e.x.t
17+
*
18+
* @phpstan-import-type ProviderMetadataArrayShape from ProviderMetadata
19+
* @phpstan-import-type ModelMetadataArrayShape from ModelMetadata
20+
*
21+
* @phpstan-type ProviderModelsMetadataArrayShape array{
22+
* provider: ProviderMetadataArrayShape,
23+
* models: array<int, ModelMetadataArrayShape>
24+
* }
25+
*
26+
* @extends AbstractDataValueObject<ProviderModelsMetadataArrayShape>
27+
*/
28+
final class ProviderModelsMetadata extends AbstractDataValueObject
29+
{
30+
/**
31+
* @var ProviderMetadata The provider metadata.
32+
*/
33+
protected ProviderMetadata $provider;
34+
35+
/**
36+
* @var ModelMetadata[] The available models.
37+
*/
38+
protected array $models;
39+
40+
/**
41+
* Constructor.
42+
*
43+
* @since n.e.x.t
44+
*
45+
* @param ProviderMetadata $provider The provider metadata.
46+
* @param ModelMetadata[] $models The available models.
47+
*/
48+
public function __construct(ProviderMetadata $provider, array $models)
49+
{
50+
$this->provider = $provider;
51+
$this->models = $models;
52+
}
53+
54+
/**
55+
* Gets the provider metadata.
56+
*
57+
* @since n.e.x.t
58+
*
59+
* @return ProviderMetadata The provider metadata.
60+
*/
61+
public function getProvider(): ProviderMetadata
62+
{
63+
return $this->provider;
64+
}
65+
66+
/**
67+
* Gets the available models.
68+
*
69+
* @since n.e.x.t
70+
*
71+
* @return ModelMetadata[] The available models.
72+
*/
73+
public function getModels(): array
74+
{
75+
return $this->models;
76+
}
77+
78+
/**
79+
* {@inheritDoc}
80+
*
81+
* @since n.e.x.t
82+
*/
83+
public static function getJsonSchema(): array
84+
{
85+
return [
86+
'type' => 'object',
87+
'properties' => [
88+
'provider' => ProviderMetadata::getJsonSchema(),
89+
'models' => [
90+
'type' => 'array',
91+
'items' => ModelMetadata::getJsonSchema(),
92+
'description' => 'The available models for this provider.',
93+
],
94+
],
95+
'required' => ['provider', 'models'],
96+
];
97+
}
98+
99+
/**
100+
* {@inheritDoc}
101+
*
102+
* @since n.e.x.t
103+
*
104+
* @return ProviderModelsMetadataArrayShape
105+
*/
106+
public function toArray(): array
107+
{
108+
return [
109+
'provider' => $this->provider->toArray(),
110+
'models' => array_values(
111+
array_map(static fn(ModelMetadata $model): array => $model->toArray(), $this->models)
112+
),
113+
];
114+
}
115+
116+
/**
117+
* {@inheritDoc}
118+
*
119+
* @since n.e.x.t
120+
*/
121+
public static function fromArray(array $array): self
122+
{
123+
return new self(
124+
ProviderMetadata::fromArray($array['provider']),
125+
array_map(
126+
static fn(array $modelData): ModelMetadata => ModelMetadata::fromArray($modelData),
127+
$array['models']
128+
)
129+
);
130+
}
131+
}

0 commit comments

Comments
 (0)