From d9438a1a4a3db68ac95850854f009aac0675f1c1 Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Tue, 27 Jan 2026 18:58:58 -0800 Subject: [PATCH 1/2] fix(gemini): token count --- apps/sim/executor/handlers/agent/agent-handler.ts | 8 ++++++-- apps/sim/executor/handlers/agent/types.ts | 4 ++-- apps/sim/providers/google/utils.ts | 7 +++++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/sim/executor/handlers/agent/agent-handler.ts b/apps/sim/executor/handlers/agent/agent-handler.ts index a22f7a8c4c..007833d9cb 100644 --- a/apps/sim/executor/handlers/agent/agent-handler.ts +++ b/apps/sim/executor/handlers/agent/agent-handler.ts @@ -936,8 +936,12 @@ export class AgentBlockHandler implements BlockHandler { systemPrompt: validMessages ? undefined : inputs.systemPrompt, context: validMessages ? undefined : stringifyJSON(messages), tools: formattedTools, - temperature: inputs.temperature != null ? Number(inputs.temperature) : undefined, - maxTokens: inputs.maxTokens != null ? Number(inputs.maxTokens) : undefined, + temperature: + inputs.temperature != null && inputs.temperature !== '' + ? Number(inputs.temperature) + : undefined, + maxTokens: + inputs.maxTokens != null && inputs.maxTokens !== '' ? Number(inputs.maxTokens) : undefined, apiKey: inputs.apiKey, azureEndpoint: inputs.azureEndpoint, azureApiVersion: inputs.azureApiVersion, diff --git a/apps/sim/executor/handlers/agent/types.ts b/apps/sim/executor/handlers/agent/types.ts index c3050f3a08..411b02a27b 100644 --- a/apps/sim/executor/handlers/agent/types.ts +++ b/apps/sim/executor/handlers/agent/types.ts @@ -14,8 +14,8 @@ export interface AgentInputs { slidingWindowSize?: string // For message-based sliding window slidingWindowTokens?: string // For token-based sliding window // LLM parameters - temperature?: number - maxTokens?: number + temperature?: string + maxTokens?: string apiKey?: string azureEndpoint?: string azureApiVersion?: string diff --git a/apps/sim/providers/google/utils.ts b/apps/sim/providers/google/utils.ts index 7240947849..a38ce295c3 100644 --- a/apps/sim/providers/google/utils.ts +++ b/apps/sim/providers/google/utils.ts @@ -123,13 +123,16 @@ export function extractFunctionCallPart(candidate: Candidate | undefined): Part } /** - * Converts usage metadata from SDK response to our format + * Converts usage metadata from SDK response to our format. + * Includes thinking tokens in candidatesTokenCount for correct billing. */ export function convertUsageMetadata( usageMetadata: GenerateContentResponseUsageMetadata | undefined ): GeminiUsage { const promptTokenCount = usageMetadata?.promptTokenCount ?? 0 - const candidatesTokenCount = usageMetadata?.candidatesTokenCount ?? 0 + const thoughtsTokenCount = usageMetadata?.thoughtsTokenCount ?? 0 + // Include thinking tokens in output count for correct billing + const candidatesTokenCount = (usageMetadata?.candidatesTokenCount ?? 0) + thoughtsTokenCount return { promptTokenCount, candidatesTokenCount, From cfa797468ad0b6543c92b58324f954598ab46a44 Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Tue, 27 Jan 2026 19:09:49 -0800 Subject: [PATCH 2/2] fix to include tool call tokens --- apps/sim/providers/google/utils.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/sim/providers/google/utils.ts b/apps/sim/providers/google/utils.ts index a38ce295c3..c5040aab49 100644 --- a/apps/sim/providers/google/utils.ts +++ b/apps/sim/providers/google/utils.ts @@ -124,19 +124,20 @@ export function extractFunctionCallPart(candidate: Candidate | undefined): Part /** * Converts usage metadata from SDK response to our format. - * Includes thinking tokens in candidatesTokenCount for correct billing. + * Per Gemini docs, total = promptTokenCount + candidatesTokenCount + toolUsePromptTokenCount + thoughtsTokenCount + * We include toolUsePromptTokenCount in input and thoughtsTokenCount in output for correct billing. */ export function convertUsageMetadata( usageMetadata: GenerateContentResponseUsageMetadata | undefined ): GeminiUsage { - const promptTokenCount = usageMetadata?.promptTokenCount ?? 0 const thoughtsTokenCount = usageMetadata?.thoughtsTokenCount ?? 0 - // Include thinking tokens in output count for correct billing + const toolUsePromptTokenCount = usageMetadata?.toolUsePromptTokenCount ?? 0 + const promptTokenCount = (usageMetadata?.promptTokenCount ?? 0) + toolUsePromptTokenCount const candidatesTokenCount = (usageMetadata?.candidatesTokenCount ?? 0) + thoughtsTokenCount return { promptTokenCount, candidatesTokenCount, - totalTokenCount: usageMetadata?.totalTokenCount ?? promptTokenCount + candidatesTokenCount, + totalTokenCount: usageMetadata?.totalTokenCount ?? 0, } }