From 80d35efab332386acc3305608b1113aa63628c36 Mon Sep 17 00:00:00 2001 From: PratikDhanave Date: Fri, 18 Sep 2026 17:48:51 +0530 Subject: [PATCH] Map Gemini LANGUAGE and UNEXPECTED_TOOL_CALL finish reasons toFinishReason dropped two Gemini finish reasons that the Python client maps: LANGUAGE (an unsupported-language content filter) and UNEXPECTED_TOOL_CALL. Both fell through to the default and returned an empty string instead of their canonical framework values. Map LANGUAGE to content_filter and UNEXPECTED_TOOL_CALL to tool_calls, matching Python's _FINISH_REASON_MAP. --- provider/geminiprovider/agent.go | 4 +++- provider/geminiprovider/agent_test.go | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/provider/geminiprovider/agent.go b/provider/geminiprovider/agent.go index 048210bf..766820b3 100644 --- a/provider/geminiprovider/agent.go +++ b/provider/geminiprovider/agent.go @@ -773,12 +773,14 @@ func toFinishReason(reason genai.FinishReason) string { case genai.FinishReasonMaxTokens: return "length" case genai.FinishReasonSafety, genai.FinishReasonRecitation, + genai.FinishReasonLanguage, genai.FinishReasonBlocklist, genai.FinishReasonProhibitedContent, genai.FinishReasonSPII, genai.FinishReasonImageSafety, genai.FinishReasonImageProhibitedContent, genai.FinishReasonImageRecitation: return "content_filter" - case genai.FinishReasonMalformedFunctionCall, genai.FinishReasonTooManyToolCalls: + case genai.FinishReasonMalformedFunctionCall, genai.FinishReasonTooManyToolCalls, + genai.FinishReasonUnexpectedToolCall: return "tool_calls" default: return "" diff --git a/provider/geminiprovider/agent_test.go b/provider/geminiprovider/agent_test.go index 7e2ccff2..73a008ae 100644 --- a/provider/geminiprovider/agent_test.go +++ b/provider/geminiprovider/agent_test.go @@ -2497,11 +2497,13 @@ func TestFinishReason_NonStreaming(t *testing.T) { {"stop", "STOP", "stop"}, {"max_tokens", "MAX_TOKENS", "length"}, {"safety", "SAFETY", "content_filter"}, + {"language", "LANGUAGE", "content_filter"}, {"image_safety", "IMAGE_SAFETY", "content_filter"}, {"image_prohibited_content", "IMAGE_PROHIBITED_CONTENT", "content_filter"}, {"image_recitation", "IMAGE_RECITATION", "content_filter"}, {"malformed_function_call", "MALFORMED_FUNCTION_CALL", "tool_calls"}, {"too_many_tool_calls", "TOO_MANY_TOOL_CALLS", "tool_calls"}, + {"unexpected_tool_call", "UNEXPECTED_TOOL_CALL", "tool_calls"}, {"unmapped", "OTHER", ""}, } for _, tt := range tests {