From 42a80d5ade1e3ae832ec740f6794bde0e55dae98 Mon Sep 17 00:00:00 2001 From: Abdullah Alqahtani <61029571+anqorithm@users.noreply.github.com> Date: Tue, 3 Nov 2026 01:47:49 +0100 Subject: [PATCH] fix(ollama): send generate keep_alive at the request root --- .../llms/ollama/completion/transformation.py | 4 +++ .../test_ollama_completion_transformation.py | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/litellm/llms/ollama/completion/transformation.py b/litellm/llms/ollama/completion/transformation.py index 6dbcb050e11..430babd507c 100644 --- a/litellm/llms/ollama/completion/transformation.py +++ b/litellm/llms/ollama/completion/transformation.py @@ -462,6 +462,10 @@ class OllamaConfig(BaseConfig): "stream": stream, } + if "keep_alive" in optional_params: + if optional_params["keep_alive"] is not None: + data["keep_alive"] = optional_params["keep_alive"] + del optional_params["keep_alive"] # rebind-ok: remove the promoted field from outgoing generation options if format is not None: data["format"] = format if images is not None: diff --git a/tests/unit/llms/ollama/test_ollama_completion_transformation.py b/tests/unit/llms/ollama/test_ollama_completion_transformation.py index 26addf1b24c..c65bae956bc 100644 --- a/tests/unit/llms/ollama/test_ollama_completion_transformation.py +++ b/tests/unit/llms/ollama/test_ollama_completion_transformation.py @@ -1100,3 +1100,28 @@ def test_reasoning_effort_ollama_honors_does_not_warn( assert result["think"] == think assert _reasoning_effort_warnings(caplog) == () + + +@pytest.mark.parametrize("keep_alive", (0, "0", "5m", -1)) +def test_generate_request_sends_keep_alive_outside_generation_options(keep_alive: int | str) -> None: + request: Final = OllamaConfig().transform_request( + model="test-model", + messages=[{"role": "user", "content": "hello"}], + optional_params={"keep_alive": keep_alive, "temperature": 0.25}, + litellm_params={"text_completion": True}, + headers={}, + ) + assert request["keep_alive"] == keep_alive + assert request["options"] == {"temperature": 0.25} + + +def test_generate_request_omits_an_unset_keep_alive() -> None: + request: Final = OllamaConfig().transform_request( + model="test-model", + messages=[{"role": "user", "content": "hello"}], + optional_params={"keep_alive": None, "temperature": 0.25}, + litellm_params={"text_completion": True}, + headers={}, + ) + assert "keep_alive" not in request + assert request["options"] == {"temperature": 0.25}