From 696a042e9c6ef34292cfbc7e45b9f91b4042aba8 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 25 Jul 2026 00:06:13 +0000 Subject: [PATCH] fix(ollama): handle dict reasoning_effort and stop forcing think on unsupported efforts --- litellm/llms/ollama/chat/transformation.py | 8 ++- .../ollama/test_ollama_chat_transformation.py | 59 +++++++++++++++++++ 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/litellm/llms/ollama/chat/transformation.py b/litellm/llms/ollama/chat/transformation.py index 694f8cdd6c2..d2da7c50f64 100644 --- a/litellm/llms/ollama/chat/transformation.py +++ b/litellm/llms/ollama/chat/transformation.py @@ -178,10 +178,12 @@ class OllamaChatConfig(BaseConfig): if value.get("json_schema") and value["json_schema"].get("schema"): optional_params["format"] = value["json_schema"]["schema"] if param == "reasoning_effort" and value is not None: + effort = value.get("effort") if isinstance(value, dict) else value if model.startswith("gpt-oss"): - optional_params["think"] = value - else: - optional_params["think"] = value in {"low", "medium", "high"} + if effort is not None: + optional_params["think"] = effort + elif effort in {"low", "medium", "high"}: + optional_params["think"] = True ### FUNCTION CALLING LOGIC ### # Ollama 0.4+ supports native tool calling - pass tools directly # and let Ollama handle model capability detection diff --git a/tests/test_litellm/llms/ollama/test_ollama_chat_transformation.py b/tests/test_litellm/llms/ollama/test_ollama_chat_transformation.py index 906c51d8064..d08f7ca976b 100644 --- a/tests/test_litellm/llms/ollama/test_ollama_chat_transformation.py +++ b/tests/test_litellm/llms/ollama/test_ollama_chat_transformation.py @@ -906,3 +906,62 @@ class TestOllamaToolCallTransformation: assert tool_msg["content"] == "Sunny, 72°F" assert "tool_call_id" in tool_msg, "tool_call_id must be forwarded to Ollama" assert tool_msg["tool_call_id"] == "call_abc123" + + +class TestOllamaReasoningEffortMapping: + """ + Issue: https://github.com/BerriAI/litellm/issues/34574 + """ + + def test_dict_reasoning_effort_does_not_crash(self): + optional_params = get_optional_params( + model="ollama_chat/qwen3:14b", + reasoning_effort={"effort": "medium", "summary": "auto"}, + custom_llm_provider="ollama_chat", + ) + + assert optional_params["think"] is True + + def test_dict_reasoning_effort_without_effort_key_is_ignored(self): + optional_params = get_optional_params( + model="ollama_chat/qwen3:14b", + reasoning_effort={"summary": "auto"}, + custom_llm_provider="ollama_chat", + ) + + assert "think" not in optional_params + + def test_unsupported_effort_does_not_force_thinking(self): + optional_params = get_optional_params( + model="ollama_chat/qwen3-coder:30b", + reasoning_effort="none", + custom_llm_provider="ollama_chat", + ) + + assert "think" not in optional_params + + def test_gpt_oss_forwards_effort_level(self): + config = OllamaChatConfig() + + assert config.map_openai_params( + non_default_params={"reasoning_effort": {"effort": "high"}}, + optional_params={}, + model="gpt-oss:20b", + drop_params=False, + ) == {"think": "high"} + + assert config.map_openai_params( + non_default_params={"reasoning_effort": "low"}, + optional_params={}, + model="gpt-oss:20b", + drop_params=False, + ) == {"think": "low"} + + def test_string_effort_enables_thinking(self): + optional_params = get_optional_params( + model="ollama_chat/qwen3:14b", + reasoning_effort="high", + custom_llm_provider="ollama_chat", + ) + + assert optional_params["think"] is True