66use OpenAI \Responses \Concerns \ArrayAccessible ;
77
88/**
9- * @implements MetaInformationContract<array{x-request-id?: string, openai-model?: string, openai-organization?: string, openai-processing-ms?: int, openai-version?: string, x-ratelimit-limit-requests?: int, x-ratelimit-limit-tokens?: int, x-ratelimit-remaining-requests?: int, x-ratelimit-remaining-tokens?: int, x-ratelimit-reset-requests?: string, x-ratelimit-reset-tokens?: string}>
9+ * @implements MetaInformationContract<array{x-request-id?: string, openai-model?: string, openai-organization?: string, openai-project?: string, openai- processing-ms?: int, openai-version?: string, x-ratelimit-limit-requests?: int, x-ratelimit-limit-tokens?: int, x-ratelimit-remaining-requests?: int, x-ratelimit-remaining-tokens?: int, x-ratelimit-reset-requests?: string, x-ratelimit-reset-tokens?: string, custom?: array<string, string> }>
1010 */
1111final class MetaInformation implements MetaInformationContract
1212{
1313 /**
14- * @use ArrayAccessible<array{x-request-id?: string, openai-model?: string, openai-organization?: string, openai-processing-ms?: int, openai-version?: string, x-ratelimit-limit-requests?: int, x-ratelimit-limit-tokens?: int, x-ratelimit-remaining-requests?: int, x-ratelimit-remaining-tokens?: int, x-ratelimit-reset-requests?: string, x-ratelimit-reset-tokens?: string}>
14+ * @use ArrayAccessible<array{x-request-id?: string, openai-model?: string, openai-organization?: string, openai-project?: string, openai- processing-ms?: int, openai-version?: string, x-ratelimit-limit-requests?: int, x-ratelimit-limit-tokens?: int, x-ratelimit-remaining-requests?: int, x-ratelimit-remaining-tokens?: int, x-ratelimit-reset-requests?: string, x-ratelimit-reset-tokens?: string, custom?: array<string, string> }>
1515 */
1616 use ArrayAccessible;
1717
@@ -20,20 +20,37 @@ private function __construct(
2020 public readonly MetaInformationOpenAI $ openai ,
2121 public readonly ?MetaInformationRateLimit $ requestLimit ,
2222 public readonly ?MetaInformationRateLimit $ tokenLimit ,
23+ public readonly MetaInformationCustom $ custom ,
2324 ) {}
2425
2526 /**
26- * @param array{x-request-id: string[], openai-model: string[], openai-organization: string[], openai-version: string[], openai-processing-ms: string[], x-ratelimit-limit-requests: string[], x-ratelimit-remaining-requests: string[], x-ratelimit-reset-requests: string[], x-ratelimit-limit-tokens: string[], x-ratelimit-remaining-tokens: string[], x-ratelimit-reset-tokens: string[]} $headers
27+ * @param array< string, array<int, string>> $headers
2728 */
2829 public static function from (array $ headers ): self
2930 {
31+ $ knownHeaders = [
32+ 'x-request-id ' ,
33+ 'openai-model ' ,
34+ 'openai-organization ' ,
35+ 'openai-project ' ,
36+ 'openai-version ' ,
37+ 'openai-processing-ms ' ,
38+ 'x-ratelimit-limit-requests ' ,
39+ 'x-ratelimit-remaining-requests ' ,
40+ 'x-ratelimit-reset-requests ' ,
41+ 'x-ratelimit-limit-tokens ' ,
42+ 'x-ratelimit-remaining-tokens ' ,
43+ 'x-ratelimit-reset-tokens ' ,
44+ ];
45+
3046 $ headers = array_change_key_case ($ headers , CASE_LOWER );
3147
3248 $ requestId = $ headers ['x-request-id ' ][0 ] ?? null ;
3349
3450 $ openai = MetaInformationOpenAI::from ([
3551 'model ' => $ headers ['openai-model ' ][0 ] ?? null ,
3652 'organization ' => $ headers ['openai-organization ' ][0 ] ?? null ,
53+ 'project ' => $ headers ['openai-project ' ][0 ] ?? null ,
3754 'version ' => $ headers ['openai-version ' ][0 ] ?? null ,
3855 'processingMs ' => isset ($ headers ['openai-processing-ms ' ][0 ]) ? (int ) $ headers ['openai-processing-ms ' ][0 ] : null ,
3956 ]);
@@ -58,11 +75,23 @@ public static function from(array $headers): self
5875 $ tokenLimit = null ;
5976 }
6077
78+ $ customHeaders = [];
79+ foreach ($ headers as $ name => $ values ) {
80+ if (in_array ($ name , $ knownHeaders , true )) {
81+ continue ;
82+ }
83+
84+ $ customHeaders [$ name ] = $ values [0 ] ?? null ;
85+ }
86+
87+ $ custom = MetaInformationCustom::from ($ customHeaders );
88+
6189 return new self (
6290 $ requestId ,
6391 $ openai ,
6492 $ requestLimit ,
6593 $ tokenLimit ,
94+ $ custom ,
6695 );
6796 }
6897
@@ -74,6 +103,7 @@ public function toArray(): array
74103 return array_filter ([
75104 'openai-model ' => $ this ->openai ->model ,
76105 'openai-organization ' => $ this ->openai ->organization ,
106+ 'openai-project ' => $ this ->openai ->project ,
77107 'openai-processing-ms ' => $ this ->openai ->processingMs ,
78108 'openai-version ' => $ this ->openai ->version ,
79109 'x-ratelimit-limit-requests ' => $ this ->requestLimit ->limit ?? null ,
@@ -83,6 +113,7 @@ public function toArray(): array
83113 'x-ratelimit-reset-requests ' => $ this ->requestLimit ->reset ?? null ,
84114 'x-ratelimit-reset-tokens ' => $ this ->tokenLimit ->reset ?? null ,
85115 'x-request-id ' => $ this ->requestId ,
86- ], fn (string |int |null $ value ): bool => ! is_null ($ value ));
116+ 'custom ' => ! $ this ->custom ->isEmpty () ? $ this ->custom ->toArray () : null ,
117+ ], fn (array |string |int |null $ value ): bool => ! is_null ($ value ));
87118 }
88119}
0 commit comments