@@ -304,46 +304,53 @@ function normalizeClaudeTokenUsage(
304304 return undefined ;
305305 }
306306
307- const record = usage as Record < string , unknown > ;
308- const directUsedTokens =
309- typeof record . total_tokens === "number" && Number . isFinite ( record . total_tokens )
310- ? record . total_tokens
307+ const usageRecord = usage as Record < string , unknown > ;
308+ const directTotalProcessedTokens =
309+ typeof usageRecord . total_tokens === "number" && Number . isFinite ( usageRecord . total_tokens )
310+ ? usageRecord . total_tokens
311311 : undefined ;
312312 const inputTokens =
313- ( typeof record . input_tokens === "number" && Number . isFinite ( record . input_tokens )
314- ? record . input_tokens
313+ ( typeof usageRecord . input_tokens === "number" && Number . isFinite ( usageRecord . input_tokens )
314+ ? usageRecord . input_tokens
315315 : 0 ) +
316- ( typeof record . cache_creation_input_tokens === "number" &&
317- Number . isFinite ( record . cache_creation_input_tokens )
318- ? record . cache_creation_input_tokens
316+ ( typeof usageRecord . cache_creation_input_tokens === "number" &&
317+ Number . isFinite ( usageRecord . cache_creation_input_tokens )
318+ ? usageRecord . cache_creation_input_tokens
319319 : 0 ) +
320- ( typeof record . cache_read_input_tokens === "number" &&
321- Number . isFinite ( record . cache_read_input_tokens )
322- ? record . cache_read_input_tokens
320+ ( typeof usageRecord . cache_read_input_tokens === "number" &&
321+ Number . isFinite ( usageRecord . cache_read_input_tokens )
322+ ? usageRecord . cache_read_input_tokens
323323 : 0 ) ;
324324 const outputTokens =
325- typeof record . output_tokens === "number" && Number . isFinite ( record . output_tokens )
326- ? record . output_tokens
325+ typeof usageRecord . output_tokens === "number" && Number . isFinite ( usageRecord . output_tokens )
326+ ? usageRecord . output_tokens
327327 : 0 ;
328328 const derivedUsedTokens = inputTokens + outputTokens ;
329- const usedTokens = directUsedTokens ?? ( derivedUsedTokens > 0 ? derivedUsedTokens : undefined ) ;
330- if ( usedTokens === undefined || usedTokens <= 0 ) {
329+ const totalProcessedTokens =
330+ directTotalProcessedTokens ?? ( derivedUsedTokens > 0 ? derivedUsedTokens : undefined ) ;
331+ if ( totalProcessedTokens === undefined || totalProcessedTokens <= 0 ) {
331332 return undefined ;
332333 }
333334
335+ const maxTokens =
336+ typeof contextWindow === "number" && Number . isFinite ( contextWindow ) && contextWindow > 0
337+ ? contextWindow
338+ : undefined ;
339+ const usedTokens =
340+ maxTokens !== undefined ? Math . min ( totalProcessedTokens , maxTokens ) : totalProcessedTokens ;
341+
334342 return {
335343 usedTokens,
336344 lastUsedTokens : usedTokens ,
345+ ...( totalProcessedTokens > usedTokens ? { totalProcessedTokens } : { } ) ,
337346 ...( inputTokens > 0 ? { inputTokens } : { } ) ,
338347 ...( outputTokens > 0 ? { outputTokens } : { } ) ,
339- ...( typeof contextWindow === "number" && Number . isFinite ( contextWindow ) && contextWindow > 0
340- ? { maxTokens : contextWindow }
341- : { } ) ,
342- ...( typeof record . tool_uses === "number" && Number . isFinite ( record . tool_uses )
343- ? { toolUses : record . tool_uses }
348+ ...( maxTokens !== undefined ? { maxTokens } : { } ) ,
349+ ...( typeof usageRecord . tool_uses === "number" && Number . isFinite ( usageRecord . tool_uses )
350+ ? { toolUses : usageRecord . tool_uses }
344351 : { } ) ,
345- ...( typeof record . duration_ms === "number" && Number . isFinite ( record . duration_ms )
346- ? { durationMs : record . duration_ms }
352+ ...( typeof usageRecord . duration_ms === "number" && Number . isFinite ( usageRecord . duration_ms )
353+ ? { durationMs : usageRecord . duration_ms }
347354 : { } ) ,
348355 } ;
349356}
@@ -1344,6 +1351,8 @@ const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (
13441351 resultUsage ,
13451352 resultContextWindow ?? context . lastKnownContextWindow ,
13461353 ) ;
1354+ const accumulatedTotalProcessedTokens =
1355+ accumulatedSnapshot ?. totalProcessedTokens ?? accumulatedSnapshot ?. usedTokens ;
13471356 const lastGoodUsage = context . lastKnownTokenUsage ;
13481357 const maxTokens = resultContextWindow ?? context . lastKnownContextWindow ;
13491358 const usageSnapshot : ThreadTokenUsageSnapshot | undefined = lastGoodUsage
@@ -1352,8 +1361,10 @@ const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (
13521361 ...( typeof maxTokens === "number" && Number . isFinite ( maxTokens ) && maxTokens > 0
13531362 ? { maxTokens }
13541363 : { } ) ,
1355- ...( accumulatedSnapshot && accumulatedSnapshot . usedTokens > lastGoodUsage . usedTokens
1356- ? { totalProcessedTokens : accumulatedSnapshot . usedTokens }
1364+ ...( typeof accumulatedTotalProcessedTokens === "number" &&
1365+ Number . isFinite ( accumulatedTotalProcessedTokens ) &&
1366+ accumulatedTotalProcessedTokens > lastGoodUsage . usedTokens
1367+ ? { totalProcessedTokens : accumulatedTotalProcessedTokens }
13571368 : { } ) ,
13581369 }
13591370 : accumulatedSnapshot ;
0 commit comments