From 4806c60bf71abd4d8e6c633f342cb11a6c5d409e Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Fri, 31 Oct 2025 14:45:17 +0000 Subject: [PATCH] feat(firebase_ai): add malformedFunctionCall reason to FinishReason enum and update tests --- packages/firebase_ai/firebase_ai/lib/src/api.dart | 4 ++++ .../firebase_ai/firebase_ai/test/api_test.dart | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/packages/firebase_ai/firebase_ai/lib/src/api.dart b/packages/firebase_ai/firebase_ai/lib/src/api.dart index 4c38ec4b0f6a..1f9b654affa5 100644 --- a/packages/firebase_ai/firebase_ai/lib/src/api.dart +++ b/packages/firebase_ai/firebase_ai/lib/src/api.dart @@ -751,6 +751,9 @@ enum FinishReason { /// The candidate content was flagged for recitation reasons. recitation('RECITATION'), + /// The candidate content was flagged for malformed function call reasons. + malformedFunctionCall('MALFORMED_FUNCTION_CALL'), + /// Unknown reason. other('OTHER'); @@ -770,6 +773,7 @@ enum FinishReason { 'SAFETY' => FinishReason.safety, 'RECITATION' => FinishReason.recitation, 'OTHER' => FinishReason.other, + 'MALFORMED_FUNCTION_CALL' => FinishReason.malformedFunctionCall, _ => throw FormatException('Unhandled FinishReason format', jsonObject), }; } diff --git a/packages/firebase_ai/firebase_ai/test/api_test.dart b/packages/firebase_ai/firebase_ai/test/api_test.dart index ef7e59ebe793..9ed053a91031 100644 --- a/packages/firebase_ai/firebase_ai/test/api_test.dart +++ b/packages/firebase_ai/firebase_ai/test/api_test.dart @@ -312,6 +312,8 @@ void main() { expect(FinishReason.maxTokens.toJson(), 'MAX_TOKENS'); expect(FinishReason.safety.toJson(), 'SAFETY'); expect(FinishReason.recitation.toJson(), 'RECITATION'); + expect(FinishReason.malformedFunctionCall.toJson(), + 'MALFORMED_FUNCTION_CALL'); expect(FinishReason.other.toJson(), 'OTHER'); }); @@ -973,6 +975,18 @@ void main() { (e) => e.message, 'message', contains('WebGroundingChunk')))); }); + test('parses malformedFunctionCall finishReason', () { + final jsonResponse = { + 'candidates': [ + {'finishReason': 'MALFORMED_FUNCTION_CALL'} + ] + }; + final response = + VertexSerialization().parseGenerateContentResponse(jsonResponse); + expect(response.candidates.first.finishReason, + FinishReason.malformedFunctionCall); + }); + test( 'parses groundingSupport and filters out entries without a segment', () {