diff --git a/litellm/llms/ollama/chat/transformation.py b/litellm/llms/ollama/chat/transformation.py index 168b562b358..0eb8ab71fe2 100644 --- a/litellm/llms/ollama/chat/transformation.py +++ b/litellm/llms/ollama/chat/transformation.py @@ -165,8 +165,8 @@ class OllamaChatConfig(BaseConfig): optional_params["top_p"] = value if param == "frequency_penalty": optional_params["repeat_penalty"] = value - if param == "stop": - optional_params["stop"] = value + if param == "stop" and value != "": + optional_params["stop"] = [value] if isinstance(value, str) else value if param == "response_format" and isinstance(value, dict) and value.get("type") == "json_object": optional_params["format"] = "json" if param == "response_format" and isinstance(value, dict) and value.get("type") == "json_schema": diff --git a/litellm/llms/ollama/completion/transformation.py b/litellm/llms/ollama/completion/transformation.py index 6dbcb050e11..33faa2bf696 100644 --- a/litellm/llms/ollama/completion/transformation.py +++ b/litellm/llms/ollama/completion/transformation.py @@ -247,8 +247,8 @@ class OllamaConfig(BaseConfig): optional_params["top_p"] = value elif param == "frequency_penalty": optional_params["frequency_penalty"] = value - elif param == "stop": - optional_params["stop"] = value + elif param == "stop" and value != "": + optional_params["stop"] = [value] if isinstance(value, str) else value elif param == "reasoning_effort" and value is not None: optional_params["think"] = ollama_think(model, OPAQUE_VALUE.validate_python(value)) elif param == "response_format" and isinstance(value, dict): diff --git a/tests/unit/llms/ollama/test_ollama_chat_transformation.py b/tests/unit/llms/ollama/test_ollama_chat_transformation.py index 6a80f29ac43..8d5b9452605 100644 --- a/tests/unit/llms/ollama/test_ollama_chat_transformation.py +++ b/tests/unit/llms/ollama/test_ollama_chat_transformation.py @@ -29,6 +29,26 @@ from litellm.types.utils import Choices, EmbeddingResponse, Message, ModelRespon from unittest import mock +@pytest.mark.parametrize( + "stop, expected", + [ + ("END", ["END"]), + ("", None), + (["END", "STOP"], ["END", "STOP"]), + ([""], [""]), + ([], []), + ], +) +def test_stop_is_sent_as_an_array(stop: str | list[str], expected: list[str] | None) -> None: + optional_params: Final = get_optional_params( + model="test-model", custom_llm_provider="ollama_chat", stop=stop + ) + if expected is None: + assert "stop" not in optional_params + else: + assert optional_params["stop"] == expected + + class TestEvent(BaseModel): name: str value: int diff --git a/tests/unit/llms/ollama/test_ollama_completion_transformation.py b/tests/unit/llms/ollama/test_ollama_completion_transformation.py index edea39bb10c..9818641f933 100644 --- a/tests/unit/llms/ollama/test_ollama_completion_transformation.py +++ b/tests/unit/llms/ollama/test_ollama_completion_transformation.py @@ -21,6 +21,26 @@ from litellm.llms.ollama.completion.transformation import ( from litellm.types.utils import Message, ModelResponse, ModelResponseStream +@pytest.mark.parametrize( + "stop, expected", + [ + ("END", ["END"]), + ("", None), + (["END", "STOP"], ["END", "STOP"]), + ([""], [""]), + ([], []), + ], +) +def test_stop_is_sent_as_an_array(stop: str | list[str], expected: list[str] | None) -> None: + optional_params: Final = litellm.utils.get_optional_params( + model="test-model", custom_llm_provider="ollama", stop=stop + ) + if expected is None: + assert "stop" not in optional_params + else: + assert optional_params["stop"] == expected + + class TestOllamaConfig: def test_transform_response_standard(self): # Initialize config