99use  WordPress \AiClient \Common \AbstractDataTransferObject ;
1010use  WordPress \AiClient \Files \DTO \File ;
1111use  WordPress \AiClient \Messages \DTO \Message ;
12+ use  WordPress \AiClient \Providers \DTO \ProviderMetadata ;
13+ use  WordPress \AiClient \Providers \Models \DTO \ModelMetadata ;
1214use  WordPress \AiClient \Results \Contracts \ResultInterface ;
1315
1416/** 
2123 * 
2224 * @phpstan-import-type CandidateArrayShape from Candidate 
2325 * @phpstan-import-type TokenUsageArrayShape from TokenUsage 
26+  * @phpstan-import-type ProviderMetadataArrayShape from ProviderMetadata 
27+  * @phpstan-import-type ModelMetadataArrayShape from ModelMetadata 
2428 * 
2529 * @phpstan-type GenerativeAiResultArrayShape array{ 
2630 *     id: string, 
2731 *     candidates: array<CandidateArrayShape>, 
2832 *     tokenUsage: TokenUsageArrayShape, 
29-  *     providerMetadata?: array<string, mixed> 
33+  *     providerMetadata: ProviderMetadataArrayShape, 
34+  *     modelMetadata: ModelMetadataArrayShape, 
35+  *     additionalData?: array<string, mixed> 
3036 * } 
3137 * 
3238 * @extends AbstractDataTransferObject<GenerativeAiResultArrayShape> 
@@ -37,6 +43,8 @@ class GenerativeAiResult extends AbstractDataTransferObject implements ResultInt
3743    public  const  KEY_CANDIDATES  = 'candidates ' ;
3844    public  const  KEY_TOKEN_USAGE  = 'tokenUsage ' ;
3945    public  const  KEY_PROVIDER_METADATA  = 'providerMetadata ' ;
46+     public  const  KEY_MODEL_METADATA  = 'modelMetadata ' ;
47+     public  const  KEY_ADDITIONAL_DATA  = 'additionalData ' ;
4048    /** 
4149     * @var string Unique identifier for this result. 
4250     */ 
@@ -53,9 +61,19 @@ class GenerativeAiResult extends AbstractDataTransferObject implements ResultInt
5361    private  TokenUsage $ tokenUsage
5462
5563    /** 
56-      * @var array<string, mixed>  Provider-specific  metadata. 
64+      * @var ProviderMetadata  Provider metadata. 
5765     */ 
58-     private  array  $ providerMetadata
66+     private  ProviderMetadata $ providerMetadata
67+ 
68+     /** 
69+      * @var ModelMetadata Model metadata. 
70+      */ 
71+     private  ModelMetadata $ modelMetadata
72+ 
73+     /** 
74+      * @var array<string, mixed> Additional data. 
75+      */ 
76+     private  array  $ additionalData
5977
6078    /** 
6179     * Constructor. 
@@ -65,11 +83,19 @@ class GenerativeAiResult extends AbstractDataTransferObject implements ResultInt
6583     * @param string $id Unique identifier for this result. 
6684     * @param Candidate[] $candidates The generated candidates. 
6785     * @param TokenUsage $tokenUsage Token usage statistics. 
68-      * @param array<string, mixed> $providerMetadata Provider-specific metadata. 
86+      * @param ProviderMetadata $providerMetadata Provider metadata. 
87+      * @param ModelMetadata $modelMetadata Model metadata. 
88+      * @param array<string, mixed> $additionalData Additional data. 
6989     * @throws InvalidArgumentException If no candidates provided. 
7090     */ 
71-     public  function  __construct (string  $ idarray  $ candidatesTokenUsage $ tokenUsagearray  $ providerMetadata
72-     {
91+     public  function  __construct (
92+         string  $ id
93+         array  $ candidates
94+         TokenUsage $ tokenUsage
95+         ProviderMetadata $ providerMetadata
96+         ModelMetadata $ modelMetadata
97+         array  $ additionalData
98+     ) {
7399        if  (empty ($ candidates
74100            throw  new  InvalidArgumentException ('At least one candidate must be provided ' );
75101        }
@@ -78,6 +104,8 @@ public function __construct(string $id, array $candidates, TokenUsage $tokenUsag
78104        $ this candidates  = $ candidates
79105        $ this tokenUsage  = $ tokenUsage
80106        $ this providerMetadata  = $ providerMetadata
107+         $ this modelMetadata  = $ modelMetadata
108+         $ this additionalData  = $ additionalData
81109    }
82110
83111    /** 
@@ -113,15 +141,39 @@ public function getTokenUsage(): TokenUsage
113141    }
114142
115143    /** 
116-      * {@inheritDoc}  
144+      * Gets the provider metadata.  
117145     * 
118146     * @since n.e.x.t 
147+      * 
148+      * @return ProviderMetadata The provider metadata. 
119149     */ 
120-     public  function  getProviderMetadata (): array 
150+     public  function  getProviderMetadata (): ProviderMetadata 
121151    {
122152        return  $ this providerMetadata ;
123153    }
124154
155+     /** 
156+      * Gets the model metadata. 
157+      * 
158+      * @since n.e.x.t 
159+      * 
160+      * @return ModelMetadata The model metadata. 
161+      */ 
162+     public  function  getModelMetadata (): ModelMetadata 
163+     {
164+         return  $ this modelMetadata ;
165+     }
166+ 
167+     /** 
168+      * {@inheritDoc} 
169+      * 
170+      * @since n.e.x.t 
171+      */ 
172+     public  function  getAdditionalData (): array 
173+     {
174+         return  $ this additionalData ;
175+     }
176+ 
125177    /** 
126178     * Gets the total number of candidates. 
127179     * 
@@ -387,13 +439,21 @@ public static function getJsonSchema(): array
387439                    'description '  => 'The generated candidates. ' ,
388440                ],
389441                self ::KEY_TOKEN_USAGE  => TokenUsage::getJsonSchema (),
390-                 self ::KEY_PROVIDER_METADATA  => [
442+                 self ::KEY_PROVIDER_METADATA  => ProviderMetadata::getJsonSchema (),
443+                 self ::KEY_MODEL_METADATA  => ModelMetadata::getJsonSchema (),
444+                 self ::KEY_ADDITIONAL_DATA  => [
391445                    'type '  => 'object ' ,
392446                    'additionalProperties '  => true ,
393-                     'description '  => 'Provider-specific metadata . ,
447+                     'description '  => 'Additional data included in the API response . ,
394448                ],
395449            ],
396-             'required '  => [self ::KEY_ID , self ::KEY_CANDIDATES , self ::KEY_TOKEN_USAGE ],
450+             'required '  => [
451+                 self ::KEY_ID ,
452+                 self ::KEY_CANDIDATES ,
453+                 self ::KEY_TOKEN_USAGE ,
454+                 self ::KEY_PROVIDER_METADATA ,
455+                 self ::KEY_MODEL_METADATA 
456+             ],
397457        ];
398458    }
399459
@@ -410,7 +470,9 @@ public function toArray(): array
410470            self ::KEY_ID  => $ this id ,
411471            self ::KEY_CANDIDATES  => array_map (fn (Candidate $ candidate$ candidatetoArray (), $ this candidates ),
412472            self ::KEY_TOKEN_USAGE  => $ this tokenUsage ->toArray (),
413-             self ::KEY_PROVIDER_METADATA  => $ this providerMetadata ,
473+             self ::KEY_PROVIDER_METADATA  => $ this providerMetadata ->toArray (),
474+             self ::KEY_MODEL_METADATA  => $ this modelMetadata ->toArray (),
475+             self ::KEY_ADDITIONAL_DATA  => $ this additionalData ,
414476        ];
415477    }
416478
@@ -421,7 +483,13 @@ public function toArray(): array
421483     */ 
422484    public  static  function  fromArray (array  $ arrayself 
423485    {
424-         static ::validateFromArrayData ($ arrayself ::KEY_ID , self ::KEY_CANDIDATES , self ::KEY_TOKEN_USAGE ]);
486+         static ::validateFromArrayData ($ array
487+             self ::KEY_ID ,
488+             self ::KEY_CANDIDATES ,
489+             self ::KEY_TOKEN_USAGE ,
490+             self ::KEY_PROVIDER_METADATA ,
491+             self ::KEY_MODEL_METADATA 
492+         ]);
425493
426494        $ candidatesarray_map (
427495            fn (array  $ candidateDatafromArray ($ candidateData
@@ -432,7 +500,9 @@ public static function fromArray(array $array): self
432500            $ arrayself ::KEY_ID ],
433501            $ candidates
434502            TokenUsage::fromArray ($ arrayself ::KEY_TOKEN_USAGE ]),
435-             $ arrayself ::KEY_PROVIDER_METADATA ] ?? []
503+             ProviderMetadata::fromArray ($ arrayself ::KEY_PROVIDER_METADATA ]),
504+             ModelMetadata::fromArray ($ arrayself ::KEY_MODEL_METADATA ]),
505+             $ arrayself ::KEY_ADDITIONAL_DATA ] ?? []
436506        );
437507    }
438508}
0 commit comments