@@ -8,7 +8,6 @@ import { getErrorObject } from '@codebuff/common/util/error'
88import { convertCbToModelMessages } from '@codebuff/common/util/messages'
99import { withTimeout } from '@codebuff/common/util/promise'
1010import { StopSequenceHandler } from '@codebuff/common/util/stop-sequence'
11- import { generateCompactId } from '@codebuff/common/util/string'
1211import { APICallError , generateObject , generateText , streamText } from 'ai'
1312
1413import { checkLiveUserInput , getLiveUserInputIds } from '../../live-user-inputs'
@@ -252,19 +251,52 @@ export async function promptAiSdk(
252251 messages : convertCbToModelMessages ( params ) ,
253252 } )
254253 const content = response . text
255- const inputTokens = response . usage . inputTokens || 0
256- const outputTokens = response . usage . inputTokens || 0
254+
255+ const messageId = response . response . id
256+ const providerMetadata = response . providerMetadata ?? { }
257+ const usage = response . usage
258+ let inputTokens = usage . inputTokens || 0
259+ const outputTokens = usage . outputTokens || 0
260+ let cacheReadInputTokens : number = 0
261+ let cacheCreationInputTokens : number = 0
262+ let costOverrideDollars : number | undefined
263+ if ( providerMetadata . anthropic ) {
264+ cacheReadInputTokens =
265+ typeof providerMetadata . anthropic . cacheReadInputTokens === 'number'
266+ ? providerMetadata . anthropic . cacheReadInputTokens
267+ : 0
268+ cacheCreationInputTokens =
269+ typeof providerMetadata . anthropic . cacheCreationInputTokens === 'number'
270+ ? providerMetadata . anthropic . cacheCreationInputTokens
271+ : 0
272+ }
273+ if ( providerMetadata . openrouter ) {
274+ if ( providerMetadata . openrouter . usage ) {
275+ const openrouterUsage = providerMetadata . openrouter
276+ . usage as OpenRouterUsageAccounting
277+ cacheReadInputTokens =
278+ openrouterUsage . promptTokensDetails ?. cachedTokens ?? 0
279+ inputTokens = openrouterUsage . promptTokens - cacheReadInputTokens
280+
281+ costOverrideDollars =
282+ ( openrouterUsage . cost ?? 0 ) +
283+ ( openrouterUsage . costDetails ?. upstreamInferenceCost ?? 0 )
284+ }
285+ }
257286
258287 const creditsUsedPromise = saveMessage ( {
259288 ...params ,
260- messageId : generateCompactId ( ) ,
289+ messageId,
261290 request : params . messages ,
262291 response : content ,
263292 inputTokens,
264293 outputTokens,
294+ cacheCreationInputTokens,
295+ cacheReadInputTokens,
265296 finishedAt : new Date ( ) ,
266297 latencyMs : Date . now ( ) - startTime ,
267298 chargeUser : params . chargeUser ?? true ,
299+ costOverrideDollars,
268300 } )
269301
270302 // Call the cost callback if provided
@@ -308,20 +340,52 @@ export async function promptAiSdkStructured<T>(
308340 ? responsePromise
309341 : withTimeout ( responsePromise , params . timeout ) )
310342 const content = response . object
311- const inputTokens = response . usage . inputTokens || 0
312- const outputTokens = response . usage . inputTokens || 0
343+
344+ const messageId = response . response . id
345+ const providerMetadata = response . providerMetadata ?? { }
346+ const usage = response . usage
347+ let inputTokens = usage . inputTokens || 0
348+ const outputTokens = usage . outputTokens || 0
349+ let cacheReadInputTokens : number = 0
350+ let cacheCreationInputTokens : number = 0
351+ let costOverrideDollars : number | undefined
352+ if ( providerMetadata . anthropic ) {
353+ cacheReadInputTokens =
354+ typeof providerMetadata . anthropic . cacheReadInputTokens === 'number'
355+ ? providerMetadata . anthropic . cacheReadInputTokens
356+ : 0
357+ cacheCreationInputTokens =
358+ typeof providerMetadata . anthropic . cacheCreationInputTokens === 'number'
359+ ? providerMetadata . anthropic . cacheCreationInputTokens
360+ : 0
361+ }
362+ if ( providerMetadata . openrouter ) {
363+ if ( providerMetadata . openrouter . usage ) {
364+ const openrouterUsage = providerMetadata . openrouter
365+ . usage as OpenRouterUsageAccounting
366+ cacheReadInputTokens =
367+ openrouterUsage . promptTokensDetails ?. cachedTokens ?? 0
368+ inputTokens = openrouterUsage . promptTokens - cacheReadInputTokens
369+
370+ costOverrideDollars =
371+ ( openrouterUsage . cost ?? 0 ) +
372+ ( openrouterUsage . costDetails ?. upstreamInferenceCost ?? 0 )
373+ }
374+ }
313375
314376 const creditsUsedPromise = saveMessage ( {
315377 ...params ,
316- messageId : generateCompactId ( ) ,
378+ messageId,
317379 request : params . messages ,
318380 response : JSON . stringify ( content ) ,
319381 inputTokens,
320382 outputTokens,
383+ cacheCreationInputTokens,
384+ cacheReadInputTokens,
321385 finishedAt : new Date ( ) ,
322386 latencyMs : Date . now ( ) - startTime ,
323387 chargeUser : params . chargeUser ?? true ,
324- logger ,
388+ costOverrideDollars ,
325389 } )
326390
327391 // Call the cost callback if provided
0 commit comments