Unified · Split
| @@ -486,7 +486,7 @@ func FilterSSEUsageMetadata(payload []byte) []byte { · 485 unmodified lines | |||
| 486 | return bytes.Join(lines, []byte("\n")) | 486 | return bytes.Join(lines, []byte("\n")) |
| 487 | } | 487 | } |
| 488 | 488 | ||
| 489 | // StripUsageMetadataFromJSON drops usageMetadata unless finishReason is "stop". | 489 | // StripUsageMetadataFromJSON drops usageMetadata unless finishReason is present (terminal). |
| 490 | // It handles both formats: | 490 | // It handles both formats: |
| 491 | // - Aistudio: candidates.0.finishReason | 491 | // - Aistudio: candidates.0.finishReason |
| 492 | // - Antigravity: response.candidates.0.finishReason | 492 | // - Antigravity: response.candidates.0.finishReason |
| @@ -501,15 +501,15 @@ func StripUsageMetadataFromJSON(rawJSON []byte) ([]byte, bool) { · 8 unmodified lines | |||
| 501 | if !finishReason.Exists() { | 501 | if !finishReason.Exists() { |
| 502 | finishReason = gjson.GetBytes(jsonBytes, "response.candidates.0.finishReason") | 502 | finishReason = gjson.GetBytes(jsonBytes, "response.candidates.0.finishReason") |
| 503 | } | 503 | } |
| 504 | stopReason := finishReason.Exists() && strings.ToLower(strings.TrimSpace(finishReason.String())) == "stop" | 504 | terminalReason := finishReason.Exists() && strings.TrimSpace(finishReason.String()) != "" |
| 505 | 505 | ||
| 506 | usageMetadata := gjson.GetBytes(jsonBytes, "usageMetadata") | 506 | usageMetadata := gjson.GetBytes(jsonBytes, "usageMetadata") |
| 507 | if !usageMetadata.Exists() { | 507 | if !usageMetadata.Exists() { |
| 508 | usageMetadata = gjson.GetBytes(jsonBytes, "response.usageMetadata") | 508 | usageMetadata = gjson.GetBytes(jsonBytes, "response.usageMetadata") |
| 509 | } | 509 | } |
| 510 | 510 | ||
| 511 | // Stop chunk: keep as-is. | 511 | // Terminal chunk: keep as-is. |
| 512 | if stopReason { | 512 | if terminalReason { |
| 513 | return rawJSON, false | 513 | return rawJSON, false |
| 514 | } | 514 | } |
| 515 | 515 | ||
| @@ -556,7 +556,8 @@ func isStopChunkWithoutUsage(jsonBytes []byte) bool { · 40 unmodified lines | |||
| 556 | if !finishReason.Exists() { | 556 | if !finishReason.Exists() { |
| 557 | finishReason = gjson.GetBytes(jsonBytes, "response.candidates.0.finishReason") | 557 | finishReason = gjson.GetBytes(jsonBytes, "response.candidates.0.finishReason") |
| 558 | } | 558 | } |
| 559 | if !finishReason.Exists() || strings.ToLower(strings.TrimSpace(finishReason.String())) != "stop" { | 559 | trimmed := strings.TrimSpace(finishReason.String()) |
| 560 | if !finishReason.Exists() || trimmed == "" { | ||
| 560 | return false | 561 | return false |
| 561 | } | 562 | } |
| 562 | return !hasUsageMetadata(jsonBytes) | 563 | return !hasUsageMetadata(jsonBytes) |