From 2fedd394ebb2880f3ea6e73917b361f598cf31e8 Mon Sep 17 00:00:00 2001 From: stevejaker Date: Tue, 10 Mar 2026 11:09:21 -0600 Subject: [PATCH] fix: address Greptile review comments for message transformation - Fix _transform_messages signature to match parent class (add model, is_async params) - Handle list-typed content in _convert_assistant_tool_message - Handle list-typed and non-string content in _convert_tool_messages_to_user_message - Update test calls to use new signature with model parameter Co-Authored-By: Claude Opus 4.6 --- litellm/llms/snowflake/chat/transformation.py | 22 ++++++++++++++----- .../test_snowflake_chat_transformation.py | 4 ++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/litellm/llms/snowflake/chat/transformation.py b/litellm/llms/snowflake/chat/transformation.py index fd018bde2d0..2e6a5af63fd 100644 --- a/litellm/llms/snowflake/chat/transformation.py +++ b/litellm/llms/snowflake/chat/transformation.py @@ -155,8 +155,8 @@ class SnowflakeConfig(SnowflakeBaseConfig, OpenAIGPTConfig): return f"{api_base}/cortex/inference:complete" def _transform_messages( - self, messages: List[AllMessageValues] - ) -> List[Dict[str, Any]]: + self, messages: List[AllMessageValues], model: str, is_async: bool = False + ) -> List[AllMessageValues]: """ Transform OpenAI messages to Snowflake format. @@ -214,7 +214,7 @@ class SnowflakeConfig(SnowflakeBaseConfig, OpenAIGPTConfig): ) ) - return transformed + return transformed # type: ignore def _convert_assistant_tool_message( self, message: Dict[str, Any] @@ -242,6 +242,11 @@ class SnowflakeConfig(SnowflakeBaseConfig, OpenAIGPTConfig): # Add text content if present text_content = message.get("content") + if isinstance(text_content, list): + # Flatten multipart content to a single string + text_content = " ".join( + part.get("text", "") for part in text_content if isinstance(part, dict) + ) if text_content: content_list.append({"type": "text", "text": text_content}) @@ -298,10 +303,17 @@ class SnowflakeConfig(SnowflakeBaseConfig, OpenAIGPTConfig): function = tool_call.get("function", {}) function_name = function.get("name", "") - # Get content - could be string or None + # Get content - could be string, list, or None content = tool_msg.get("content") if content is None: content = "null" + elif isinstance(content, list): + # Flatten OpenAI multipart tool content to a plain string + content = " ".join( + part.get("text", "") for part in content if isinstance(part, dict) + ) + elif not isinstance(content, str): + content = str(content) content_list.append({ "type": "tool_results", @@ -426,7 +438,7 @@ class SnowflakeConfig(SnowflakeBaseConfig, OpenAIGPTConfig): # Transform messages from OpenAI format to Snowflake format # This handles role: "tool" -> role: "user" with tool_results content_list # and assistant messages with tool_calls -> content_list with tool_use blocks - transformed_messages = self._transform_messages(messages) + transformed_messages = self._transform_messages(messages, model=model) return { "model": model, 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 5ed136c6acf..b10cb27f6d9 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 @@ -366,7 +366,7 @@ class TestSnowflakeToolTransformation: }, ] - transformed = config._transform_messages(messages) + transformed = config._transform_messages(messages, model="claude-3-5-sonnet") # Should have 3 messages assert len(transformed) == 3 @@ -427,7 +427,7 @@ class TestSnowflakeToolTransformation: {"role": "tool", "tool_call_id": "call_2", "content": "55°F"}, ] - transformed = config._transform_messages(messages) + transformed = config._transform_messages(messages, model="claude-3-5-sonnet") # Should have 3 messages (user, assistant, combined tool results) assert len(transformed) == 3