fix(runtime): treat non-empty finishReason as terminal

This commit is contained in:
hkfires
2025-11-22 15:39:46 +08:00
parent 8356b35320
commit d32bb9db6b

View File

@@ -486,7 +486,7 @@ func FilterSSEUsageMetadata(payload []byte) []byte {
return bytes.Join(lines, []byte("\n")) return bytes.Join(lines, []byte("\n"))
} }
// StripUsageMetadataFromJSON drops usageMetadata unless finishReason is "stop". // StripUsageMetadataFromJSON drops usageMetadata unless finishReason is present (terminal).
// It handles both formats: // It handles both formats:
// - Aistudio: candidates.0.finishReason // - Aistudio: candidates.0.finishReason
// - Antigravity: response.candidates.0.finishReason // - Antigravity: response.candidates.0.finishReason
@@ -501,15 +501,15 @@ func StripUsageMetadataFromJSON(rawJSON []byte) ([]byte, bool) {
if !finishReason.Exists() { if !finishReason.Exists() {
finishReason = gjson.GetBytes(jsonBytes, "response.candidates.0.finishReason") finishReason = gjson.GetBytes(jsonBytes, "response.candidates.0.finishReason")
} }
stopReason := finishReason.Exists() && strings.ToLower(strings.TrimSpace(finishReason.String())) == "stop" terminalReason := finishReason.Exists() && strings.TrimSpace(finishReason.String()) != ""
usageMetadata := gjson.GetBytes(jsonBytes, "usageMetadata") usageMetadata := gjson.GetBytes(jsonBytes, "usageMetadata")
if !usageMetadata.Exists() { if !usageMetadata.Exists() {
usageMetadata = gjson.GetBytes(jsonBytes, "response.usageMetadata") usageMetadata = gjson.GetBytes(jsonBytes, "response.usageMetadata")
} }
// Stop chunk: keep as-is. // Terminal chunk: keep as-is.
if stopReason { if terminalReason {
return rawJSON, false return rawJSON, false
} }
@@ -556,7 +556,8 @@ func isStopChunkWithoutUsage(jsonBytes []byte) bool {
if !finishReason.Exists() { if !finishReason.Exists() {
finishReason = gjson.GetBytes(jsonBytes, "response.candidates.0.finishReason") finishReason = gjson.GetBytes(jsonBytes, "response.candidates.0.finishReason")
} }
if !finishReason.Exists() || strings.ToLower(strings.TrimSpace(finishReason.String())) != "stop" { trimmed := strings.TrimSpace(finishReason.String())
if !finishReason.Exists() || trimmed == "" {
return false return false
} }
return !hasUsageMetadata(jsonBytes) return !hasUsageMetadata(jsonBytes)