19
19
import org .junit .jupiter .api .Test ;
20
20
21
21
import org .springframework .ai .chat .metadata .DefaultUsage ;
22
- import org .springframework .ai .chat .metadata .Usage ;
23
22
import org .springframework .ai .openai .api .OpenAiApi ;
24
23
25
24
import static org .assertj .core .api .Assertions .assertThat ;
@@ -81,7 +80,7 @@ void whenTotalTokensIsNull() {
81
80
82
81
@ Test
83
82
void whenPromptAndCompletionTokensDetailsIsNull () {
84
- OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 , null , null );
83
+ OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 , null , null , null , null );
85
84
DefaultUsage usage = getDefaultUsage (openAiUsage );
86
85
assertThat (usage .getTotalTokens ()).isEqualTo (300 );
87
86
OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
@@ -91,7 +90,7 @@ void whenPromptAndCompletionTokensDetailsIsNull() {
91
90
92
91
@ Test
93
92
void whenCompletionTokenDetailsIsNull () {
94
- OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 , null , null );
93
+ OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 , null , null , null , null );
95
94
DefaultUsage usage = getDefaultUsage (openAiUsage );
96
95
assertThat (usage .getTotalTokens ()).isEqualTo (300 );
97
96
OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
@@ -101,7 +100,7 @@ void whenCompletionTokenDetailsIsNull() {
101
100
@ Test
102
101
void whenReasoningTokensIsNull () {
103
102
OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 , null ,
104
- new OpenAiApi .Usage .CompletionTokenDetails (null , null , null , null ));
103
+ new OpenAiApi .Usage .CompletionTokenDetails (null , null , null , null ), null , null );
105
104
DefaultUsage usage = getDefaultUsage (openAiUsage );
106
105
OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
107
106
assertThat (nativeUsage .completionTokenDetails ().reasoningTokens ()).isEqualTo (null );
@@ -110,7 +109,7 @@ void whenReasoningTokensIsNull() {
110
109
@ Test
111
110
void whenCompletionTokenDetailsIsPresent () {
112
111
OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 , null ,
113
- new OpenAiApi .Usage .CompletionTokenDetails (50 , null , null , null ));
112
+ new OpenAiApi .Usage .CompletionTokenDetails (50 , null , null , null ), null , null );
114
113
DefaultUsage usage = getDefaultUsage (openAiUsage );
115
114
OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
116
115
assertThat (nativeUsage .completionTokenDetails ().reasoningTokens ()).isEqualTo (50 );
@@ -122,7 +121,7 @@ void whenCompletionTokenDetailsIsPresent() {
122
121
@ Test
123
122
void whenAcceptedPredictionTokensIsPresent () {
124
123
OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 , null ,
125
- new OpenAiApi .Usage .CompletionTokenDetails (null , 75 , null , null ));
124
+ new OpenAiApi .Usage .CompletionTokenDetails (null , 75 , null , null ), null , null );
126
125
DefaultUsage usage = getDefaultUsage (openAiUsage );
127
126
OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
128
127
assertThat (nativeUsage .completionTokenDetails ().reasoningTokens ()).isEqualTo (null );
@@ -134,7 +133,7 @@ void whenAcceptedPredictionTokensIsPresent() {
134
133
@ Test
135
134
void whenAudioTokensIsPresent () {
136
135
OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 , null ,
137
- new OpenAiApi .Usage .CompletionTokenDetails (null , null , 125 , null ));
136
+ new OpenAiApi .Usage .CompletionTokenDetails (null , null , 125 , null ), null , null );
138
137
DefaultUsage usage = getDefaultUsage (openAiUsage );
139
138
OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
140
139
assertThat (nativeUsage .completionTokenDetails ().reasoningTokens ()).isEqualTo (null );
@@ -146,7 +145,7 @@ void whenAudioTokensIsPresent() {
146
145
@ Test
147
146
void whenRejectedPredictionTokensIsNull () {
148
147
OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 , null ,
149
- new OpenAiApi .Usage .CompletionTokenDetails (null , null , null , null ));
148
+ new OpenAiApi .Usage .CompletionTokenDetails (null , null , null , null ), null , null );
150
149
DefaultUsage usage = getDefaultUsage (openAiUsage );
151
150
OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
152
151
assertThat (nativeUsage .completionTokenDetails ().reasoningTokens ()).isEqualTo (null );
@@ -160,7 +159,7 @@ void whenRejectedPredictionTokensIsNull() {
160
159
@ Test
161
160
void whenRejectedPredictionTokensIsPresent () {
162
161
OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 , null ,
163
- new OpenAiApi .Usage .CompletionTokenDetails (null , null , null , 25 ));
162
+ new OpenAiApi .Usage .CompletionTokenDetails (null , null , null , 25 ), null , null );
164
163
DefaultUsage usage = getDefaultUsage (openAiUsage );
165
164
OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
166
165
assertThat (nativeUsage .completionTokenDetails ().reasoningTokens ()).isEqualTo (null );
@@ -172,7 +171,7 @@ void whenRejectedPredictionTokensIsPresent() {
172
171
@ Test
173
172
void whenCacheTokensIsNull () {
174
173
OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 ,
175
- new OpenAiApi .Usage .PromptTokensDetails (null , null ), null );
174
+ new OpenAiApi .Usage .PromptTokensDetails (null , null ), null , null , null );
176
175
DefaultUsage usage = getDefaultUsage (openAiUsage );
177
176
OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
178
177
assertThat (nativeUsage .promptTokensDetails ().audioTokens ()).isEqualTo (null );
@@ -182,11 +181,35 @@ void whenCacheTokensIsNull() {
182
181
@ Test
183
182
void whenCacheTokensIsPresent () {
184
183
OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 ,
185
- new OpenAiApi .Usage .PromptTokensDetails (99 , 15 ), null );
184
+ new OpenAiApi .Usage .PromptTokensDetails (99 , 15 ), null , null , null );
186
185
DefaultUsage usage = getDefaultUsage (openAiUsage );
187
186
OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
188
187
assertThat (nativeUsage .promptTokensDetails ().audioTokens ()).isEqualTo (99 );
189
188
assertThat (nativeUsage .promptTokensDetails ().cachedTokens ()).isEqualTo (15 );
190
189
}
191
190
191
+ @ Test
192
+ void whenPromptCacheHitTokensIsPresent () {
193
+ OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 ,
194
+ new OpenAiApi .Usage .PromptTokensDetails (99 , 15 ), null , 150 , null );
195
+ DefaultUsage usage = getDefaultUsage (openAiUsage );
196
+ OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
197
+ assertThat (nativeUsage .promptTokensDetails ().audioTokens ()).isEqualTo (99 );
198
+ assertThat (nativeUsage .promptTokensDetails ().cachedTokens ()).isEqualTo (15 );
199
+ assertThat (nativeUsage .promptCacheHitTokens ()).isEqualTo (150 );
200
+ assertThat (nativeUsage .promptCacheMissTokens ()).isNull ();
201
+ }
202
+
203
+ @ Test
204
+ void whenPromptCacheMissTokensIsPresent () {
205
+ OpenAiApi .Usage openAiUsage = new OpenAiApi .Usage (100 , 200 , 300 ,
206
+ new OpenAiApi .Usage .PromptTokensDetails (99 , 15 ), null , null , 80 );
207
+ DefaultUsage usage = getDefaultUsage (openAiUsage );
208
+ OpenAiApi .Usage nativeUsage = (OpenAiApi .Usage ) usage .getNativeUsage ();
209
+ assertThat (nativeUsage .promptTokensDetails ().audioTokens ()).isEqualTo (99 );
210
+ assertThat (nativeUsage .promptTokensDetails ().cachedTokens ()).isEqualTo (15 );
211
+ assertThat (nativeUsage .promptCacheMissTokens ()).isEqualTo (80 );
212
+ assertThat (nativeUsage .promptCacheHitTokens ()).isNull ();
213
+ }
214
+
192
215
}
0 commit comments