fix: parse gemini cli usage metadata variants

This commit is contained in:
sususu98
2026-04-29 12:46:53 +08:00
parent 2ea8f77efb
commit 4982512da2
3 changed files with 80 additions and 8 deletions
@@ -370,12 +370,22 @@ func parseGeminiFamilyUsageDetail(node gjson.Result) usage.Detail {
return detail
}
func hasGeminiFamilyUsageTokenFields(node gjson.Result) bool {
return node.Get("promptTokenCount").Exists() ||
node.Get("candidatesTokenCount").Exists() ||
node.Get("thoughtsTokenCount").Exists() ||
node.Get("totalTokenCount").Exists() ||
node.Get("cachedContentTokenCount").Exists()
}
func ParseGeminiCLIUsage(data []byte) usage.Detail {
usageNode := gjson.ParseBytes(data)
node := usageNode.Get("response.usageMetadata")
if !node.Exists() {
node = usageNode.Get("response.usage_metadata")
}
node := firstExistingUsageNode(usageNode,
"response.usageMetadata",
"response.usage_metadata",
"usageMetadata",
"usage_metadata",
)
if !node.Exists() {
return usage.Detail{}
}
@@ -414,16 +424,32 @@ func ParseGeminiCLIStreamUsage(line []byte) (usage.Detail, bool) {
if len(payload) == 0 || !gjson.ValidBytes(payload) {
return usage.Detail{}, false
}
node := gjson.GetBytes(payload, "response.usageMetadata")
if !node.Exists() {
node = gjson.GetBytes(payload, "usage_metadata")
}
root := gjson.ParseBytes(payload)
node := firstExistingUsageNode(root,
"response.usageMetadata",
"response.usage_metadata",
"usageMetadata",
"usage_metadata",
)
if !node.Exists() {
return usage.Detail{}, false
}
if !hasGeminiFamilyUsageTokenFields(node) {
return usage.Detail{}, false
}
return parseGeminiFamilyUsageDetail(node), true
}
func firstExistingUsageNode(root gjson.Result, paths ...string) gjson.Result {
for _, path := range paths {
node := root.Get(path)
if node.Exists() {
return node
}
}
return gjson.Result{}
}
func ParseAntigravityUsage(data []byte) usage.Detail {
usageNode := gjson.ParseBytes(data)
node := usageNode.Get("response.usageMetadata")