@@ -297,53 +297,58 @@ function maxClaudeContextWindowFromModelUsage(modelUsage: unknown): number | und
297297}
298298
299299function normalizeClaudeTokenUsage (
300- usage : unknown ,
300+ value : unknown ,
301301 contextWindow ?: number ,
302302) : ThreadTokenUsageSnapshot | undefined {
303- if ( ! usage || typeof usage !== "object" ) {
303+ if ( ! value || typeof value !== "object" ) {
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
311- : undefined ;
307+ const usage = value as Record < string , unknown > ;
312308 const inputTokens =
313- ( typeof record . input_tokens === "number" && Number . isFinite ( record . input_tokens )
314- ? record . input_tokens
309+ ( typeof usage . input_tokens === "number" && Number . isFinite ( usage . input_tokens )
310+ ? usage . input_tokens
315311 : 0 ) +
316- ( typeof record . cache_creation_input_tokens === "number" &&
317- Number . isFinite ( record . cache_creation_input_tokens )
318- ? record . cache_creation_input_tokens
312+ ( typeof usage . cache_creation_input_tokens === "number" &&
313+ Number . isFinite ( usage . cache_creation_input_tokens )
314+ ? usage . cache_creation_input_tokens
319315 : 0 ) +
320- ( typeof record . cache_read_input_tokens === "number" &&
321- Number . isFinite ( record . cache_read_input_tokens )
322- ? record . cache_read_input_tokens
316+ ( typeof usage . cache_read_input_tokens === "number" &&
317+ Number . isFinite ( usage . cache_read_input_tokens )
318+ ? usage . cache_read_input_tokens
323319 : 0 ) ;
324320 const outputTokens =
325- typeof record . output_tokens === "number" && Number . isFinite ( record . output_tokens )
326- ? record . output_tokens
321+ typeof usage . output_tokens === "number" && Number . isFinite ( usage . output_tokens )
322+ ? usage . output_tokens
327323 : 0 ;
328- const derivedUsedTokens = inputTokens + outputTokens ;
329- const usedTokens = directUsedTokens ?? ( derivedUsedTokens > 0 ? derivedUsedTokens : undefined ) ;
330- if ( usedTokens === undefined || usedTokens <= 0 ) {
324+ const derivedTotalProcessedTokens = inputTokens + outputTokens ;
325+ const totalProcessedTokens =
326+ ( typeof usage . total_tokens === "number" && Number . isFinite ( usage . total_tokens )
327+ ? usage . total_tokens
328+ : undefined ) ?? ( derivedTotalProcessedTokens > 0 ? derivedTotalProcessedTokens : undefined ) ;
329+ if ( totalProcessedTokens === undefined || totalProcessedTokens <= 0 ) {
331330 return undefined ;
332331 }
333332
333+ const maxTokens =
334+ typeof contextWindow === "number" && Number . isFinite ( contextWindow ) && contextWindow > 0
335+ ? contextWindow
336+ : undefined ;
337+ const usedTokens =
338+ maxTokens !== undefined ? Math . min ( totalProcessedTokens , maxTokens ) : totalProcessedTokens ;
339+
334340 return {
335341 usedTokens,
336342 lastUsedTokens : usedTokens ,
343+ ...( totalProcessedTokens > usedTokens ? { totalProcessedTokens } : { } ) ,
337344 ...( inputTokens > 0 ? { inputTokens } : { } ) ,
338345 ...( 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 }
346+ ...( maxTokens !== undefined ? { maxTokens } : { } ) ,
347+ ...( typeof usage . tool_uses === "number" && Number . isFinite ( usage . tool_uses )
348+ ? { toolUses : usage . tool_uses }
344349 : { } ) ,
345- ...( typeof record . duration_ms === "number" && Number . isFinite ( record . duration_ms )
346- ? { durationMs : record . duration_ms }
350+ ...( typeof usage . duration_ms === "number" && Number . isFinite ( usage . duration_ms )
351+ ? { durationMs : usage . duration_ms }
347352 : { } ) ,
348353 } ;
349354}
@@ -1344,6 +1349,8 @@ const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (
13441349 resultUsage ,
13451350 resultContextWindow ?? context . lastKnownContextWindow ,
13461351 ) ;
1352+ const accumulatedTotalProcessedTokens =
1353+ accumulatedSnapshot ?. totalProcessedTokens ?? accumulatedSnapshot ?. usedTokens ;
13471354 const lastGoodUsage = context . lastKnownTokenUsage ;
13481355 const maxTokens = resultContextWindow ?? context . lastKnownContextWindow ;
13491356 const usageSnapshot : ThreadTokenUsageSnapshot | undefined = lastGoodUsage
@@ -1352,8 +1359,10 @@ const makeClaudeAdapter = Effect.fn("makeClaudeAdapter")(function* (
13521359 ...( typeof maxTokens === "number" && Number . isFinite ( maxTokens ) && maxTokens > 0
13531360 ? { maxTokens }
13541361 : { } ) ,
1355- ...( accumulatedSnapshot && accumulatedSnapshot . usedTokens > lastGoodUsage . usedTokens
1356- ? { totalProcessedTokens : accumulatedSnapshot . usedTokens }
1362+ ...( typeof accumulatedTotalProcessedTokens === "number" &&
1363+ Number . isFinite ( accumulatedTotalProcessedTokens ) &&
1364+ accumulatedTotalProcessedTokens > lastGoodUsage . usedTokens
1365+ ? { totalProcessedTokens : accumulatedTotalProcessedTokens }
13571366 : { } ) ,
13581367 }
13591368 : accumulatedSnapshot ;
0 commit comments