Skip to content

Commit d04fa12

Browse files
MarcMcIntoshalashchev17
authored andcommitted
refactor: usage total.
1 parent 51cba77 commit d04fa12

File tree

1 file changed

+9
-68
lines changed

1 file changed

+9
-68
lines changed

refact-agent/gui/src/hooks/useTotalTokenUsage.ts

Lines changed: 9 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,24 @@ import { useMemo } from "react";
22
import { useAppSelector } from "./useAppSelector";
33
import { isAssistantMessage } from "../events";
44
import { selectMessages } from "../features/Chat";
5+
import { type Usage } from "../services/refact/chat";
56
import {
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

1211
const TOKEN_LIMIT = 200_000;
1312
export 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

Comments
 (0)