@@ -2,26 +2,24 @@ import { useMemo } from "react";
22import { useAppSelector } from "./useAppSelector" ;
33import { isAssistantMessage } from "../events" ;
44import { selectMessages } from "../features/Chat" ;
5+ import { type Usage } from "../services/refact/chat" ;
56import {
6- CompletionTokenDetails ,
7- PromptTokenDetails ,
8- type Usage ,
9- } from "../services/refact/chat" ;
10- import { calculateUsageInputTokens } from "../utils/calculateUsageInputTokens" ;
7+ calculateUsageInputTokens ,
8+ mergeUsages ,
9+ } from "../utils/calculateUsageInputTokens" ;
1110
1211const TOKEN_LIMIT = 200_000 ;
1312export function useTotalTokenUsage ( ) {
1413 const messages = useAppSelector ( selectMessages ) ;
1514
1615 const summedUsages = useMemo ( ( ) => {
17- return messages . reduce < Usage | null > ( ( acc , message ) => {
18- if ( acc && isAssistantMessage ( message ) && message . usage ) {
19- return sumUsages ( acc , message . usage ) ;
20- } else if ( isAssistantMessage ( message ) && message . usage ) {
21- return message . usage ;
16+ const usages = messages . reduce < Usage [ ] > ( ( acc , message ) => {
17+ if ( isAssistantMessage ( message ) && message . usage ) {
18+ return [ ...acc , message . usage ] ;
2219 }
2320 return acc ;
24- } , null ) ;
21+ } , [ ] ) ;
22+ return mergeUsages ( usages ) ;
2523 } , [ messages ] ) ;
2624
2725 const tokens = useMemo ( ( ) => {
@@ -31,7 +29,6 @@ export function useTotalTokenUsage() {
3129 "prompt_tokens" ,
3230 "cache_creation_input_tokens" ,
3331 "cache_read_input_tokens" ,
34- "completion_tokens" ,
3532 ] ,
3633 usage : summedUsages ,
3734 } ) ;
@@ -48,59 +45,3 @@ export function useTotalTokenUsage() {
4845 limit : TOKEN_LIMIT ,
4946 } ;
5047}
51-
52- function addCompletionDetails (
53- a : CompletionTokenDetails | null ,
54- b : CompletionTokenDetails | null ,
55- ) : CompletionTokenDetails | null {
56- if ( ! a && ! b ) return null ;
57- if ( ! a ) return b ;
58- if ( ! b ) return a ;
59-
60- return {
61- accepted_prediction_tokens :
62- a . accepted_prediction_tokens + b . accepted_prediction_tokens ,
63- audio_tokens : a . audio_tokens + b . audio_tokens ,
64- reasoning_tokens : a . reasoning_tokens + b . reasoning_tokens ,
65- rejected_prediction_tokens :
66- a . rejected_prediction_tokens + b . rejected_prediction_tokens ,
67- } ;
68- }
69-
70- function addPromptTokenDetails (
71- a : PromptTokenDetails | null ,
72- b : PromptTokenDetails | null ,
73- ) : PromptTokenDetails | null {
74- if ( ! a && ! b ) return null ;
75- if ( ! a ) return b ;
76- if ( ! b ) return a ;
77-
78- return {
79- audio_tokens : a . audio_tokens + b . audio_tokens ,
80- cached_tokens : a . cached_tokens + b . cached_tokens ,
81- } ;
82- }
83-
84- function sumUsages ( a : Usage , b : Usage ) : Usage {
85- const completionDetails = addCompletionDetails (
86- a . completion_tokens_details ,
87- b . completion_tokens_details ,
88- ) ;
89- const promptDetails = addPromptTokenDetails (
90- a . prompt_tokens_details ,
91- b . prompt_tokens_details ,
92- ) ;
93-
94- return {
95- completion_tokens : a . completion_tokens + b . completion_tokens ,
96- prompt_tokens : a . prompt_tokens + b . prompt_tokens ,
97- total_tokens : a . total_tokens + b . total_tokens ,
98- completion_tokens_details : completionDetails ,
99- prompt_tokens_details : promptDetails ,
100- cache_creation_input_tokens :
101- ( a . cache_creation_input_tokens ?? 0 ) +
102- ( b . cache_creation_input_tokens ?? 0 ) ,
103- cache_read_input_tokens :
104- ( a . cache_read_input_tokens ?? 0 ) + ( b . cache_read_input_tokens ?? 0 ) ,
105- } ;
106- }
0 commit comments