diff --git a/litellm/llms/snowflake/chat/transformation.py b/litellm/llms/snowflake/chat/transformation.py index c64fc583edc..0a68805ba40 100644 --- a/litellm/llms/snowflake/chat/transformation.py +++ b/litellm/llms/snowflake/chat/transformation.py @@ -461,7 +461,12 @@ class SnowflakeConfig(SnowflakeBaseConfig, OpenAIGPTConfig): "required": {"type": "any"}, "none": {"type": "none"}, } - return mapping.get(tool_choice, {"type": "auto"}) + if tool_choice not in mapping: + raise ValueError( + "Unsupported tool_choice value for Snowflake Claude model: " + f"{tool_choice!r}. Expected one of: auto, required, none." + ) + return mapping[tool_choice] elif isinstance(tool_choice, dict): if tool_choice.get("type") == "function": func: Final = tool_choice.get("function", {}) diff --git a/tests/test_litellm/llms/snowflake/chat/test_snowflake_chat_transformation.py b/tests/test_litellm/llms/snowflake/chat/test_snowflake_chat_transformation.py index 25a961c3413..c37827d4ef8 100644 --- a/tests/test_litellm/llms/snowflake/chat/test_snowflake_chat_transformation.py +++ b/tests/test_litellm/llms/snowflake/chat/test_snowflake_chat_transformation.py @@ -117,6 +117,21 @@ class TestSnowflakeToolTransformation: f"tool_choice='{value}' should pass through unchanged, got {transformed_request['tool_choice']}" ) + def test_claude_rejects_invalid_string_tool_choice(self): + """ + Test that invalid string tool_choice values are not silently downgraded to auto. + """ + config = SnowflakeConfig() + + with pytest.raises(ValueError, match="Unsupported tool_choice value"): + config.transform_request( + model="snowflake/claude-sonnet-4-5", + messages=[{"role": "user", "content": "Test"}], + optional_params={"tool_choice": "requried"}, + litellm_params={}, + headers={}, + ) + def test_transform_response_with_tool_calls(self): """ Test that standard OpenAI tool_calls response format is parsed correctly.