@@ -194,6 +194,7 @@ export const toHeliconeRequest = (context: HandlerContext): HeliconeRequest => {
194194 ) ;
195195 const promptAudioTokens = getPromptAudioTokens ( modelUsage , legacyUsage ) ;
196196 const completionAudioTokens = legacyUsage . completionAudioTokens ?? null ;
197+ const reasoningTokens = getReasoningTokens ( modelUsage ) ;
197198
198199 return {
199200 cost : context . costBreakdown ?. totalCost ?? legacyUsage . cost ?? null ,
@@ -230,6 +231,7 @@ export const toHeliconeRequest = (context: HandlerContext): HeliconeRequest => {
230231 prompt_cache_read_tokens : isCacheHit ? 0 : promptCacheReadTokens ,
231232 prompt_audio_tokens : isCacheHit ? 0 : promptAudioTokens ,
232233 completion_audio_tokens : isCacheHit ? 0 : completionAudioTokens ,
234+ reasoning_tokens : isCacheHit ? 0 : reasoningTokens ,
233235
234236 /// NOTE: Unfortunately our codebase is running two prompts systems in parallel.
235237 // This used to track the legacy feature, but its now the new one.
@@ -286,9 +288,9 @@ export function getCompletionTokens(
286288 ( modelUsage . image ?. output ?? 0 ) +
287289 ( modelUsage . video ?. output ?? 0 ) +
288290 ( modelUsage . file ?. output ?? 0 ) ;
289- const thinking = modelUsage . thinking ?? 0 ;
290- if ( modelUsage . output > 0 || modalityOutput > 0 || thinking > 0 ) {
291- return modelUsage . output + modalityOutput + thinking ;
291+ // Note: reasoning/ thinking tokens are now tracked separately and NOT included in completion tokens
292+ if ( modelUsage . output > 0 || modalityOutput > 0 ) {
293+ return modelUsage . output + modalityOutput ;
292294 }
293295 }
294296 return legacyUsage . completionTokens ?? null ;
@@ -300,9 +302,16 @@ function getTotalTokens(
300302) : number | null {
301303 const promptTokens = getPromptTokens ( modelUsage , legacyUsage ) ;
302304 const completionTokens = getCompletionTokens ( modelUsage , legacyUsage ) ;
305+ const reasoningTokens = getReasoningTokens ( modelUsage ) ;
303306
304- if ( promptTokens !== null || completionTokens !== null ) {
305- return ( promptTokens ?? 0 ) + ( completionTokens ?? 0 ) ;
307+ if (
308+ promptTokens !== null ||
309+ completionTokens !== null ||
310+ reasoningTokens !== null
311+ ) {
312+ return (
313+ ( promptTokens ?? 0 ) + ( completionTokens ?? 0 ) + ( reasoningTokens ?? 0 )
314+ ) ;
306315 }
307316 return legacyUsage . totalTokens ?? null ;
308317}
@@ -357,3 +366,12 @@ export function getCompletionAudioTokens(
357366 }
358367 return legacyUsage . completionAudioTokens ?? null ;
359368}
369+
370+ export function getReasoningTokens (
371+ modelUsage : ModelUsage | undefined
372+ ) : number | null {
373+ if ( modelUsage ?. thinking !== undefined && modelUsage . thinking > 0 ) {
374+ return modelUsage . thinking ;
375+ }
376+ return null ;
377+ }
0 commit comments