@@ -196,6 +196,60 @@ describe("OpenAiNativeHandler", () => {
196196 } ,
197197 )
198198
199+ it . each ( [
200+ {
201+ name : "an explicitly selected default tier" ,
202+ modelId : "gpt-5.4" as const ,
203+ requestedTier : OpenAiServiceTier . Default ,
204+ resolvedTier : undefined ,
205+ expectedCost : 0.22 ,
206+ } ,
207+ {
208+ name : "no selected service tier" ,
209+ modelId : "gpt-5.4" as const ,
210+ requestedTier : undefined ,
211+ resolvedTier : undefined ,
212+ expectedCost : 0.22 ,
213+ } ,
214+ {
215+ name : "a resolved service tier without a pricing entry" ,
216+ modelId : "gpt-5.6-luna" as const ,
217+ requestedTier : OpenAiServiceTier . Default ,
218+ resolvedTier : OpenAiServiceTier . Priority ,
219+ expectedCost : 0.088 ,
220+ } ,
221+ ] ) ( "retains standard pricing for $name" , async ( { modelId, requestedTier, resolvedTier, expectedCost } ) => {
222+ mockResponsesCreate . mockResolvedValue ( {
223+ async * [ Symbol . asyncIterator ] ( ) {
224+ yield {
225+ type : "response.done" ,
226+ response : {
227+ ...( resolvedTier ? { [ SERVICE_TIER_KEY ] : resolvedTier } : { } ) ,
228+ usage : {
229+ input_tokens : 100_000 ,
230+ output_tokens : 1_000 ,
231+ cache_read_input_tokens : 20_000 ,
232+ } ,
233+ } ,
234+ }
235+ } ,
236+ } )
237+ handler = new OpenAiNativeHandler ( {
238+ ...mockOptions ,
239+ apiModelId : modelId ,
240+ openAiNativeServiceTier : requestedTier ,
241+ } )
242+
243+ const chunks = [ ]
244+ for await ( const chunk of handler . createMessage ( systemPrompt , messages ) ) {
245+ chunks . push ( chunk )
246+ }
247+
248+ const usageChunk = chunks . find ( ( chunk ) => chunk . type === "usage" )
249+ expect ( usageChunk ) . toBeDefined ( )
250+ expect ( usageChunk ?. totalCost ) . toBeCloseTo ( expectedCost , 6 )
251+ } )
252+
199253 it . each ( serviceTierPricingCases ) (
200254 "requests $requestedTier but prices manual SSE fallback usage using OpenAI's resolved $resolvedTier tier" ,
201255 async ( { requestedTier, resolvedTier, expectedCost } ) => {
@@ -550,49 +604,6 @@ describe("OpenAiNativeHandler", () => {
550604 ] )
551605 } )
552606
553- it ( "should retain standard pricing for an explicitly selected default tier" , ( ) => {
554- const defaultTierHandler = new OpenAiNativeHandler ( {
555- ...mockOptions ,
556- apiModelId : "gpt-5.4" ,
557- openAiNativeServiceTier : OpenAiServiceTier . Default ,
558- } )
559- const model = defaultTierHandler . getModel ( )
560- const normalizeUsage = Reflect . get ( defaultTierHandler , "normalizeUsage" )
561-
562- const result = Reflect . apply ( normalizeUsage , defaultTierHandler , [
563- {
564- input_tokens : 100_000 ,
565- output_tokens : 1_000 ,
566- cache_read_input_tokens : 20_000 ,
567- } ,
568- model ,
569- ] ) as { totalCost : number }
570-
571- expect ( result . totalCost ) . toBeCloseTo ( 0.22 , 6 )
572- } )
573-
574- it ( "should retain standard pricing when no service tier is selected" , ( ) => {
575- const model = handler . getModel ( )
576- const applyServiceTierPricing = Reflect . get ( handler , "applyServiceTierPricing" )
577-
578- const result = Reflect . apply ( applyServiceTierPricing , handler , [ model . info ] )
579-
580- expect ( result ) . toBe ( model . info )
581- } )
582-
583- it ( "should retain standard pricing when the resolved service tier has no pricing entry" , ( ) => {
584- const model = handler . getModel ( )
585- const infoWithoutTiers = { ...model . info , tiers : undefined }
586- const applyServiceTierPricing = Reflect . get ( handler , "applyServiceTierPricing" )
587-
588- const result = Reflect . apply ( applyServiceTierPricing , handler , [
589- infoWithoutTiers ,
590- OpenAiServiceTier . Priority ,
591- ] )
592-
593- expect ( result ) . toBe ( infoWithoutTiers )
594- } )
595-
596607 it ( "should return GPT-5.3 Chat model info when selected" , ( ) => {
597608 const chatHandler = new OpenAiNativeHandler ( {
598609 ...mockOptions ,
0 commit comments