Skip to content

Commit 51a5f45

Browse files
committed
feat: add token usage extraction and include used tokens in API response
1 parent 9d36641 commit 51a5f45

1 file changed

Lines changed: 43 additions & 0 deletions

File tree

index.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,23 @@ type CompletionRequestInput = {
1313

1414
type AgentModelPurpose = "primary" | "summary";
1515

16+
type GeminiUsageMetadata = {
17+
promptTokenCount?: number;
18+
cachedContentTokenCount?: number;
19+
candidatesTokenCount?: number;
20+
thoughtsTokenCount?: number;
21+
prompt_token_count?: number;
22+
cached_content_token_count?: number;
23+
candidates_token_count?: number;
24+
thoughts_token_count?: number;
25+
};
26+
27+
type UsedTokens = {
28+
input_uncached: number;
29+
input_cached: number;
30+
output: number;
31+
};
32+
1633
const GOOGLE_LANGCHAIN_AGENT_OPTION_KEYS = [
1734
"temperature",
1835
"topP",
@@ -47,6 +64,30 @@ function getGoogleLangChainAgentOptions(
4764
return options;
4865
}
4966

67+
function extractUsedTokens(usageMetadata?: GeminiUsageMetadata): UsedTokens | undefined {
68+
if (!usageMetadata) return undefined;
69+
70+
const input = usageMetadata.promptTokenCount ?? usageMetadata.prompt_token_count ?? 0;
71+
const inputCached =
72+
usageMetadata.cachedContentTokenCount ??
73+
usageMetadata.cached_content_token_count ??
74+
0;
75+
const output =
76+
usageMetadata.candidatesTokenCount ??
77+
usageMetadata.candidates_token_count ??
78+
0;
79+
const thoughts =
80+
usageMetadata.thoughtsTokenCount ??
81+
usageMetadata.thoughts_token_count ??
82+
0;
83+
84+
return {
85+
input_uncached: Math.max(input - inputCached, 0),
86+
input_cached: inputCached,
87+
output: output + thoughts,
88+
};
89+
}
90+
5091
export default class CompletionAdapterGoogleGemini
5192
implements CompletionAdapter
5293
{
@@ -103,6 +144,7 @@ export default class CompletionAdapterGoogleGemini
103144
content?: string;
104145
finishReason?: string;
105146
error?: string;
147+
used_tokens?: UsedTokens;
106148
}> => {
107149
const request =
108150
typeof requestOrContent === "string"
@@ -150,6 +192,7 @@ export default class CompletionAdapterGoogleGemini
150192
logger.debug(`Google Gemini SUCCESSFUL API response: ${response}`);
151193
return {
152194
content: response.text,
195+
used_tokens: extractUsedTokens(response.usageMetadata),
153196
};
154197
} catch (error) {
155198
logger.error(`Error during Google Gemini API call: ${error}`);

0 commit comments

Comments
 (0)