diff --git a/litellm/router_strategy/tag_based_routing.py b/litellm/router_strategy/tag_based_routing.py index 8094b5d86ac..1384c7aea00 100644 --- a/litellm/router_strategy/tag_based_routing.py +++ b/litellm/router_strategy/tag_based_routing.py @@ -136,10 +136,10 @@ def _get_tags_from_request_kwargs( if request_kwargs is None: return [] if metadata_variable_name in request_kwargs: - metadata = request_kwargs[metadata_variable_name] + metadata = request_kwargs[metadata_variable_name] or {} return metadata.get("tags", []) elif "litellm_params" in request_kwargs: - litellm_params = request_kwargs["litellm_params"] - _metadata = litellm_params.get(metadata_variable_name, {}) + litellm_params = request_kwargs["litellm_params"] or {} + _metadata = litellm_params.get(metadata_variable_name, {}) or {} return _metadata.get("tags", []) return [] diff --git a/tests/test_litellm/router_strategy/test_router_tag_routing.py b/tests/test_litellm/router_strategy/test_router_tag_routing.py index e78a16c6212..a3e722eeb85 100644 --- a/tests/test_litellm/router_strategy/test_router_tag_routing.py +++ b/tests/test_litellm/router_strategy/test_router_tag_routing.py @@ -385,4 +385,50 @@ async def test_router_free_paid_tier_with_responses_api(): response_extra_info = response._hidden_params print("response_extra_info: ", response_extra_info) - assert response_extra_info["model_id"] == "very-expensive-model" \ No newline at end of file + assert response_extra_info["model_id"] == "very-expensive-model" + +def test_get_tags_from_request_kwargs_none(): + from litellm.router_strategy.tag_based_routing import _get_tags_from_request_kwargs + + # None request kwargs should safely return empty list + assert _get_tags_from_request_kwargs(None) == [] + + +def test_get_tags_from_request_kwargs_various_inputs(): + from litellm.router_strategy.tag_based_routing import _get_tags_from_request_kwargs + + # Direct "metadata" path + assert _get_tags_from_request_kwargs({"metadata": {"tags": ["free"]}}) == ["free"] + assert _get_tags_from_request_kwargs({"metadata": {"tags": []}}) == [] + assert _get_tags_from_request_kwargs({"metadata": {"tags": None}}) == [] + assert _get_tags_from_request_kwargs({"metadata": {}}) == [] + assert _get_tags_from_request_kwargs({"metadata": None}) == [] + + # Indirect via "litellm_params" - metadata inside + assert ( + _get_tags_from_request_kwargs( + {"litellm_params": {"metadata": {"tags": ["paid"]}}} + ) + == ["paid"] + ) + assert _get_tags_from_request_kwargs({"litellm_params": {"metadata": None}}) == [] + assert _get_tags_from_request_kwargs({"litellm_params": {}}) == [] + + # Alternate metadata variable name: "litellm_metadata" + assert ( + _get_tags_from_request_kwargs( + {"litellm_metadata": {"tags": ["alt"]}}, + metadata_variable_name="litellm_metadata", + ) + == ["alt"] + ) + assert ( + _get_tags_from_request_kwargs( + {"litellm_params": {"litellm_metadata": {"tags": ["nested-alt"]}}}, + metadata_variable_name="litellm_metadata", + ) + == ["nested-alt"] + ) + + # No relevant keys present + assert _get_tags_from_request_kwargs({"foo": "bar"}) == [] \ No newline at end of file