6
6
use OpenAI \Responses \Concerns \ArrayAccessible ;
7
7
8
8
/**
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> }>
10
10
*/
11
11
final class MetaInformation implements MetaInformationContract
12
12
{
13
13
/**
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> }>
15
15
*/
16
16
use ArrayAccessible;
17
17
@@ -20,20 +20,37 @@ private function __construct(
20
20
public readonly MetaInformationOpenAI $ openai ,
21
21
public readonly ?MetaInformationRateLimit $ requestLimit ,
22
22
public readonly ?MetaInformationRateLimit $ tokenLimit ,
23
+ public readonly MetaInformationCustom $ custom ,
23
24
) {}
24
25
25
26
/**
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
27
28
*/
28
29
public static function from (array $ headers ): self
29
30
{
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
+
30
46
$ headers = array_change_key_case ($ headers , CASE_LOWER );
31
47
32
48
$ requestId = $ headers ['x-request-id ' ][0 ] ?? null ;
33
49
34
50
$ openai = MetaInformationOpenAI::from ([
35
51
'model ' => $ headers ['openai-model ' ][0 ] ?? null ,
36
52
'organization ' => $ headers ['openai-organization ' ][0 ] ?? null ,
53
+ 'project ' => $ headers ['openai-project ' ][0 ] ?? null ,
37
54
'version ' => $ headers ['openai-version ' ][0 ] ?? null ,
38
55
'processingMs ' => isset ($ headers ['openai-processing-ms ' ][0 ]) ? (int ) $ headers ['openai-processing-ms ' ][0 ] : null ,
39
56
]);
@@ -58,11 +75,23 @@ public static function from(array $headers): self
58
75
$ tokenLimit = null ;
59
76
}
60
77
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
+
61
89
return new self (
62
90
$ requestId ,
63
91
$ openai ,
64
92
$ requestLimit ,
65
93
$ tokenLimit ,
94
+ $ custom ,
66
95
);
67
96
}
68
97
@@ -74,6 +103,7 @@ public function toArray(): array
74
103
return array_filter ([
75
104
'openai-model ' => $ this ->openai ->model ,
76
105
'openai-organization ' => $ this ->openai ->organization ,
106
+ 'openai-project ' => $ this ->openai ->project ,
77
107
'openai-processing-ms ' => $ this ->openai ->processingMs ,
78
108
'openai-version ' => $ this ->openai ->version ,
79
109
'x-ratelimit-limit-requests ' => $ this ->requestLimit ->limit ?? null ,
@@ -83,6 +113,7 @@ public function toArray(): array
83
113
'x-ratelimit-reset-requests ' => $ this ->requestLimit ->reset ?? null ,
84
114
'x-ratelimit-reset-tokens ' => $ this ->tokenLimit ->reset ?? null ,
85
115
'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 ));
87
118
}
88
119
}
0 commit comments