From 242c8ed9f1ca5ad4715ec3267dfdd89fa2362bbd Mon Sep 17 00:00:00 2001 From: shrey kharbanda Date: Thu, 24 Sep 2026 16:42:35 +0000 Subject: [PATCH] fix(gemini): return malformed Anthropic messages as an invalid request instead of raising from the token counter --- litellm/llms/gemini/count_tokens/transformation.py | 9 ++++++--- .../llms/gemini/count_tokens/test_transformation.py | 9 +++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/litellm/llms/gemini/count_tokens/transformation.py b/litellm/llms/gemini/count_tokens/transformation.py index 5450aac5c3d..1f5739868b4 100644 --- a/litellm/llms/gemini/count_tokens/transformation.py +++ b/litellm/llms/gemini/count_tokens/transformation.py @@ -54,9 +54,12 @@ def build_count_tokens_payload(raw: AnthropicCountTokensInput) -> GeminiCountTok request: Final = _validated_request(raw) if isinstance(request, InvalidAnthropicRequest): return request - openai_request, _ = LiteLLMAnthropicMessagesAdapter().translate_anthropic_to_openai( - request, custom_llm_provider="gemini" - ) + try: + openai_request, _ = LiteLLMAnthropicMessagesAdapter().translate_anthropic_to_openai( + request, custom_llm_provider="gemini" + ) + except (KeyError, TypeError, ValueError) as e: + return InvalidAnthropicRequest(message=f"Invalid Anthropic Messages request: {e!r}") system_instruction, remaining_messages = _transform_system_message( supports_system_message=True, messages=openai_request["messages"] ) diff --git a/tests/test_litellm/llms/gemini/count_tokens/test_transformation.py b/tests/test_litellm/llms/gemini/count_tokens/test_transformation.py index 56d3909c186..8a7fa6a5bef 100644 --- a/tests/test_litellm/llms/gemini/count_tokens/test_transformation.py +++ b/tests/test_litellm/llms/gemini/count_tokens/test_transformation.py @@ -138,3 +138,12 @@ def test_tools_that_are_not_a_list_are_rejected_as_invalid(): assert isinstance(result, InvalidAnthropicRequest), result assert "tools" in result.message, result.message + + +def test_message_without_a_role_is_rejected_as_invalid_not_raised(): + result = build_count_tokens_payload( + {"model": MODEL, "messages": [{"content": "hi"}], "system": None, "tools": None} + ) + + assert isinstance(result, InvalidAnthropicRequest), result + assert "role" in result.message, result.message