@@ -13,6 +13,23 @@ type CompletionRequestInput = {
1313
1414type 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+
1633const 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+
5091export 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