diff --git a/litellm/llms/ollama/chat/transformation.py b/litellm/llms/ollama/chat/transformation.py index 10bf3736e64..fb2acc94122 100644 --- a/litellm/llms/ollama/chat/transformation.py +++ b/litellm/llms/ollama/chat/transformation.py @@ -171,7 +171,7 @@ 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: Final = value.get("effort") if isinstance(value, dict) else value + effort: Final = value.get("effort") if isinstance(value, Mapping) else value if effort is not None: if model.startswith("gpt-oss"): optional_params["think"] = effort diff --git a/litellm/llms/ollama/completion/transformation.py b/litellm/llms/ollama/completion/transformation.py index e8dfb209b19..7d2bb726f5a 100644 --- a/litellm/llms/ollama/completion/transformation.py +++ b/litellm/llms/ollama/completion/transformation.py @@ -1,6 +1,6 @@ import json import time -from collections.abc import AsyncIterator, Iterator +from collections.abc import AsyncIterator, Iterator, Mapping from typing import TYPE_CHECKING, Any, Final from httpx._models import Headers, Response @@ -215,7 +215,7 @@ class OllamaConfig(BaseConfig): elif param == "stop": optional_params["stop"] = value elif param == "reasoning_effort" and value is not None: - effort: Final = value.get("effort") if isinstance(value, dict) else value + effort: Final = value.get("effort") if isinstance(value, Mapping) else value if effort is not None: if model.startswith("gpt-oss"): optional_params["think"] = effort diff --git a/tests/unit/llms/ollama/test_ollama_chat_transformation.py b/tests/unit/llms/ollama/test_ollama_chat_transformation.py index 58595502357..d1a9fe6aaa8 100644 --- a/tests/unit/llms/ollama/test_ollama_chat_transformation.py +++ b/tests/unit/llms/ollama/test_ollama_chat_transformation.py @@ -1,6 +1,8 @@ import inspect import os import sys +from collections.abc import Mapping +from types import MappingProxyType from typing import Final, cast import pytest @@ -1000,11 +1002,12 @@ class TestOllamaChatReasoningEffort: ("none", False), ({"effort": "medium"}, True), ({"effort": "medium", "summary": "auto"}, True), + (MappingProxyType({"effort": "medium", "summary": "auto"}), True), ({"effort": "none", "summary": "detailed"}, False), ], ) def test_reasoning_effort_string_or_dict_maps_to_think( - self, reasoning_effort: str | dict[str, str], expected_think: bool + self, reasoning_effort: str | Mapping[str, str], expected_think: bool ) -> None: optional_params: Final = get_optional_params( model="ollama_chat/qwen3:8b", diff --git a/tests/unit/llms/ollama/test_ollama_completion_transformation.py b/tests/unit/llms/ollama/test_ollama_completion_transformation.py index e51e5979deb..531cd190e3d 100644 --- a/tests/unit/llms/ollama/test_ollama_completion_transformation.py +++ b/tests/unit/llms/ollama/test_ollama_completion_transformation.py @@ -2,6 +2,8 @@ import base64 import io import json import sys +from collections.abc import Mapping +from types import MappingProxyType from typing import Final from litellm._uuid import uuid from unittest.mock import MagicMock, patch @@ -784,11 +786,12 @@ class TestOllamaConfigReasoningEffort: [ ("medium", True), ({"effort": "medium", "summary": "auto"}, True), + (MappingProxyType({"effort": "medium", "summary": "auto"}), True), ({"effort": "none"}, False), ], ) def test_reasoning_effort_string_or_dict_maps_to_think( - self, reasoning_effort: str | dict[str, str], expected_think: bool + self, reasoning_effort: str | Mapping[str, str], expected_think: bool ) -> None: optional_params: Final = OllamaConfig().map_openai_params( non_default_params={"reasoning_effort": reasoning_effort},