From 969c1a5b724301566a0b784133b40aefa746fcc5 Mon Sep 17 00:00:00 2001 From: NguyenSiTrung Date: Wed, 24 Dec 2025 10:22:31 +0700 Subject: [PATCH] refactor: extract parseGeminiFamilyUsageDetail helper to reduce duplication --- internal/runtime/executor/usage_helpers.go | 82 +++++----------------- 1 file changed, 18 insertions(+), 64 deletions(-) diff --git a/internal/runtime/executor/usage_helpers.go b/internal/runtime/executor/usage_helpers.go index 0d0fa5ab..78581b82 100644 --- a/internal/runtime/executor/usage_helpers.go +++ b/internal/runtime/executor/usage_helpers.go @@ -275,15 +275,7 @@ func parseClaudeStreamUsage(line []byte) (usage.Detail, bool) { return detail, true } -func parseGeminiCLIUsage(data []byte) usage.Detail { - usageNode := gjson.ParseBytes(data) - node := usageNode.Get("response.usageMetadata") - if !node.Exists() { - node = usageNode.Get("response.usage_metadata") - } - if !node.Exists() { - return usage.Detail{} - } +func parseGeminiFamilyUsageDetail(node gjson.Result) usage.Detail { detail := usage.Detail{ InputTokens: node.Get("promptTokenCount").Int(), OutputTokens: node.Get("candidatesTokenCount").Int(), @@ -297,6 +289,18 @@ func parseGeminiCLIUsage(data []byte) usage.Detail { return detail } +func parseGeminiCLIUsage(data []byte) usage.Detail { + usageNode := gjson.ParseBytes(data) + node := usageNode.Get("response.usageMetadata") + if !node.Exists() { + node = usageNode.Get("response.usage_metadata") + } + if !node.Exists() { + return usage.Detail{} + } + return parseGeminiFamilyUsageDetail(node) +} + func parseGeminiUsage(data []byte) usage.Detail { usageNode := gjson.ParseBytes(data) node := usageNode.Get("usageMetadata") @@ -306,17 +310,7 @@ func parseGeminiUsage(data []byte) usage.Detail { if !node.Exists() { return usage.Detail{} } - detail := usage.Detail{ - InputTokens: node.Get("promptTokenCount").Int(), - OutputTokens: node.Get("candidatesTokenCount").Int(), - ReasoningTokens: node.Get("thoughtsTokenCount").Int(), - TotalTokens: node.Get("totalTokenCount").Int(), - CachedTokens: node.Get("cachedContentTokenCount").Int(), - } - if detail.TotalTokens == 0 { - detail.TotalTokens = detail.InputTokens + detail.OutputTokens + detail.ReasoningTokens - } - return detail + return parseGeminiFamilyUsageDetail(node) } func parseGeminiStreamUsage(line []byte) (usage.Detail, bool) { @@ -331,17 +325,7 @@ func parseGeminiStreamUsage(line []byte) (usage.Detail, bool) { if !node.Exists() { return usage.Detail{}, false } - detail := usage.Detail{ - InputTokens: node.Get("promptTokenCount").Int(), - OutputTokens: node.Get("candidatesTokenCount").Int(), - ReasoningTokens: node.Get("thoughtsTokenCount").Int(), - TotalTokens: node.Get("totalTokenCount").Int(), - CachedTokens: node.Get("cachedContentTokenCount").Int(), - } - if detail.TotalTokens == 0 { - detail.TotalTokens = detail.InputTokens + detail.OutputTokens + detail.ReasoningTokens - } - return detail, true + return parseGeminiFamilyUsageDetail(node), true } func parseGeminiCLIStreamUsage(line []byte) (usage.Detail, bool) { @@ -356,17 +340,7 @@ func parseGeminiCLIStreamUsage(line []byte) (usage.Detail, bool) { if !node.Exists() { return usage.Detail{}, false } - detail := usage.Detail{ - InputTokens: node.Get("promptTokenCount").Int(), - OutputTokens: node.Get("candidatesTokenCount").Int(), - ReasoningTokens: node.Get("thoughtsTokenCount").Int(), - TotalTokens: node.Get("totalTokenCount").Int(), - CachedTokens: node.Get("cachedContentTokenCount").Int(), - } - if detail.TotalTokens == 0 { - detail.TotalTokens = detail.InputTokens + detail.OutputTokens + detail.ReasoningTokens - } - return detail, true + return parseGeminiFamilyUsageDetail(node), true } func parseAntigravityUsage(data []byte) usage.Detail { @@ -381,17 +355,7 @@ func parseAntigravityUsage(data []byte) usage.Detail { if !node.Exists() { return usage.Detail{} } - detail := usage.Detail{ - InputTokens: node.Get("promptTokenCount").Int(), - OutputTokens: node.Get("candidatesTokenCount").Int(), - ReasoningTokens: node.Get("thoughtsTokenCount").Int(), - TotalTokens: node.Get("totalTokenCount").Int(), - CachedTokens: node.Get("cachedContentTokenCount").Int(), - } - if detail.TotalTokens == 0 { - detail.TotalTokens = detail.InputTokens + detail.OutputTokens + detail.ReasoningTokens - } - return detail + return parseGeminiFamilyUsageDetail(node) } func parseAntigravityStreamUsage(line []byte) (usage.Detail, bool) { @@ -409,17 +373,7 @@ func parseAntigravityStreamUsage(line []byte) (usage.Detail, bool) { if !node.Exists() { return usage.Detail{}, false } - detail := usage.Detail{ - InputTokens: node.Get("promptTokenCount").Int(), - OutputTokens: node.Get("candidatesTokenCount").Int(), - ReasoningTokens: node.Get("thoughtsTokenCount").Int(), - TotalTokens: node.Get("totalTokenCount").Int(), - CachedTokens: node.Get("cachedContentTokenCount").Int(), - } - if detail.TotalTokens == 0 { - detail.TotalTokens = detail.InputTokens + detail.OutputTokens + detail.ReasoningTokens - } - return detail, true + return parseGeminiFamilyUsageDetail(node), true } var stopChunkWithoutUsage sync.Map